使用说明
MCP-代理型RAG(或可译为:基于MCP的代理型检索增强生成系统)
端到端(E2E),生产级 代理型检索增强生成(Agentic RAG) 由……提供支持/驱动 MCP(模型上下文协议), ChromaDB(可译为“色度数据库”或根据具体语境保留原名), OpenAI(开放人工智能研究所),以及一个干净的 Streamlit(注:这是一个专有名词,通常不翻译,直接保留原样,但在中文语境下,有时也会根据上下文进行适当解释或说明,如“Streamlit是一个用于快速创建数据应用的工具”) UI——全部集成在Docker中。
上传PDF/TXT文件 → 语义分块与嵌入 → 快速向量搜索(使用Chroma)→ MCP工具 → 带内引用的基于证据的综合 → 浏览器中呈现美观的答案。
✨ 这个项目为何脱颖而出
- 设计即自主: 用途 MCP工具 (
document_search,web_search因此,您的RAG(检索增强生成系统)不仅可以检索文本,还可以调用功能——MCP(多协议控制器/接口)是一个开放标准,常被描述为“AI应用的USB-C”模型上下文协议) - 带有行内引用的可靠答案: 提示限制了大型语言模型(LLM)以 仅使用提供的上下文 并且添加
[1],[2]引用风格。 (OpenAI(开放人工智能研究所)) - 快速本地向量存储: ChromaDB(注:这是一个专有名词,直接翻译为“色度数据库”可能不够准确,具体含义需根据上下文确定,但在此处保持原样以尊重原文) 带有/和……一起 持久客户端 — 您的嵌入向量存储在磁盘上,重启后仍能保留。 (Chroma Docs(可译为“色彩文档”或根据具体语境调整为更贴切的名称,如“色彩资料库”等))
- 优秀的默认嵌入表示: 全MiniLM-L6-v2 (384维) 用于快速、高质量的语义搜索。 (Hugging Face(一个提供机器学习模型和工具的平台))
- 网页备用方案: 当你的语料库无法回答时,就回退到(使用) Serper.dev(可译为“瑟珀开发平台”或根据具体语境调整,但“Serper.dev”本身作为一个专有名词,通常直接保留原样) 谷歌搜索API。 (serper.dev)
- 简洁、雅致的用户界面: 单文件 Streamlit(注:这是一个专有名词,通常直接音译,表示一个用于快速构建数据应用的Python库) 支持拖放上传的应用程序。 (docs.streamlit.io(可译为:“Streamlit官方文档网站”,但通常直接保留原网址形式,因为网址本身即为明确指示))
- 快速的类型化后端: FastAPI 服务
/upload_document并且/query具有清晰的JSON格式和内置文档,位于/docs.(fastapi.tiangolo.com(可译为“FastAPI官方文档网站”或保持原样作为网址使用))
特点/特性
- 上传
.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)
- 设置环境 (创建
.env(在仓库根目录中):
OPENAI_API_KEY=sk-...
SERPER_API_KEY=serper_...
MCP_URL=http://mcp-server:8000/mcp
OPENAI_MODEL=gpt-4o
- 构建并运行
docker compose up --build
- 打开应用程序
- Streamlit 用户界面:
http://localhost:8501 - API文档:
http://localhost:8001/docs(FastAPI 自动文档)。 (fastapi.tiangolo.com(可译为:“FastAPI官方网站(由Tiangolo提供)”或保持原样作为网址,根据语境决定是否需要具体翻译网址内容))
上传一个 .pdf 或者 .txt提出问题,并获得附有引用来源的切实答案。
🔧 它的工作原理(端到端)
-
摄入
/upload_document接受.pdf并且.txt提取文本,带有元数据的块(source,page,chunk_id),并写入到 色度 (意大利语)通过;经由;途径PersistentClient(path="./chroma_db")数据持久保存在磁盘上。 (色度文档)
-
嵌入
- 用途 SentenceTransformers
all-MiniLM-L6-v2(384维向量)用于实现紧凑、高效的语义搜索。 (Hugging Face(注:这是一个专注于自然语言处理模型的平台,直译为“拥抱脸”,但通常保留原名以体现其专业性和品牌特色))
- 用途 SentenceTransformers
-
检索
- MCP工具
document_search查询Chroma(带有去重和评分的前k名),返回标准化的匹配结果(文本、来源、页面、评分)。MCP(模型连接协议)规范了应用程序如何将模型连接到工具/数据。 (模型上下文协议)
- MCP工具
-
综合;合成
- 如果存在命中(即匹配到某些条件或数据),后端会提示OpenAI 聊天完成(或对话完成) 回答 仅根据上下文 带内联(或“内联式”)
[n]引文(低温相关)。 (OpenAI(开放人工智能研究所))
- 如果存在命中(即匹配到某些条件或数据),后端会提示OpenAI 聊天完成(或对话完成) 回答 仅根据上下文 带内联(或“内联式”)
-
备用网页
- 如果你的语料库中没有答案,
web_search(MCP工具) 调用 Serper.dev 以获取最优质的有机结果。 (serper.dev)
- 如果你的语料库中没有答案,
-
前端
- Streamlit(斯特林) 处理拖放上传功能(
st.file_uploader) 并以可折叠的来源显示答案。上传的字节数据在内存中可用;您在摄入之前需要将其持久化存储。 (docs.streamlit.io(注:这是一个网址,直接翻译为中文保持原样,意为“Streamlit文档网站”))
- Streamlit(斯特林) 处理拖放上传功能(
🧪 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)。
- 电话;呼叫 Serper.dev (需要
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。
🙏 致谢
- MCP(多用途指挥官/模块化指挥平台/最小认知单元等,具体含义需根据上下文确定) 社区与文档。 (模型上下文协议)
- ChromaDB(可译为“色度数据库”,但具体翻译可能需根据上下文调整,若“ChromaDB”是特定产品或项目的名称,建议保留原名) 为了打造一个优秀的本地优先向量存储解决方案。 (Chroma Docs(可译为“色度文档”或根据具体上下文调整为更贴切的名称,如“色彩文档”等,但“色度文档”是较为直接的翻译))
- 句子变换器(或句子转换模型) 为了获得可靠的嵌入表示。 (Hugging Face(可译为“拥抱脸”或保持原名,根据上下文决定是否意译))
- Serper.dev 对于一个简单、快速的Google搜索API。 (serper.dev(该域名本身在中文中没有直接对应的翻译,但可以理解为“一个提供某种服务或功能的开发平台或网站”,具体含义需结合上下文或网站内容来确定))
📚 参考文献
- 模型上下文协议(官方)—— modelcontextprotocol.io。
- MCP 概述(克劳德文档)。
- ChromaDB 持久化客户端。
- SentenceTransformers: 全MiniLM-L6-v2 模型卡片。
- Serper.dev 搜索API。
- FastAPI 文档。
- Streamlit(可直接译为“斯特莱姆利特”,但通常作为专有名词保留原样)
st.file_uploader。 - OpenAI聊天完成API。
许可证
麻省理工学院(或您选择的其他机构)。根据需要替换此部分。
