我将在本文教你如何使用 LangGraph、MCP 和 Ollama 打造一个多智能体(Multi-Agent)聊天机器人。
MCP 是 Model Context Protocol(模型上下文协议)的简称。一些开发者将其比作“为 AI 打造的 USB-C 接口”。
尽管 MCP 去年才发布,但最近它突然流行起来,这也引发了关于它的“花期”能持续多久的讨论。LangChain 还在 X 上发起了一项投票:
结果显示,40.8% 的人认为 MCP 是未来的标准,25.8% 的人觉得 MCP 只是昙花一现,其余 33.4% 的人选择观望。
虽然 MCP 在 2024 年 11 月才发布,但它已经支持了如 GitHub、Slack 和 PostgreSQL在内的许多服务。
作为一个开放标准,令人惊讶的是它可以与任何大语言模型(LLM,例如 Claude、OpenAI、Gemini 等)一起使用。
接下来,我将为你展示如何使用 LangGraph、MCP 和 Ollama 打造一个多智能体(Multi-Agent)聊天机器人。
我将向聊天机器人提出两个不同的问题:第一个问题是,“你能写一份关于最新 LLM 的报告吗?”
如果你观察聊天机器人生成输出的过程,你会发现这个 Agent 使用其结构化的流程(通过 create_chatbot 函数驱动)来处理输入。这个函数将系统提示、用户消息和工具执行整合成一个流畅的交互过程,然后根据查询决定使用哪个工具。它会调用 Google 搜索工具来查找最新信息并生成报告。
对于第二个问题,“编写一个使用 Seaborn 创建带回归线的散点图的 Python 脚本”,聊天机器人会处理请求并将其路由到合适的工具,比如 python_repl 或 data_visualization,具体取决于查询的结构。async_tool_executor 会动态处理工具调用,确保同步和异步函数(比如生成代码或可视化内容)都能正确执行。
在这个过程中,我们使用 StateGraph 管理聊天机器人的对话状态,因此它能够对后续问题提供准确且具有上下文感知的回答。
get_tools 函数确保只提供可用的工具,维持系统稳定性。
主函数让一切顺利运行,实时处理用户输入,调用正确的工具并处理输出。
因此,在这个本文结束时,你将明白 MCP 和函数调用(Function Call)的区别,什么时候使用函数调用,什么时候使用 MCP,以及我们如何利用 LangGraph、MCP 和 Ollama 打造一个强大的智能体聊天机器人。
MCP 和函数调用有什么区别?
在函数调用中,AI 就像一个技术娴熟的工人,严格按照脚本操作——它可以填写表格并调用预定义的工具,但只能使用它已有的工具,并且一次调用一个。而在 MCP 中,AI 更像是一个拥有工具箱的智能体:它可以在工具箱中翻找(发现新工具),组合使用它们,处理更多任务,并拥有更大的自主性。
- 函数调用与模型的提示紧密耦合,开发者需要管理调用顺序,这使得它非常可控,但某种程度上缺乏灵活性。
- MCP 通过开放协议实现松耦合,这让它具有高度的灵活性和扩展性,但需要强大的设计来管理复杂性(并确保安全性)。
下一部分将深入探讨如何使用 MCP 构建智能体,以及如何应对这种灵活性带来的挑战。
什么时候使用函数调用和 MCP?
选择函数调用还是 MCP 取决于使用场景:
- 当你有一组明确定义的少量动作或查询时,特别是在单步操作且需要高度结构化的输出时,使用函数调用。它非常适合可预测的任务和轻量级集成,此时 MCP 的额外开销可能显得多余。因此,当需要结构化、狭窄的任务以及与应用轻松集成时,选择函数调用。
- 当你需要更大的灵活性、多功能工具或跨交互演变的上下文时,使用 MCP。MCP 更适合复杂、多步骤的工作流程,或者当 AI 需要维持长期上下文并与各种系统交互时。如果你的 AI Agent 是一个跨内部系统的通用助手,可以从多个数据源获取信息,MCP 是更好的选择。
值得注意的是,这两种方法并非互斥——它们可以互补。例如,可以在 MCP 客户端内部使用函数调用来处理模型的结构化输出。
从概念上讲,函数调用旨在以受控方式将自然语言翻译为函数执行,而 MCP 则旨在为 AI 提供更广泛的接口,让它在环境中探索和操作。
开始编码吧
接下来,我将介绍本次项目的重点。
首先,本项目所需的主要技术栈:
-
langchain_mcp_adapters:将 MCP 工具转换为 LangChain 工具,与 LangGraph Agent 一起使用,并提供客户端实现,允许用户连接并从多个 MCP 服务器加载工具。
-
MCP:MCP 是一个开放协议,标准化了应用程序如何为大语言模型提供上下文。
-
Googlesearch-python:一个便于 Google 搜索的包。
以下是代码的主要部分(因篇幅限制,仅讲述核心内容):
agent.py
我将 create_agent 函数设计为一个异步过程,以构建 AI Agent。我设置了一个异步函数,该函数接受 docs_info 这个可选参数,以向聊天机器人提供相关数据。
我将 MultiServerMCPClient 集成到异步上下文管理器中,确保使用服务器发送事件 (SSE) 与 MCP 服务器 http://localhost:8000/sse 无缝通信,超时时间为 30 秒。
我实现了对 client.get_tools() 的调用,以检索必要的 MCP 工具,从而启用高级功能。为了管理对话状态,我使用 MessagesState 构建了一个 StateGraph。
然后,我使用 create_chatbot(docs_info) 创建了一个聊天机器人节点,使其能够处理和与提供的文档进行交互。
我还设计了 async_tool_executor 函数来动态处理工具调用。它以 state 作为输入,包含对话中交换的消息列表。我提取最后一条消息(messages[-1])来检查是否有工具调用。如果没有工具调用,直接返回消息不变。如果有,我会遍历每个工具调用,提取工具名称、参数和 ID,并根据工具名查找匹配的工具。如果工具不存在,则返回错误信息;如果存在,则根据工具是异步还是同步函数来执行,并处理可能的异常。
我通过添加异步工具执行节点和路由函数,设计了一个结构化的对话流程。路由函数根据最后一条消息是否包含工具调用,决定下一步是转到工具节点还是结束对话。
nodes.py
我设计了 get_system_prompt 函数来动态生成系统提示,确保 AI 助手在清晰的指导和上下文感知下运行。我使用当前日期并定义了助手角色及其可用工具:
- generate_image(DALL-E 生成图像)
- data_visualization(matplotlib 创建图表)
- python_repl(执行 Python 代码)。
我开发的 create_chatbot 函数处理用户输入并生成 AI 响应。它使用 ChatPromptTemplate 将系统指令与用户消息结合,通过管道操作(|)连接到 LLM,确保消息格式一致并维持结构化的对话历史。
server.py
我开发了一组工具,包括图像生成、数据可视化和 Python 代码执行。
- generate_image 使用 DALL-E 根据提示生成图像并返回 URL;
- data_visualization 执行 matplotlib 代码并返回 base64 编码的 PNG 图像;
- python_repl 在 REPL 环境中运行 Python 代码。
main.py
我设计了 main 函数来运行异步代理,处理用户输入并动态与工具交互。它通过命令行获取输入,异步调用 Agent 并处理响应,特别处理工具结果(如图像 URL)。
结论
MCP 不仅仅是一个简单的工具调用协议升级,而是一个重大的范式升级。
MCP 提供了一个通用的开放标准,使 AI 系统能够以标准化方式连接到各种数据源、工具和服务,减少了为每个数据源构建单独连接器的需求,简化了 AI 集成过程。
当前的非智能服务可以通过 MCP 将自身功能暴露为“工具”,供 LLM 调用,这使得 LLM 能够与现有系统交互并执行任务,而无需对现有系统进行重大修改。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。