LangGraph + MCP + Ollama:构建强大代理 AI 的关键(一)

在本文中,我们将通过一个超级快速的教程向你展示如何使用 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_repldata_visualizationasync_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  

后续将会继续讲解代码细节,欢迎持续关注!

相关推荐
槑槑紫12 分钟前
深度学习pytorch整体流程
人工智能·pytorch·深度学习
盼小辉丶26 分钟前
TensorFlow深度学习实战——去噪自编码器详解与实现
人工智能·深度学习·tensorflow
ohMyGod_12330 分钟前
React16,17,18,19新特性更新对比
前端·javascript·react.js
前端小趴菜0532 分钟前
React-forwardRef-useImperativeHandle
前端·vue.js·react.js
@大迁世界32 分钟前
第1章 React组件开发基础
前端·javascript·react.js·前端框架·ecmascript
Hilaku36 分钟前
从一个实战项目,看懂 `new DataTransfer()` 的三大妙用
前端·javascript·jquery
爱分享的程序员39 分钟前
前端面试专栏-算法篇:20. 贪心算法与动态规划入门
前端·javascript·node.js
我想说一句41 分钟前
事件委托与合成事件:前端性能优化的"偷懒"艺术
前端·javascript
爱泡脚的鸡腿42 分钟前
Web第二次笔记
前端·javascript
良辰未晚42 分钟前
Canvas 绘制模糊?那是你没搞懂 DPR!
前端·canvas