
在本文中,我们将通过一个超级快速的教程向你展示如何使用 LangGraph、MCP 和 Ollama 创建多代理聊天机器人,为你的业务或个人用途构建强大的代理聊天机器人。
"在 MCP 出现之前,开发者必须编写代码并通过 API 将 AI 工具连接到外部系统,这意味着每个集成都需要预先编程。" 约翰・拉什(John Rush)说。
尽管 MCP 于去年发布,但最近突然流行起来,这也引发了关于其 "流行期" 能持续多久的讨论。LangChain 还在 X 上发起了一项投票:
结果显示,40.8% 的人认为 MCP 是未来的标准,25.8% 的人认为 MCP 只是昙花一现,其余 33.4% 选择观望。
MCP 仍然很新(于 2024 年 11 月发布),但它已经支持 GitHub、Slack 和 PostgreSQL 等多种服务。由于它是一个开放标准,令人惊讶的是,它可以与任何 LLM(Claude、OpenAI、Gemini 等)一起使用。
那么,让我们通过一个实时聊天机器人的快速演示来解释意思。 我会问聊天机器人两个不同的问题:第一个是 "你能写一篇关于最新 LLM 的报告吗?" 你也可以随意问任何想问的问题。 如果观察聊天机器人如何生成输出,你会看到代理使用其结构化流程(由create_chatbot
函数驱动)来处理输入。该函数将系统指令、用户消息和工具执行集成到一个流畅的交互过程中,然后根据查询决定使用哪个工具。 它将调用 Google 搜索工具来搜索最新信息并生成报告。对于第二个问题 "编写一个使用 Seaborn 创建带回归线的散点图的 Python 脚本",聊天机器人会处理请求并将其路由到适当的工具,例如根据查询结构选择python_repl
或data_visualization
。async_tool_executor
会动态处理工具调用,确保同步和异步函数(如生成代码或可视化)都能正确执行。 在整个过程中,聊天机器人的StateGraph
会管理对话状态,因此它可以针对后续问题提供准确且上下文感知的响应。get_tools
函数确保仅提供可用的功能工具,维持系统稳定性。main
函数则保证所有环节顺利运行,实时处理用户输入、调用正确工具并处理输出。
因此,在本文结束时,你将理解 MCP 与函数调用(Function Call)的区别、何时使用函数调用和 MCP,以及如何使用 LangGraph、MCP 和开源工具创建强大的代理聊天机器人。
MCP 与函数调用(Function Call)的区别是什么?
在函数调用中,AI 就像一个严格按照脚本操作的熟练工人 ------ 它可以填写表单、调用预定义工具,但只能使用已获取的工具,且需逐个调用。而在 MCP 中,AI 更像是一个配备工具包的代理:它可以在工具箱中翻找(发现新工具)、组合工具、处理更多任务,并且拥有更强的自主性。
函数调用与模型的提示词紧密耦合,需要开发者管理调用顺序,这使其具有高度可控性,但在一定程度上缺乏灵活性。而MCP 通过开放协议实现松耦合,这使其具有高度灵活性和可扩展性,但需要强大的设计来管理复杂性(并确保安全性)。下一节将深入探讨如何使用 MCP 构建代理,以及如何应对这种灵活性带来的挑战。
何时使用函数调用和 MCP?
选择函数调用还是 MCP 取决于具体用例。
使用函数调用的场景:
当你需要处理少量定义明确的操作或查询时,尤其是当这些操作是单步操作且需要高度结构化的输出时。
它非常适合可预测的任务和轻量级集成 ------ 如果 MCP 带来的额外开销可能显得多余,那么当结构化的窄任务和与应用的集成便捷性至关重要时,选择函数调用。
使用 MCP 的场景:
当你需要更高的灵活性、多功能工具或跨交互演进的上下文时。如果 AI 代理需要作为跨内部系统的通用助手,并能调用多个数据源,MCP 更适合复杂的多步骤工作流,或当 AI 必须维护长期上下文并与各种系统交互时。
需要注意的是,这两种方法并非互斥 ------ 它们可以互补。例如,函数调用可以在 MCP 客户端内部使用,以处理模型的结构化输出。
从概念上讲,函数调用旨在以可控方式将自然语言转换为函数执行,而 MCP 旨在为 AI 提供更广泛的接口,使其能够在环境中探索和操作。
让我们开始编程
现在让我们逐步探索,揭开如何创建 MCP 应用程序的答案。我们将安装支持模型的库,为此需要执行 pip 安装依赖:
pip install -r requirements.txt
接下来是常规步骤:导入相关库,其重要性将在后续步骤中体现:
-
langchain_mcp_adapters:将 MCP 工具转换为 LangChain 工具,供 LangGraph 代理使用,并提供客户端实现,允许用户连接到多个 MCP 服务器并加载工具。
-
MCP:MCP 是一种开放协议,用于标准化应用程序向 LLM 提供上下文的方式。
-
googlesearch-python:用于简化 Google 搜索的包。
agent.py
javascript
from langchain_core.messages import AIMessage, ToolMessage, HumanMessage
from langgraph.graph import StateGraph, START, END, MessagesState
from nodes import create_chatbot
import asyncio
import os
import dotenv
from langchain_mcp_adapters.client import MultiServerMCPClient
main.py
javascript
import streamlit as st
import asyncio
from agent import create_agent
from langchain_core.messages import HumanMessage
nodes.py
javascript
from server import get_tools
from langgraph.graph import MessagesState
from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from datetime import datetime
import os
server.py(除移除可能无法工作的 search_google 外其余未修改)
javascript
from mcp.server.fastmcp import FastMCP
from langchain_experimental.utilities import PythonREPL
import io
import base64
import matplotlib.pyplot as plt
from openai import OpenAI
from pydantic import BaseModel, Field
import os
from dotenv import load_dotenv
import asyncio
from googlesearch import search
后续将会继续讲解代码细节,欢迎持续关注!