本项目旨在展示如何借助Watsonx.ai构建功能完备的检索增强生成(RAG)服务器,利用ChromaDB实现持久的向量存储。同时,还将展示如何通过模型上下文协议(MCP)把该服务器集成到Claude Desktop中,使其能依据PDF文档内容回答问题,为用户提供强大的问答功能。
本项目主要分为三个步骤,分别是构建RAG服务器、配置Claude Desktop集成以及验证与使用。下面将为你详细介绍每个步骤的具体操作。
pip install watsonx chromadb langchain
在server.py
文件中初始化模型:
from langchain.embeddings import Embeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import ChromaDB
from langchain.document_loaders import PDFLoader
import os
# 初始化Watsonx embeddings
embeddings = Embeddings()
# 加载PDF文件
loader = PDFLoader("manual.pdf")
documents = loader.load()
# 将文档分割成小块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# 创建ChromaDB存储
vectorstore = ChromaDB.from_texts(
texts,
embeddings,
persist_directory="chroma_store",
collection_name="manual_vectors"
)
def chat_with_manual(query: str) -> str:
docs_and_scores = vectorstore.similarity_search_with_score(query, k=3)
context = "\n".join([doc.page_content for doc, _ in docs_and_scores])
return f"根据手册内容:{context}"
通常位于用户主目录下的.config/claude/settings
文件夹中。
在claude_desktop_config.json
文件中添加以下内容:
{
"mcpServers": {
" rag_manual_server": {
"type": "python",
"command": "python server.py chat_with_manual {query}",
"description": "根据用户手册回答问题"
}
}
}
确保Claude Desktop已重新启动以应用新配置。
在聊天窗口中输入以下内容,测试新工具:
/tool rag_manual_server
然后提出问题,例如:
/manual 中提到的最大飞行时间是多少?
系统将根据PDF中的内容生成相应的回答。
# 初始化Watsonx embeddings
from langchain.embeddings import Embeddings
embeddings = Embeddings()
# 加载PDF文件
from langchain.document_loaders import PDFLoader
loader = PDFLoader("manual.pdf")
documents = loader.load()
# 将文档分割成小块
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# 创建ChromaDB存储
from langchain.vectorstores import ChromaDB
vectorstore = ChromaDB.from_texts(
texts,
embeddings,
persist_directory="chroma_store",
collection_name="manual_vectors"
)
# 定义查询函数
def chat_with_manual(query: str) -> str:
docs_and_scores = vectorstore.similarity_search_with_score(query, k=3)
context = "\n".join([doc.page_content for doc, _ in docs_and_scores])
return f"根据手册内容:{context}"
本项目主要利用了Watsonx.ai进行模型初始化和嵌入生成,通过ChromaDB实现向量存储。在处理文档时,使用了langchain
库中的PDFLoader
加载PDF文件,RecursiveCharacterTextSplitter
将文档分割成小块,ChromaDB
存储处理后的文本向量。在查询时,通过similarity_search_with_score
方法查找与查询最相似的文档,并根据文档内容生成回答。
⚠️ 重要提示
- 环境配置方面,要确保所有依赖项正确安装,并且路径设置无误。
- 性能优化方面,如果处理大量文档,需考虑优化文本分割和向量存储的效率。
- 错误处理方面,在实际应用中要添加异常捕获和日志记录功能。
通过本项目,我们成功构建了一个基于Watsonx.ai和ChromaDB的RAG服务器,并将其集成到Claude Desktop中。这一实现展示了如何将先进的NLP技术与现有工具无缝结合,为用户提供强大的问答功能。