LangChain + MCP + RAG + Ollama:强大的智能代理人工智能的关键(一)

246 阅读6分钟

在本文中,我们将提供一个超级快速的教程,向你展示如何使用 LangChain、MCP、RAG 和 Ollama 创建一个多智能体聊天机器人,用以为企业或个人用途构建一个强大的智能体聊天机器人。

MCP、RAG 和智能体最近非常流行。几乎每个从事人工智能工作的人都在谈论这个话题。与此同时,几乎每天都有大量的 MCP 工具诞生。

这是因为 RAG 依赖搜索工具来获取知识,而 MCP 可以将调用这些工具的过程标准化。

由 MCP 协调的工具链需要实时数据支持,而 RAG 可以动态地提供知识上下文。例如,智能体通过 MCP 调用网络搜索接口,然后将搜索结果输入到 RAG 中以生成答案。

同样,在供应链优化中,MCP 调用库存 API 来获取实时库存数据。

不久前,Mistral 推出了另一个 “小而美” 的产品:Mistral Small 3.1 发布并开源了。

Mistral Small 3.1 是 Mistral Small 3 的升级版本,具备 240 亿(24B)参数,旨在提供高效、低延迟且高性能的生成式 AI 解决方案。该模型基于 Apache 2.0 许可证发布,允许商业用途。

此版本主要支持图像理解能力,上下文长度从原来的 32k tokens 提升至 128k tokens。它可在单张 RTX 4090 显卡或 32GB 内存的 Mac 设备上运行,在相同硬件条件下,其速度比同参数规模的 Llama 3.3 70B 模型快 3 倍。

查看基准测试图表:横轴表示速度(数值越小速度越快),纵轴表示知识能力(数值越大能力越强)。Mistral Small 3.1 直接占据左上角区域,实现速度与知识的双重优势。

向聊天机器人提问:“获取大语言模型(LLMs)的最新资讯。” (可以随意提出任何想问的问题)

如果观察聊天机器人的输出生成过程,会发现当用户输入查询时,智能体(Agent)会执行以下操作:搜索网页、提取 URL、异步获取页面完整内容,并将内容分割为可处理的块。

这些内容块会使用 Mistral AI 或 ollama 的嵌入模型进行向量化(可自由选择任何嵌入模型),并存储在 FAISS 向量数据库中以实现快速语义检索。

这里遇到的一个问题是:当我们将搜索和 RAG 功能封装为 MCP 工具时,会遇到诸如 “Attempted to exit cancel scope in a different task than it was entered in” 和 “ClosedResourceError” 等错误。MCP 无法正确处理网页搜索所需的异步连接。

解决方案是修改代码,为每个工具调用创建全新连接,而非维护长连接。这使得每个操作在独立上下文中运行。

随后系统会执行基于 RAG 的搜索,从获取的内容中返回最相关信息,并结合传统搜索结果。所有核心功能(如 search_web、get_web_content、create_rag、search_rag)均封装了错误处理机制,可独立运行或通过 Fastmcp 驱动的服务器实现实时交互(通过 Server-Sent Events/SSE 协议)。

因此,在本教程结束时,你将理解 MCP 与 RAG 的区别、如何结合 RAG 和 MCP,以及如何利用 LangGraph、MCP、RAG 和开源工具创建强大的智能体聊天机器人。

MCP 与 RAG 的对比

MCP 与 RAG 的差异反映了它们在实际应用中的不同定位:

  • MCP 的适用场景:特别适合需要大语言模型(LLM)执行复杂操作的场景。例如在开发 AI 智能体时,智能体可能需要调用外部工具完成任务,如从数据库提取数据或使用约束求解器解决问题。

  • RAG 的适用场景:更适合需要保持信息更新和准确的场景。例如企业聊天机器人需要回答产品或服务相关问题,而这些信息可能超出 LLM 训练数据的范围。

如何结合两者

一个有趣的事实是两者可结合使用。例如:

  1. AI 智能体可通过 MCP 调用检索工具(如网页搜索)。

  2. 再通过 RAG 将检索到的信息整合到生成的回答中,从而实现更强的能力。

这种组合在 2025 年的 AI 应用中可能会越来越普遍,尤其是在需要动态交互和实时信息更新的场景中。

MCP 的成功关键在于依赖行业对协议的支持,以及解决安全和可扩展性问题。同时,RAG 的普及优势得益于其成本效益和易实现性。MCP 的多功能性可能使其成为更广泛集成的标准,而 RAG 可能在知识密集型任务中继续占据主导地位。

开始写代码

现在让我们逐步探索如何创建 MCP 应用的答案。我们将安装支持该模型的库。为此,我们将运行以下命令来安装依赖:

pip install -r requirements.txt

下一步是常规操作,我们将导入相关的库,随着学习深入,这些库的重要性将变得显而易见。

我们通过从以下模块导入类来启动代码:

FireCrawlLoader 是一个强大的工具,它允许你爬取任何网站并将其转换为 Markdown 格式。它能高效处理所有可访问的子页面,为每个页面提供干净的 Markdown 内容和元数据。

exa_py 允许用户使用完整句子和自然语言进行搜索,还能模拟人们在互联网上分享和讨论链接的方式来查询内容。

MCP 是一个开放协议,它规范了应用程序如何向大语言模型提供上下文。

# mcp_server.py
import asyncio
from mcp.server.fastmcp import FastMCP
import rag
import search
import logging
import os

# rag.py
from langchain_ollama import OllamaEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
import search
from langchain_core.documents import Document
import os
import asyncio

# search.py
import asyncio
from dotenv import load_dotenv
import os
from exa_py import Exa
from typing import List, Tuple
from langchain_core.documents import Document
from langchain_community.document_loaders.firecrawl import FireCrawlLoader
import requests

# agent.py
import asyncio
import os
import sys

# 直接导入搜索和RAG模块
import search
import rag

上述代码提供了项目的基本结构和必要的导入语句。后续步骤将实现具体的功能模块和集成各个组件,我们将在下一次的文章中继续探索。