
在这个故事中,我将通过一个超快速教程,展示如何使用LangGraph、MCP和Ollama创建一个多智能体聊天机器人,为您的业务或个人用途打造强劲的智能助手。
不久前,我制作了一个关于Model Context Protocol的视频。一些开发者将其比作“为AI打造的Zapier”,认为它只是给API使用增添了额外步骤。
“在使用MCP之前,开发者必须编写代码并通过API将AI工具与外部系统连接,这意味着每次集成都需要预先编码。”约翰·拉什说道。
尽管MCP是去年发布的,但最近突然走红,这也引发了关于其“花期”能持续多久的讨论。LangChain也在x上发起了一项投票:
结果显示,40.8%的人认为MCP将成为未来标准,25.8%认为MCP只是昙花一现,其余33.4%选择观望。
MCP仍属新生事物(发布于2024年11月),但已支持GitHub、Slack和PostgreSQL等诸多服务。由于采用开放标准,它能与任何大语言模型(Claude、OpenAI、Gemini等)兼容的特性令人惊喜。
那么,让我快速演示一个实时聊天机器人,以便更直观地说明我的意思。
我将向聊天机器人提出两个不同的问题:第一个是,“你能写一份关于最新大语言模型的报告吗?”你可以随意提问任何你想问的问题。
如果你观察聊天机器人如何生成输出,会发现该代理利用其结构化流程(由create_chatbot函数驱动)来处理输入。此函数将系统指令、用户消息和工具执行整合为流畅的交互过程,随后根据查询决定使用哪个工具。
它将调用谷歌搜索工具查找最新信息并生成报告。对于第二个问题”编写一个使用Seaborn创建带回归线散点图的Python脚本”,聊天机器人会处理该请求并将其路由至适当工具(如python_repl或data_visualization),具体取决于查询结构。async_tool_executor动态处理工具调用,确保代码生成或可视化等同步/异步功能都能正确执行。
在此过程中,聊天机器人StateGraph负责管理对话状态,使其能够针对后续问题提供精准且符合语境的应答。get_tools函数确保仅保留可用功能工具,从而保障系统稳定性。主函数则维持整体流畅运转,实时处理用户输入、调用正确工具并处理输出结果。
因此,在这个故事的结尾,你将理解MCP与函数调用的区别、何时使用函数调用与MCP,以及如何利用LangGraph、MCP和开源技术打造一个强劲的智能代理聊天机器人。
开始之前!♀️
如果你喜爱这个话题并想支持我:
MCP和函数调用有什么区别?
在函数调用中,AI就像严格脚本下操作的熟练工——它能填写表格并调用预定义工具,但仅限于已获得的工具,且逐一调用。而在MCP中,AI更像拥有工具包的代理:它能在工具箱里翻找(发现新工具)、组合使用、处理更多任务并拥有更高自主权。
函数调用与模型的提示紧密耦合,要求开发者管理顺序,这使得它具有很高的可控性,但在某种程度上也缺乏灵活性。
MCP通过开放协议实现松耦合,这使得它具备高度灵活性和可扩展性,但需要强劲的设计来管理复杂性(并确保安全性)。下一节将深入探讨如何用MCP构建智能体,以及如何应对这种灵活性带来的挑战。
何时使用函数调用与MCP
选择函数调用还是MCP取决于具体的使用场景:
当您有一组明确定义的小型操作或查询时,尤其是单步骤操作且需要高度结构化输出的情况,请使用函数调用功能。
它超级适合可预测任务和轻量级集成场景,在这些情况下MCP增加的额外开销可能得不偿失。因此当结构化、针对性强的任务以及与应用程序轻松集成至关重大时,请选择函数调用功能。
当您需要更高的灵活性、多功能工具或跨交互演变的上下文时,请使用MCP。如果您的AI代理是能够调用多数据源的企业内部系统通用助手,MCP更适用于复杂多步骤工作流,或当AI必须维持长期上下文并与各类系统交互的场景。
需要注意的是,这两种方法并非互斥——它们可以相辅相成。例如,函数调用功能可在MCP客户端内部使用,以处理模型的结构化输出。
从概念上讲,函数调用旨在以可控方式将自然语言转化为函数执行,而MCP则旨在为AI提供更广泛的接口以探索和操作环境。
让我们开始编程
目前让我们一步步探索并揭开如何创建MCP应用的答案。我们将安装支持模型的库。为此,我们将执行pip安装requirements。
下一步是常规操作,我们将导入相关库,其重大性会随着后续步骤逐渐显现。
langchain_mcp_adapters:将MCP工具转换为LangChain工具
用于LangGraph智能体并提供客户端实现
允许用户连接并加载来自多个MCP服务器的工具
MCP:MCP是一种开放协议,用于标准化应用程序如何向大型语言模型提供上下文。
Googlesearch-python:一个简化谷歌搜索的软件包。
代理.py
我将create_agent函数设计为异步流程来构建AI代理。设置了一个异步函数,接收docs_info作为可选参数,用于向聊天机器人提供相关数据。
我将MultiServerMCPClient集成到异步上下文管理器中,确保通过服务器发送事件(SSE)与MCP服务器http://localhost:8000/sse实现无缝通信,并设置了30秒超时。
我调用了client.get_tools()获取必要的MCP工具,从而实现了高级功能。为了管理对话状态,我使用MessagesState构建了一个状态图。
随后我创建了一个聊天机器人节点create_chatbot(docs_info),使其能够处理并与提供的文档进行交互。
我设计了async_tool_executor来动态处理工具调用,它以状态作为输入,其中包含对话中交换的消息列表。我提取最后一条消息(messages[-1])来检查工具调用,直接从tool_calls或additional_kwargs中获取它们。
如果未发现工具调用,我将原样返回消息。为处理工具调用,我会将这些消息复制到新消息中,并遍历每个工具调用,提取工具名称、工具参数和工具ID,同时支持字典和对象格式以确保灵活性。我会通过匹配工具名称与可用工具来查找对应工具;若未找到,则生成错误消息列出有效工具。
如果该工具存在,我会使用
asyncio.iscoroutinefunction()判断它是否为异步函数——若是异步函数,则通过await tool.coroutine(**tool_args)执行;否则直接调用tool.func(**tool_args)或tool(**tool_args)。捕获异常时会将详细错误信息追加到new_messages中处理错误。
我将异步工具执行器节点和路由功能整合到聊天机器人的图中,设计了一个结构化的对话流程。第一,我添加了名为”tools”的async_tool_executor节点,使系统能够动态处理工具调用。
接着,我创建了一个路由函数,根据对话中的最后一条消息决定下一步操作。该路由器会检查AI发送的最后一条消息是否包含工具调用——如果发现,则将流程导向”工具”分支;否则直接结束对话。
为了建立流程,我在图中添加了边:从“聊天机器人”开始,有条件地路由到“工具”或“结束”,并将“工具”循环回“聊天机器人”以实现多次工具交互。
节点.py
我设计了一个函数get_system_prompt,用于动态生成AI助手的系统提示,确保其操作遵循清晰的指导方针并具备情境感知能力。第一,我使用datetime.now().strftime(“%Y-%m-%d”)格式化当前日期,并将其嵌入提示中以供实时参考。
接着,我明确了助手的角色定位与功能,列出了三大核心工具:generate_image(调用DALL-E进行图像生成)、data_visualization(使用matplotlib绘制图表)以及python_repl(Python代码执行环境)。
我开发了create_chatbot函数来处理用户输入并生成AI响应。它采用ChatPromptTemplate技术将系统指令与用户消息相结合。系统指令来自get_system_prompt(docs_info)。
我将提示符(|)通过管道输入LLM以创建无缝处理链。该函数通过将字符串转换为HumanMessage对象来确保消息格式一致性。聊天机器人调用LLM处理用户消息并追加响应。
这保持了结构化的对话历史记录。助手遵循预设规则的同时适应各种查询。它保持工具无关性,确保回应的灵活性。这种设置提供了互动且动态的聊天机器人体验。
服务器.py
我开发了一套工具,用于在多工具系统中生成图像、可视化数据和执行Python代码。generate_image工具利用DALL-E根据提示生成图像。它会验证提示的有效性,然后异步调用OpenAI API来生成图像。如果成功,它将返回生成图像的URL;如果出现错误,则会提供错误信息。
数据可视化工具执行Python代码matplotlib来创建图表,并将结果保存为base64编码的PNG图像。python_repl工具通过REPL环境运行Python代码,实现用户输入的动态执行。每个工具都设计有错误处理机制,能向用户返回有意义的响应。
我创建了get_tools函数来返回可用工具的列表,确保只包含功能正常的工具。该函数以一组基础工具开始:generate_image、python_repl和data_visualization。如果提供了额外的retriever_tool,则将其添加到工具列表中。最后该函数返回完整的可用工具列表。
最后,脚本通过调用mcp.run(transport=”sse”)以服务器发送事件(SSE)作为传输方式运行MCP服务器。此设置确保工具在执行时已准备就绪,可供应用程序使用。
main.py
我设计了主函数来运行一个异步代理,该代理动态处理用户输入并与工具交互。该函数第一通过await create_agent()创建代理和客户端,然后通过命令行提示用户输入,并使用用户请求构建初始消息(HumanMessage)。
该函数通过使用agent.ainvoke()异步调用代理来执行,处理请求并响应结果。若响应来自用户,则打印其输入内容;若来自工具,则输出执行结果并检查是否为图像生成类型,提取对应的图片URL。处理过程中出现的任何异常均会被捕获并打印输出。
最后,客户端保持活动状态以确保操作持续进行。脚本通过asyncio.run(main())异步执行。
结论:
MCP不仅仅是一个简单的升级版工具调用协议,而是一次重大的范式升级。
MCP提供了一个通用的开放标准,使AI系统能够以标准化方式连接各类数据源、工具和服务,从而减少为每个数据源单独构建连接器的需求,简化AI集成流程。
当前的非智能服务可通过MCP将自身功能作为”工具”暴露给大语言模型(LLM)调用,这使得LLM无需对现有系统进行重大改造,即可与既有系统交互并执行任务。
学习是一个过程,只要你在学,就会有挑战。天道酬勤,你越努力,就会变得越好。


就想问下,现在ollama下载模型能不能下?
这么流行的工具怎么会不能用呢?
不丢包,但是10%进度就断了,4月份还可以的。明白我的意思了?
收藏了,感谢分享