如何使用MCP执行RAG?

如何使用MCP执行RAG?

您是否厌倦了 AI 在无法访问实时数据时给出模糊的答案?您是否厌倦了一遍又一遍地编写代码来对本地数据执行 RAG?通过将 RAG 与 MCP(模型上下文协议)集成,可以轻松解决这两个大问题。借助 MCP,您可以将 AI 助手连接到外部工具和 API,从而无缝执行真正的 RAG。MCP 彻底改变了 AI 模型与实时数据的通信方式。另一方面,RAG 为 AI 模型提供了福音,为它们提供了 AI 模型所不知道的外部知识。在本文中,我们将深入探讨 RAG 与 MCP 的集成,它们协同运行时的样子,并向您介绍一个实际示例。

什么是RAG?

RAG 是一个 AI 框架,它将传统信息检索系统(例如搜索和数据库)的优势与擅长自然语言生成的 AI 模型的功能相结合。它的优势包括实时、基于事实的响应、减少幻觉以及提供上下文感知的答案。 RAG 就像在撰写详细报告之前向图书管理员询问信息。

什么是RAG?

什么是MCP?

MCP 是 AI 助手与外部工具之间的桥梁。它是一种开放协议,允许 LLM 准确高效地访问现实世界的工具、API 或数据集。传统的 API 和工具需要自定义代码才能与 AI 模型集成,而 MCP 提供了一种通用方法,以最简单的方式将工具连接到 LLM。它提供即插即用的工具。

什么是MCP?

了解更多关于 MCP 的信息

它如何赋能RAG?

在 RAG 中,MCP 充当检索层,根据您的查询从数据库中检索重要的信息块。它完全标准化了您与数据库的交互方式。现在,您无需为每个正在构建的 RAG 编写自定义代码。它支持基于 AI 推理的动态工具使用。

MCP与RAG的用例

MCP 与 RAG 的用例有很多。其中一些包括:

  • 搜索新闻文章以获取摘要
  • 查询金融 API 以获取市场更新
  • 加载私人文档以获取上下文感知的答案
  • 在回答之前获取天气或基于位置的信息
  • 使用 PDF 或数据库连接器支持企业搜索

使用MCP执行RAG的步骤

现在,我们将详细地使用 MCP 实现 RAG。请按照以下步骤创建您的第一个执行 RAG 的 MCP 服务器。现在让我们深入实现:

首先,我们将设置 RAG MCP 服务器。

步骤 1:安装依赖项

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install langchain>=0.1.0 \
langchain-community>=0.0.5 \
langchain-groq>=0.0.2 \
mcp>=1.9.1 \
chromadb>=0.4.22 \
huggingface-hub>=0.20.3 \
transformers>=4.38.0 \
sentence-transformers>=2.2.2
pip install langchain>=0.1.0 \ langchain-community>=0.0.5 \ langchain-groq>=0.0.2 \ mcp>=1.9.1 \ chromadb>=0.4.22 \ huggingface-hub>=0.20.3 \ transformers>=4.38.0 \ sentence-transformers>=2.2.2
pip install langchain>=0.1.0 \
           langchain-community>=0.0.5 \
           langchain-groq>=0.0.2 \
           mcp>=1.9.1 \
           chromadb>=0.4.22 \
           huggingface-hub>=0.20.3 \
           transformers>=4.38.0 \
           sentence-transformers>=2.2.2

此步骤将在您的系统中安装所有必需的库。

步骤 2:创建server.py

现在,我们在 server.py 文件中定义 RAG MCP 服务器。以下是其代码。它包含一个简单的 RAG 代码以及与之相关的 MCP 连接。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from mcp.server.fastmcp import FastMCP
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_groq import ChatGroq # Groq LLM
# Create an MCP server
mcp = FastMCP("RAG")
# Set up embeddings (You can pick a different Hugging Face model if preferred)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# Set up Groq LLM
model = ChatGroq(
model_name="llama3-8b-8192", # or another Groq-supported model
groq_api_key="YOUR_GROQ_API" # Required if not set via environment variable
)
# Load documents
loader = TextLoader("dummy.txt")
data = loader.load()
# Document splitting
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(data)
# Vector DB
docsearch = Chroma.from_documents(texts, embeddings)
# Retriever chain
qa = RetrievalQA.from_chain_type(llm=model, retriever=docsearch.as_retriever())
@mcp.tool()
def retrieve(prompt: str) -> str:
"""Get information using RAG"""
return qa.invoke(prompt)
if __name__ == "__main__":
mcp.run()
from mcp.server.fastmcp import FastMCP from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader from langchain.text_splitter import CharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_groq import ChatGroq # Groq LLM # Create an MCP server mcp = FastMCP("RAG") # Set up embeddings (You can pick a different Hugging Face model if preferred) embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") # Set up Groq LLM model = ChatGroq( model_name="llama3-8b-8192", # or another Groq-supported model groq_api_key="YOUR_GROQ_API" # Required if not set via environment variable ) # Load documents loader = TextLoader("dummy.txt") data = loader.load() # Document splitting text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(data) # Vector DB docsearch = Chroma.from_documents(texts, embeddings) # Retriever chain qa = RetrievalQA.from_chain_type(llm=model, retriever=docsearch.as_retriever()) @mcp.tool() def retrieve(prompt: str) -> str: """Get information using RAG""" return qa.invoke(prompt) if __name__ == "__main__": mcp.run()
from mcp.server.fastmcp import FastMCP
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_groq import ChatGroq  # Groq LLM
# Create an MCP server
mcp = FastMCP("RAG")
# Set up embeddings (You can pick a different Hugging Face model if preferred)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# Set up Groq LLM
model = ChatGroq(
model_name="llama3-8b-8192",  # or another Groq-supported model
groq_api_key="YOUR_GROQ_API"  # Required if not set via environment variable
)
# Load documents
loader = TextLoader("dummy.txt")
data = loader.load()
# Document splitting
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(data)
# Vector DB
docsearch = Chroma.from_documents(texts, embeddings)
# Retriever chain
qa = RetrievalQA.from_chain_type(llm=model, retriever=docsearch.as_retriever())
@mcp.tool()
def retrieve(prompt: str) -> str:
"""Get information using RAG"""
return qa.invoke(prompt)
if __name__ == "__main__":
mcp.run()

