











VipRAG 是一个面向小规模正式服务的中文医学指南检索增强生成(RAG)项目。系统使用在线 MinerU 解析 PDF、DashScope 生成文本向量、Qdrant 检索、MySQL 保存文档与任务 状态,并通过千问生成带来源的回答。以《中国心血管病风险评估和管理指南.pdf》做为知识库,构建RAG系统,模拟生产环境,部署成多人使用、长期运行的 FastAPI 服务,直接采用 Qdrant 向量库
LangChain — RAG 构建知识库(理论)
Python 项目部署(Linux)
各大向量数据库对比(Vector Database)
Dify — Chatflow - 文档知识库 -- 本文是它的代码版
项目不需要 GPU
项目分两个部分知识库构建、用户问答
可以理解成,把上次搞的 Dify — Chatflow - 文档知识库 用代码手搓了一遍
知识库构建 → 上传 PDF → FastAPI → MySQL ingestion_job
↓
独立 Worker
↓
MinerU API → Markdown 缓存
↓
LangChain 切分 → DashScope Embeddings
↓
Qdrant
用户问题 → DashScope Embeddings → Qdrant 检索 → 千问 → 答案与来源
FastAPI 和入库工作进程是两个独立进程。PDF 解析不会占用 API 请求,也不会因 API 重启而丢失。MinerU 返回的 ZIP 和 Markdown 会保存在 data,重新向量化时无需 再次消耗 MinerU 额度。
FastAPI
独立 Worker
状态变化为:
pending → processing → indexing → ready
↘ failed
只有状态为 ready 的文档才应视为可查询。重复上传内容完全相同的 PDF 会根据SHA-256 返回已有文档,不会再次调用 MinerU。
MySQL 保存 knowledge_bases、documents 和 ingestion_jobs。文档由知识库与SHA-256 共同标识,因此重复上传具有幂等性。文档状态在 pending、processing、indexing、ready 或 failed 之间转换。任务保留供应商任务 ID、尝试次数和经过清理的错误信息。
每个 Qdrant 点包含分块文本以及 knowledge_base_id、document_id、document_version、filename、title_path、MinerU 提供时的页码信息、chunk_index、content_hash 和 status。检索按知识库和 status=active 过滤。
忽略安装过程,Windows可参考: Windows 安装 UV
运行 FastAPI
uv sync
uv run uvicorn app.main:app --reload
另开终端启动入库工作进程:
uv run python -m app.worker
本地直接运行时需要自行启动 MySQL 和 Qdrant,并将 .env 中的主机名从 Compose
服务名改为本机地址。
| 方法 | 路径 | 用途 |
|---|---|---|
GET |
/health/live |
进程存活检查 |
GET |
/health/ready |
运行时依赖已装配 |
POST |
/api/v1/knowledge-bases/{id}/documents |
上传 PDF |
GET |
/api/v1/documents/{id} |
查询入库状态 |
POST |
/api/v1/answer |
检索并生成回答 |
{knowledge_base_id} 用户自己定义 如:cardiovascular
curl.exe -X POST "http://localhost:8000/api/v1/knowledge-bases/{knowledge_base_id}/documents" `
-F "file=@app/resources/中国心血管病风险评估和管理指南.pdf;type=application/pdf"

返回:
{
"document_id": "b86beaf7-fe81-4ed8-8492-9fb7dfafdb39",
"knowledge_base_id": "vipsoft",
"filename": "中国心血管病风险评估和管理指南.pdf",
"status": "pending",
"version": 1,
"created": true,
"error_message": null
}

切块后入Qdrant向量库

curl.exe "http://localhost:8000/api/v1/documents/{document_id}"

curl.exe -X POST "http://localhost:8000/api/v1/answer" `
-H "Content-Type: application/json" `
-d '{"knowledge_base_id":"{knowledge_base_id}","question":"心血管疾病膳食营养有哪些?"}'

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。