如何使用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 等工具使整合變得簡單易行。

評論留言