在这里,我们使用 Groq API 访问 LLM。请确保您拥有 Groq API。此处使用的 Dummy.txt 是您拥有的任何数据,您可以根据用例更改其内容。

现在,我们已经成功创建了 RAG MCP 服务器。现在,要检查它,请在终端中使用 Python 运行它。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python server.py
python server.py
python server.py

步骤 3:为MCP配置Cursor

让我们配置 Cursor IDE 来测试我们的服务器。

  1. 从官方网站 https://www.cursor.com/downloads 下载 Cursor。
  2. 安装、注册并进入主屏幕。

Cursor主屏幕

  1. 现在从标题工具栏转到 File,然后单击 Preferences,然后单击 Cursor Settings

Cursor Settings

  1. 从 cursor 设置中,单击 MCP

cursor配置MCP

  1. 在 MCP 选项卡上,单击 Add new global MCP Server

Add new global MCP Server

它将打开一个 mcp.json 文件。将以下代码粘贴到其中并保存。

/path/to/python 替换为您的 Python 可执行文件的路径,并将 /path/to/server.py 替换为您的 server.py 路径。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"mcpServers": {
"rag-server": {
"command": "/path/to/python",
"args": [
"path/to/server.py"
]
}
}
}
{ "mcpServers": { "rag-server": { "command": "/path/to/python", "args": [ "path/to/server.py" ] } } }
{
 "mcpServers": {
   "rag-server": {
     "command": "/path/to/python",
     "args": [
       "path/to/server.py"
     ]
   }
 }
}
  1. 返回 Cursor Settings,您应该看到以下内容:

MCP服务器

如果您看到上一个屏幕,则表示您的服务器已成功运行并连接到 Cursor IDE。如果出现一些错误,请尝试使用右上角的 restart 按钮。

我们已经在 Cursor IDE 中成功设置了 MCP 服务器。现在,让我们测试一下服务器。

步骤 4:测试MCP服务器

我们的 RAG MCP 服务器现在可以执行 RAG 并根据我们的查询成功检索出最佳数据块。让我们来测试一下。

查询:“What is Zephyria, Answer using rag-server”

输出:

Zephyria 是什么?使用 rag-server 回答

查询: “What was the conflict in the planet?”

输出:

这个星球上发生了哪些冲突?

查询: “What is the capital of Zephyria?”

输出:

泽菲利亚的首都是哪里?

小结

RAG 在 MCP 的支持下,可以彻底改变您与 AI 助手的沟通方式。它可以将您的 AI 从简单的文本生成器转变为能够像人类一样思考和处理信息的实时助手。两者的结合可以提高您的工作效率,并随着时间的推移提升您的效率。只需完成前面提到的几个步骤,任何人都可以使用 RAG 和 MCP 构建与现实世界连接的 AI 应用程序。现在,是时候通过设置您自己的 MCP 工具来赋予您的 LLM 超能力了。

常见问题

问题 1:RAG 与传统 LLM 的答案有何不同?

答:传统 LLM 的答案仅基于预先训练的知识,而这些知识可能已过时或不完整。RAG 通过在回答之前检索实时或外部数据(文档、API)来增强这一点,从而确保答案更准确、更及时。

问题 2:为什么我应该使用 MCP 来处理 RAG,而不是编写自定义代码?

答:MCP 无需手动对每个 API 或数据库集成进行硬编码。它提供了一种即插即用机制,可以公开 AI 模型可以根据上下文动态使用的工具,从而使 RAG 的实现更快、更可扩展且更易于维护。

问 3:我需要成为 AI 或 LangChain 专家才能将 RAG 与 MCP 结合使用吗?

答:完全不需要。只需具备基本的 Python 知识并按照分步设置,您就可以创建自己的 RAG 驱动的 MCP 服务器。LangChain 和 Cursor IDE 等工具使集成变得简单易行。

评论留言