使用说明
MCP RAG系统
一个使用模型上下文协议(MCP)构建的综合检索增强生成(RAG)系统,用于存储、处理和搜索PDF文档。
特性
🔧 工具
- upload_pdf:通过自动文本提取和分块上传和处理PDF文件
- 搜索文档:使用向量嵌入对所有上传的文档进行语义搜索
- list_文档:查看所有上传的文档及其元数据
- 删除文档:从系统中删除文档及其相关块
- get_rag_stats:获取RAG系统的全面统计数据
📦 资源
- rag://documents:列出系统中的所有文档
- rag://document/{document_id}:获取特定文档的完整内容
- rag://stats:获取系统统计信息
💬 提示
- rag_query_prompt:生成基于RAG的问答提示
- 文档_摘要_空白:创建文档摘要提示
- 搜索_建议_提示:生成更好的搜索查询建议
安装
-
安装依赖项:
pip install -r requirements.txt -
下载所需型号: 系统将在首次使用时自动下载句子转换器模型。
用法
启动服务器
python mcp_server.py
服务器将于启动 http://localhost:8000 使用SSE(服务器发送事件)传输。
使用客户端
示范模式
python mcp_client.py
# Choose option 1 for demo mode
交互模式
python mcp_client.py
# Choose option 2 for interactive mode
交互模式下的可用命令:
upload-上传PDF文件search-使用查询搜索文档list-列出所有上传的文档stats-显示系统统计信息quit-退出客户端
工作流示例
-
上传PDF:
# Via tool call result = await session.call_tool("upload_pdf", arguments={ "file_path": "/path/to/document.pdf", "document_name": "My Research Paper" }) -
搜索文档:
# Via tool call result = await session.call_tool("search_documents", arguments={ "query": "machine learning applications", "top_k": 5 }) -
使用RAG提示:
# Get search results first, then use in prompt prompt = await session.get_prompt("rag_query_prompt", arguments={ "query": "What are the key findings?", "context_chunks": search_results_text })
系统架构
文档处理管道
- PDF上传 → 使用PyMuPDF/PyPDF2进行文本提取
- 文本组块 → 拆分为重叠的块(1000个字符,200个重叠)
- 嵌入生成 → 使用句子变换器创建向量嵌入
- 存储 → 使用元数据存储在FAISS索引中
存储结构
rag_storage/
├── documents/ # Original extracted text
├── chunks/ # Individual text chunks
├── embeddings/ # Numpy arrays of embeddings
├── faiss_index.bin # FAISS vector index
└── metadata.json # Document and chunk metadata
矢量搜索
- 模型:
all-MiniLM-L6-v2(384个维度嵌入) - 索引:FAISS指数FlatIP(内部产品相似性)
- 搜索:用于语义匹配的余弦相似度
配置
块设置
修改 mcp_server.py:
def _create_text_chunks(text: str, chunk_size: int = 1000, overlap: int = 200):
嵌入模型
更改模型 RAGSystem.__init__():
self.embedding_model = SentenceTransformer('all-MiniLM-L6-v2')
存储位置
设置自定义存储目录:
rag_system = RAGSystem(storage_dir="custom_rag_storage")
api参考
工具
upload_pdf
- 参数:
file_path(str),document_name(可选str) - 退货:文档ID、块计数、成功状态
搜索文档
- 参数:
query(str),top_k(可选int,默认值5) - 退货:按分数对相关块进行排名
list_文档
- 参数:无
- 退货:包含元数据的所有文档列表
删除文档
- 参数:
document_id(str) - 退货:成功状态和确认消息
get_rag_stats
- 参数:无
- 退货:系统统计信息(文档、块、存储大小)
资源
rag://documents
返回系统中所有文档的格式化列表。
rag://document/{document_id}
返回带有元数据标题的指定文档的全文内容。
rag://stats
返回格式化的系统统计信息。
提示
rag_query_prompt
- 参数:
query(str),context_chunks(str) - 退货:基于RAG的QA结构化提示
文档_摘要_空白
- 参数:
document_content(str) - 退货:提示文档摘要
搜索_建议_提示
- 参数:
query(str),available_documents(str) - 退货:提示生成更好的搜索查询
性能注意事项
内存使用
- 嵌入:每个块约1.5KB(384个float32值)
- FAISS指数:与块数呈线性关系
- 文本存储:取决于文档大小和分块
搜索速度
- FAISS指数FlatIP:O(n)搜索时间
- 对于大型集合,请考虑IndexIVFFlat或IndexHNSW
优化提示
- 批量上传 适用于多个文档
- 调整块大小 基于文档类型
- 使用GPU 随着
faiss-gpu对于大型数据集 - 实现缓存 用于频繁查询
故障排除
常见问题
-
PDF文本提取失败:
- 确保PDF不受密码保护
- 尝试不同的PDF文件以隔离问题
- 检查PyMuPDF和PyPDF2的安装
-
大型文档的内存错误:
- 减小块大小
- 分批处理文件
- 监控系统内存使用情况
-
搜索未返回任何结果:
- 验证文档是否已成功上传
- 检查查询与文档内容的相似性
- 尝试更广泛的搜索词
-
服务器连接问题:
- 确保服务器在正确的端口上运行
- 检查防火墙设置
- 验证MCP客户端配置
调试模式
通过修改服务器启用详细日志记录:
import logging
logging.basicConfig(level=logging.DEBUG)
贡献
- 复刻仓库
- 创建要素分支
- 添加新功能的测试
- 提交拉取请求
许可证
该项目根据MIT许可证获得许可。 #� �M�C�P� � �