Langgraph调用MCP封装的极为简洁,通过这个简洁的封装,将调用MCP变为可用自然语言描述,具备推理特性的原子能力;并且这个原子能力可作为Langgraph节点的能力继续组合,这将为我们实现更通用的Agent提供能力基础。
1. 代码示例
代码如下,输入一个提示词模版,自然语言描述要做什么,参数值,就可以使用这段代码完成mcp调用
import os
import asyncio
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from langchain_mcp_adapters.client import MultiServerMCPClient
from typing import Tuple
import traceback
# 设置 OpenAI API 密钥和基础 URL
llm = ChatOpenAI(
model='xxxxx',
temperature=0.7,
max_tokens=5000,
top_p=0.5,
api_key='xxxxx',
base_url='xxxxxxxxx',
streaming=False # 这个代码中,这里必须为False
)
async def call_tool_with_react_style(idea: str) -> Tuple[bool, str]:
try:
async with MultiServerMCPClient(
{
"xxx_service": {
"url": "http://ip:port/sse",
"transport": "sse",
},
}
) as client:
tools = client.get_tools()
agent = create_react_agent(
model = llm,
tools = tools
)
#print(agent.get_graph().draw_mermaid())
result = await agent.ainvoke({"messages": [{"role": "user", "content": idea}]})
if 'messages' in result and result['messages']:
return True, result['messages'][-1].content
return False, 'return message format error'
except Exception as e:
error = f'执行{idea}时发生错误:\n {traceback.format_exc()}'
return False, error
2. 原理
Langgraph的封装相当简洁,有2个关键点
- 关键点1:使用MultiServerMCPClient封装MCP的细节,转换为Langchain工具;
- 关键点2:使用create_react_agent创建agent,执行该agent完成idea推理,选择执行对应的MCP
其中create_react_agent是核心,翻阅源码,可以看到create_react_agent实际上是创建了一个GraphCompiler对象,该对象图结构如下:
create_react_agent
这个agent所做的事情如下:
- agent阅读idea,使用大模型能力返回ToolMessage结构信息,该结构里有如下结构json信息
{
"tool_calls": [
{
"name": "add",
"arguments": {
"x": 2,
"y": 3
}
}
]
}
猜测这段信息中,agent结合idea以及MCP的list_tools信息,找到对应的可能的tool,生成了结构化的参数信息
- tools节点输入参数,执行返回结果
- 这里有condition节点负责控制,tools节点失败了,能重复调用的次数,默认是25次
小结
这个示例非常有意义:
- 通过自然语言可完成MCP工具访问,定义封装一些自然语言的promot提示词,提示词本身可以放入QA对库中;获取业务内容信息,fomat到promot提示词模版中,生成一个完整promot提示词
- 说明了1个组装原理,create_react_agent组装的agent,沉淀为原子能力,提供构建更高阶的Agent