检索增强生成系统

一个基于模型上下文协议(MCP)构建的检索增强生成(RAG)系统,用于存储、处理和搜索PDF文档。

  • by nitin-kumar101
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 nitin-kumar101/MCP

使用说明

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的问答提示
  • 文档_摘要_空白:创建文档摘要提示
  • 搜索_建议_提示:生成更好的搜索查询建议

安装

  1. 安装依赖项:

    pip install -r requirements.txt
    
  2. 下载所需型号: 系统将在首次使用时自动下载句子转换器模型。

用法

启动服务器

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 -退出客户端

工作流示例

  1. 上传PDF:

    # Via tool call
    result = await session.call_tool("upload_pdf", arguments={
        "file_path": "/path/to/document.pdf",
        "document_name": "My Research Paper"
    })
    
  2. 搜索文档:

    # Via tool call
    result = await session.call_tool("search_documents", arguments={
        "query": "machine learning applications",
        "top_k": 5
    })
    
  3. 使用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
    })
    

系统架构

文档处理管道

  1. PDF上传 → 使用PyMuPDF/PyPDF2进行文本提取
  2. 文本组块 → 拆分为重叠的块(1000个字符,200个重叠)
  3. 嵌入生成 → 使用句子变换器创建向量嵌入
  4. 存储 → 使用元数据存储在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

优化提示

  1. 批量上传 适用于多个文档
  2. 调整块大小 基于文档类型
  3. 使用GPU 随着 faiss-gpu 对于大型数据集
  4. 实现缓存 用于频繁查询

故障排除

常见问题

  1. PDF文本提取失败:

    • 确保PDF不受密码保护
    • 尝试不同的PDF文件以隔离问题
    • 检查PyMuPDF和PyPDF2的安装
  2. 大型文档的内存错误:

    • 减小块大小
    • 分批处理文件
    • 监控系统内存使用情况
  3. 搜索未返回任何结果:

    • 验证文档是否已成功上传
    • 检查查询与文档内容的相似性
    • 尝试更广泛的搜索词
  4. 服务器连接问题:

    • 确保服务器在正确的端口上运行
    • 检查防火墙设置
    • 验证MCP客户端配置

调试模式

通过修改服务器启用详细日志记录:

import logging
logging.basicConfig(level=logging.DEBUG)

贡献

  1. 复刻仓库
  2. 创建要素分支
  3. 添加新功能的测试
  4. 提交拉取请求

许可证

该项目根据MIT许可证获得许可。 #� �M�C�P� � �