微信扫码
添加专属顾问
我要投稿
探索AI智能体如何通过LangChain和MCP实现数据与工具的高效集成。 核心内容: 1. 模型上下文协议(MCP)的背景与意义 2. LangChain集成MCP的实操演示步骤 3. 环境准备、依赖安装及MCP Server编写指南
MCP(Model Context Protocol) 是由 Anthropic 推出的开源协议,旨在为大型语言模型(LLM)提供安全、可解释、可扩展的外部数据与工具集成方案。
在基于大语言模型构建应用时,一个核心痛点是 数据与工具的接入困难。模型虽然能力强大,但通常处于“沙盒”状态,无法直接访问外部环境。
为此,RAG
(检索增强生成)、微调、插件等方案陆续诞生。而 MCP
的目标正是统一接口协议,以便标准化集成上下文、工具、服务与数据源。
参考文章:
LLM
与外部系统的通信AI
工具市场”可以将
MCP
看作AI
世界的“软件版USB-C
”。
官方资源:
MCP
协议简介:https://modelcontext.org/
GitHub
示例项目:https://github.com/modelcontextprotocol/servers
本节将通过实操演示,介绍如何将
LangChain
与MCP
工具集成,打造一个拥有算术能力的AI
智能体。
注意:示例来自https://github.com/langchain-ai/langchain-mcp-adapters
。
步骤 | 内容 |
---|---|
Python 虚拟环境 | |
MCP Server (数学工具) | |
LangChain 智能体 | |
python3 -m venv MCP_Demosource MCP_Demo/bin/activate
安装依赖:
pip install langchain-mcp-adapters langgraph langchain-openaiexport OPENAI_API_KEY=<your_api_key>
请将文本<your_api_key>
替换为您的OpenAI API
密钥。
创建 math_server.py
文件:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Math")
def add(a: int, b: int) -> int:
return a + b
def multiply(a: int, b: int) -> int:
return a * b
if __name__ == "__main__":
mcp.run(transport="stdio")
运行服务器:
python3 math_server.py
创建 client.py
:
from mcp import ClientSession, 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 import ChatOpenAI
import asyncio
model = ChatOpenAI(model="gpt-4o")
server_params = StdioServerParameters(
command="python",
args=["math_server.py"], # 替换为绝对路径
)
async def run_agent():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await load_mcp_tools(session)
agent = create_react_agent(model, tools)
result = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})
return result
if __name__ == "__main__":
print(asyncio.run(run_agent()))
运行客户端:
python3 client.py
客户端输出如下:
{
'messages': [
# 1. 用户原始提问
HumanMessage(
content="what's (3 + 5) x 12?",
id='87a8b6b6-...', # 消息唯一标识
metadata={...}
),
# 2. AI首次响应(工具调用)
AIMessage(
content='',
tool_calls=[
{
'name': 'add', # 第一个工具调用:加法
'args': {'a':3, 'b':5}, # 参数
'id': 'call_1eyRzR...' # 工具调用ID
},
{
'name': 'multiply', # 第二个工具调用:乘法
'args': {'a':8, 'b':12},
'id': 'call_q82CX...'
}
],
token_usage={...}, # 本次调用的Token消耗
finish_reason='tool_calls' # 终止原因:触发了工具调用
),
# 3. 工具执行结果返回
ToolMessage(
content='8', # add工具的执行结果
name='add', # 对应工具名称
tool_call_id='call_1eyRzR...' # 关联的工具调用ID
),
ToolMessage(
content='96', # multiply工具的执行结果
name='multiply',
tool_call_id='call_q82CX...'
),
# 4. AI最终响应
AIMessage(
content='content=‘The result of (3 + 5) × 12 is 96.', # 最终自然语言答案
finish_reason='stop', # 正常终止
token_usage={ # 总Token消耗
'input_tokens': 143,
'output_tokens': 22,
'total_tokens': 165
}
)
]
}
用户输入阶段
HumanMessage
记录原始问题:"3加5乘12等于多少?"ID
、响应元数据等AI推理阶段
add
工具计算3+5
multiply
工具计算8x12
AIMessage
显示分步思考过程:finish_reason: tool_calls
表示需要等待工具执行结果工具执行阶段
add
工具返回8
(对应3+5)multiply
工具返回96
(对应8x12)ToolMessage
包含工具执行结果:tool_call_id
关联到对应的工具调用请求最终响应阶段
AIMessage
生成自然语言答案finish_reason: stop
表示正常结束关键字段说明
字段 | 说明 |
---|---|
token_usage | |
system_fingerprint | |
tool_call_id | |
finish_reason |
Token 使用情况示例:
阶段 | 输入 | 输出令牌 | 总计 |
---|---|---|---|
总计 |
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-10-10
2024-07-13
2024-04-08
2024-06-03
2024-09-04
2024-08-18
2024-04-08
2024-03-28
2024-06-24
2024-07-10
2025-03-22
2025-03-22
2025-03-15
2025-02-05
2024-12-02
2024-11-25
2024-10-30
2024-10-11