使用 LangChain 与 MCP集成

大模型向量数据库云存储

MCP 的出现源于这样一个关键问题:大型语言模型(LLM)应用无法与外部数据源和工具进行连接,形成了隔离运行 的限制。

在基于 LLM 的应用中,数据传递 一直是一个核心关注点。即:如何将数据送达 LLM 以供其推理使用。这是 RAG(检索增强生成)、微调(Fine-tuning)方法,以及 MCP 协议本身所致力于解决的问题。

MCP 的核心目的,是标准化 LLM 应用与多种系统之间的连接方式 ,正如下面这张图所示:

picture.image


消除定制化集成(Eliminating Custom Integration)

在构建 AI 智能体的过程中,存在一个关键挑战:如何将数据传递给 AI 智能体。 换句话说,即如何将 AI 智能体 / 基于 LLM 的应用集成到外部数据源 中。

为了解决这一问题,人们尝试了多种方式来实现尽可能无缝的集成 ,包括:使用图形化界面(GUI),使用网页浏览器,使用网页搜索能力等手段。这些方式各有优劣 ,虽然它们在某些场景下取得了一定效果,但也存在明显的局限性。

picture.image

MCP 有望成为一个通用接口,你可以把它看作是 AI 领域中虚拟 / 软件版本的 USB-C。

它能够在 LLM / AI 智能体 与外部资源之间,实现无缝、安全且可扩展的数据交换。

MCP 采用客户端-服务器架构,其中 MCP 主机(AI 应用)与 MCP 服务器(数据 / 工具提供方)进行通信。

开发者可以使用 MCP 构建可复用的、模块化的连接器。同时,已有为主流平台构建的预设服务器,正在形成一个由社区驱动的生态系统。

MCP 的开源特性鼓励创新,开发者可以在不牺牲安全性的前提下扩展其功能,比如借助细粒度权限控制等机制来保障系统安全。

最终,MCP 的目标是将 AI 智能体从孤立的聊天机器人,转变为具备上下文感知能力、可互操作的系统,并与数字环境深度集成。

📌 延伸阅读:
AI Agents Are Much More Vulnerable Than LLM-Based Applications[1]
研究显示,相比于独立的 LLM,AI 智能体更容易受到攻击……


分步操作指南(Step by Step Instructions)

Anthropic 的 Model Context Protocol(MCP )是一个开源协议 ,用于将 LLM 与上下文、工具和提示词连接起来。它支持越来越多的 服务器(servers) ,用于连接各种工具或数据源。

在本指南中,我们将演示如何将 任意 MCP 服务器 连接到 LangGraph 智能体 ,并使用 MCP 工具。

如果你跟我一样,哪怕只是让一个原型跑起来,也会带来极大的清晰感和理解力 —— 至少在我自己的脑海中是这样的。

第一步:打开终端应用

在你的电脑上打开 Terminal(终端)应用 。下面是如何在 MacBook 上找到它的示意图:

picture.image

第二步:创建两个终端标签页(Tabs)

在终端窗口中,创建两个标签页

•一个标签页用来运行 服务器端(MCP Server) •另一个标签页用来运行 客户端(MCP Client 或 LangGraph Agent)

✅ 接下来我们将在这两个终端中分别启动所需组件,并一步步连接它们。

picture.image

第三步:创建虚拟环境并运行代码

在安装和运行代码前,创建虚拟环境 是一个良好的实践。
下面的命令将创建一个名为 MCP\_Demo 的虚拟环境:

  
python3 -m venv MCP\_Demo

然后运行以下命令以激活(进入)该虚拟环境:

  
source MCP\_Demo/bin/activate

你会看到命令提示符前出现 (MCP_Demo),表示你已成功进入虚拟环境。

依次运行以下命令:

  
pip install langchain-mcp-adapters  
pip install langchain-mcp-adapters  
export OPENAI_API_KEY=<your_api_key>

请将 your\_api\_key 替换为你自己的 OpenAI API 密钥,例如:

  
export OPENAI\_API\_KEY=sk-xxxxxxxxxxxxxxxxxxxxx

在其中一个终端标签页中,创建一个名为vim server.py的文本文件。

然后将以下 Python 代码粘贴到文件中:

  
# math_server.py  
from mcp.server.fastmcp importFastMCP  
  
# 初始化一个 MCP 服务器,命名为 "Math"  
mcp =FastMCP("Math")  
  
# 定义一个 MCP 工具:加法  
@mcp.tool()  
def add(a:int, b:int)->int:  
"""两个数字相加"""  
return a + b  
  
# 定义另一个 MCP 工具:乘法  
@mcp.tool()  
def multiply(a:int, b:int)->int:  
"""两个数字相乘"""  
return a * b  
  
# 启动服务器,使用 stdio 作为通信方式  
if __name__ =="__main__":  
    mcp.run(transport="stdio")

关闭文本文件后,使用以下命令启动并运行服务器:

  
python3 math\_server.py

你不会看到任何输出,终端窗口看起来将如下所示:

picture.image

第四步:创建并运行客户端(Client)

当 MCP 服务器正在一个终端标签页中运行时,切换到另一个终端标签页

在该终端中创建一个新的文件来粘贴客户端代码:vim client.py

将以下代码粘贴到文件中:

  
# 创建 stdio 连接的服务器参数  
from mcp importClientSession,StdioServerParameters  
from mcp.client.stdio import stdio_client  
from langchain_mcp_adapters.tools import load_mcp_tools  
from langgraph.prebuilt import create_react_agent  
from langchain_openai importChatOpenAI  
import asyncio  
  
