Langgraph调用MCP

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容