智能问答系统

基于MCP协议和ChromaDB的端到端智能问答系统,支持PDF/TXT文件上传、语义检索和生成带引用的答案。

  • by MuskanKhandelwal
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 MuskanKhandelwal/mcp-agentic-rag

使用说明

MCP-代理型RAG(或可译为:基于MCP的代理型检索增强生成系统)

端到端(E2E),生产级 代理型检索增强生成(Agentic RAG) 由……提供支持/驱动 MCP(模型上下文协议), ChromaDB(可译为“色度数据库”或根据具体语境保留原名), OpenAI(开放人工智能研究所),以及一个干净的 Streamlit(注:这是一个专有名词,通常不翻译,直接保留原样,但在中文语境下,有时也会根据上下文进行适当解释或说明,如“Streamlit是一个用于快速创建数据应用的工具”) UI——全部集成在Docker中。

上传PDF/TXT文件 → 语义分块与嵌入 → 快速向量搜索(使用Chroma)→ MCP工具 → 带内引用的基于证据的综合 → 浏览器中呈现美观的答案。


✨ 这个项目为何脱颖而出


特点/特性

  • 上传 .txt / .pdf 并通过Streamlit查询它们。
  • 由……支持的向量存储 Chroma PersistentClient(持久化客户端) (数据存储在磁盘上的路径为 ./chroma_db)。
  • 带有嵌入(或“嵌入式”的) all-MiniLM-L6-v2 (384维,快速,通用型)。
  • 答案综合为 OpenAI聊天完成接口。
  • MCP服务器暴露工具:
    • document_search → 色彩查询(可选择仅限最近上传的内容)
    • web_search → Serper.dev 降级方案(如未命中任何文档)


📁 项目布局

agentic_rag_mcp/
├─ docker-compose.yml
├─ Dockerfile.backend           # FastAPI API
├─ Dockerfile.server            # MCP server (FastMCP + Chroma)
├─ Dockerfile.streamlit         # Frontend
├─ backend.py                   # /upload_document, /query
├─ working_mcp_server.py        # FastMCP server + tools
├─ streamlit_app.py             # UI
├─ load_data.py                 # PDF/TXT ingestion → chunks + metadata
├─ chroma_db/                   # persisted vectors (gitignored)
├─ uploaded_docs/               # last uploads (scoped search)
├─ mcp_config.yaml              # MCP config
└─ requirements.txt

快速入门(Docker)

  1. 设置环境 (创建 .env (在仓库根目录中):
OPENAI_API_KEY=sk-...
SERPER_API_KEY=serper_...
MCP_URL=http://mcp-server:8000/mcp
OPENAI_MODEL=gpt-4o
  1. 构建并运行
docker compose up --build
  1. 打开应用程序

上传一个 .pdf 或者 .txt提出问题,并获得附有引用来源的切实答案。


🔧 它的工作原理(端到端)

  1. 摄入

    • /upload_document 接受 .pdf 并且 .txt提取文本,带有元数据的块(source, page, chunk_id),并写入到 色度 (意大利语)通过;经由;途径 PersistentClient(path="./chroma_db")数据持久保存在磁盘上。 (色度文档)
  2. 嵌入

  3. 检索

    • MCP工具 document_search 查询Chroma(带有去重和评分的前k名),返回标准化的匹配结果(文本、来源、页面、评分)。MCP(模型连接协议)规范了应用程序如何将模型连接到工具/数据。 (模型上下文协议)
  4. 综合;合成

    • 如果存在命中(即匹配到某些条件或数据),后端会提示OpenAI 聊天完成(或对话完成) 回答 仅根据上下文 带内联(或“内联式”) [n] 引文(低温相关)。 (OpenAI(开放人工智能研究所))
  5. 备用网页

    • 如果你的语料库中没有答案, web_search (MCP工具) 调用 Serper.dev 以获取最优质的有机结果。 (serper.dev)
  6. 前端


🧪 API 接口

POST(邮政、帖子、发布、后端等,具体含义需根据上下文确定) /upload_document/

  • 形式: file 等于 .pdf 或者 .txt
  • 回答: { "message": "... (N chunks)" }
  • 注释:对后续查询进行范围限定 最近上传 超精准问答的资源。

POST(邮政、邮寄、发帖) /query/

  • 正文: { "question": "..." }

  • 回答:

    {
      "answer": "string",
      "sources": [
        {"source": "file.pdf", "page": 3, "score": 0.92, "text": "..."}
      ]
    }
    

🧰 MCP 工具(服务器)

  • document_search(query, top_k=8, sources: Optional[List[str]]) → {"answer","hits"}

    • 从Chroma中读取数据,去重,按距离排序→打分,尽可能进行合成。
  • web_search(query) → {"hits":[{"title","link","snippet"}]}

    • 电话;呼叫 Serper.dev (需要 SERPER_API_KEY)。

MCP提供了一种标准化、可组合的方式来向AI应用暴露工具和数据。


⚙️ 环境变量

  • OPENAI_API_KEY – 用于合成(聊天完成)。
  • OPENAI_MODEL – 默认 gpt-4o。
  • SERPER_API_KEY – 作为网页的备用方案。
  • MCP_URL – 默认为 http://mcp-server:8000/mcp。
  • 可选: CHROMA_PATH (默认值 ./chroma_db)。

🧭 本地开发(无需 Docker)

航站楼A — MCP服务器

python working_mcp_server.py

B航站楼 — 后端(FastAPI)

uvicorn backend.py:app --reload --port 8001

C航站楼 — 前端(Streamlit)

streamlit run streamlit_app.py

🔒 评审者注意事项

  • MCP 将工具的功能与界面隔离;客户端通过标准协议调用工具。这种分离使得系统具有可组合性,并且更容易扩展(例如,无需更改用户界面即可添加新工具)。
  • Chroma PersistentClient(可译为“Chroma 持久化客户端”) 将向量保存在磁盘上,以便快速重启并提高本地开发的友好性。
  • 内置文档与用户体验: FastAPI 自动生成交互式文档于 /docsStreamlit 为非技术人员提供了简洁的用户界面。

🧩 路线图/发展蓝图

  • 添加 OCR(光学字符识别) 对于扫描的PDF文件
  • 重排序器 (交叉编码器)用于提升前k项性能
  • 流媒体传输 将令牌传递给用户界面(UI)
  • 评估工具集(或评估框架) (忠实性/相关性)
  • 多文件作用域控制 (标签,按集合过滤)
  • 同一接口下的可选本地模型(Ollama/NIM)

📝 要求

看见 requirements.txt 对于关键库(FastAPI、Streamlit、ChromaDB、Sentence-Transformers、OpenAI、httpx)。官方文档供参考:FastAPI、Streamlit、OpenAI API、Chroma、Sentence-Transformers。


🙏 致谢


📚 参考文献

  • 模型上下文协议(官方)—— modelcontextprotocol.io。
  • MCP 概述(克劳德文档)。
  • ChromaDB 持久化客户端。
  • SentenceTransformers: 全MiniLM-L6-v2 模型卡片。
  • Serper.dev 搜索API。
  • FastAPI 文档。
  • Streamlit(可直接译为“斯特莱姆利特”,但通常作为专有名词保留原样) st.file_uploader。
  • OpenAI聊天完成API。

许可证

麻省理工学院(或您选择的其他机构)。根据需要替换此部分。