# 初始化 OpenAI 模型(这里使用 gpt-4o)  
model =ChatOpenAI(model="gpt-4o")  
  
# 设置 MCP Server 参数(通过标准输入输出进行通信)  
server_params =StdioServerParameters(  
    command="python",  
# 请将此处路径替换为你 math_server.py 文件的绝对路径  
    args=["math_server.py"],  
)  
  
# 定义运行智能体的异步函数  
async def run_agent():  
    async with stdio_client(server_params)as(read, write):  
        async withClientSession(read, write)as session:  
# 初始化连接  
            await session.initialize()  
  
# 加载 MCP 工具  
            tools = await load_mcp_tools(session)  
  
# 创建并运行智能体  
            agent = create_react_agent(model, tools)  
            agent_response = await agent.ainvoke({"messages":"what's (3 + 5) x 12?"})  
return agent_response  
  
# 执行异步函数  
if __name__ =="__main__":  
    result = asyncio.run(run_agent())  
print(result)

在第二个终端标签页中运行客户端命令:python3 client.py

该客户端会执行一次,然后结束,输出如下内容(示例):

  
{'messages':  
[HumanMessage(content=“(3+5) x 12等于多少?" ,   
additional_kwargs={}, response_metadata={},  
id='87a8b6b6-9add-4da7-aea5-1b197c0fc0f5'),  
AIMessage(content='',  
additional_kwargs={'tool_calls':[{'id':'call_1eyRzR7WpKzhMXG4ZFQAJtUD',  
  
'function':  
{'arguments':'{"a": 3, "b": 5}','name':'add'},  
'type':'function'},  
{'id':'call_q82CX807NC3T6nHMrhoHT46E',  
  
'function':  
{'arguments':'{"a": 8, "b": 12}','name':'multiply'},  
'type':'function'}],  
  
'refusal':None},  
response_metadata={'token_usage':  
{'completion_tokens':51,  
'prompt_tokens':77,  
'total_tokens':128,  
  
'completion_tokens_details':  
{'accepted_prediction_tokens':0,  
'audio_tokens':0,  
'reasoning_tokens':0,  
'rejected_prediction_tokens':0},  
  
'prompt_tokens_details':  
{'audio_tokens':0,  
'cached_tokens':0}},  
  
'model_name':'gpt-4o-2024-08-06',  
'system_fingerprint':'fp_eb9dce56a8',  
'finish_reason':'tool_calls',  
'logprobs':None},  
  
id='run-13c01640-f92b-48b7-9340-c2ad983eb1c8-0',  
tool_calls=[{'name':'add','args':{'a':3,'b':5},  
'id':'call_1eyRzR7WpKzhMXG4ZFQAJtUD',  
'type':'tool_call'},{'name':'multiply',  
'args':{'a':8,'b':12},  
'id':'call_q82CX807NC3T6nHMrhoHT46E',  
'type':'tool_call'}],  
  
usage_metadata={'input_tokens':77,  
'output_tokens':51,  
'total_tokens':128,  
'input_token_details':{'audio':0,  
'cache_read':0},  
  
'output_token_details':{'audio':0,  
'reasoning':0}}),  
ToolMessage(content='8',  
name='add',  
id='f8e0aba5-7a62-44c6-92a3-5fe3b07c9bd5',  
tool_call_id='call_1eyRzR7WpKzhMXG4ZFQAJtUD'),  
  
ToolMessage(content='96',  
name='multiply',  
id='66b9bbd9-b99a-402f-b26c-df83f5a69fa3',  
tool_call_id='call_q82CX807NC3T6nHMrhoHT46E'),  
AIMessage(content='The result of \\((3 + 5) \\times 12\\) is 96.',  
  
additional_kwargs={'refusal':None},  
  
response_metadata={'token_usage':{'completion_tokens':22,  
'prompt_tokens':143,  
'total_tokens':165,  
'completion_tokens_details':{'accepted_prediction_tokens':0,  
'audio_tokens':0,  
'reasoning_tokens':0,  
'rejected_prediction_tokens':0},  
  
'prompt_tokens_details':{'audio_tokens':0,  
'cached_tokens':0}},  
  
'model_name':'gpt-4o-2024-08-06',  
'system_fingerprint':'fp_eb9dce56a8',  
'finish_reason':'stop',  
'logprobs':None},  
  
id='run-6c00a336-7d52-4917-9186-b282a5984b10-0',  
usage_metadata={'input_tokens':143,  
'output_tokens':22,  
'total_tokens':165,  
'input_token_details':{'audio':0,'cache_read':0},  
  
'output_token_details':{'audio':0,  
'reasoning':0}})]}

🧩 你已完成一个完整的 LangChain + MCP + LangGraph 智能体原型搭建!


✅ 总结(Finally)

MCP 是一种便捷的方式,可将 AI 智能体与提供上下文和记忆能力的信息与服务集成起来。

更多信息

山行AI希望本文对你有所帮助,由笔者翻译整理自:https://cobusgreyling.medium.com/using-langchain-with-model-context-protocol-mcp-e89b87ee3c4c,如对你有帮助,请帮忙点赞、转发、评论,谢谢!

References

[1] AI Agents Are Much More Vulnerable Than LLM-Based Applications: https://cobusgreyling.medium.com

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
CV 技术在视频创作中的应用
本次演讲将介绍在拍摄、编辑等场景,我们如何利用 AI 技术赋能创作者;以及基于这些场景,字节跳动积累的领先技术能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论