一个面向“政策/制度类文档”的 RAG 单体仓库(monorepo),包含共享包、离线入库、在线检索/对话 API 与前端界面。
- Milvus 2.4+ 作为向量库,collection 默认
policy_chunks - 向量检索:BAAI/bge-m3(1024 维,L2 normalize,Milvus metric=IP)
- 稀疏检索:Milvus Sparse + BM25(若不可用自动降级 dense-only)
- 融合:BM25 + Dense 各自 TopK,应用侧做 RRF(k=60)
- 重排:BAAI/bge-reranker-v2-m3
- LLM:Qwen API(DashScope OpenAI compatible),SSE 流式输出
- PDF 解析:unstructured
partition_pdf(strategy="hi_res", infer_table_structure=True) - 表格 OCR:Pix2Text 输出
table_md,整表=1 chunk - 公式 OCR:pix2tex(LaTeX-OCR,保守触发)
- 双文本版本:
- Milvus
content = retrieval_text(检索用) - Milvus
metadata.llm_text = 可读原文(Markdown 表格 + LaTeX)
- Milvus
- 引用定位:固定格式
p{page} ¶{para_id},标题不占号 - 文档标识:
doc_id = PDF 二进制 SHA1 前10位
src/policy_rag_shared/共享包(配置、常量、schema、工具)src/ingest_worker/离线解析/切分/OCR/向量入库src/rag_api/在线检索与对话 API(FastAPI)web/vite-app/前端(Vite + React,Chat + Debug)docker/milvus/Milvus 运行配置
conda create -n policy-rag python=3.11 -y
conda activate policy-rag
pip install -e .macOS:
brew install poppler tesseractLinux: 使用包管理器安装 poppler-utils、tesseract-ocr。
复制 .env.example 为 .env 并填写:
MILVUS_URI/MILVUS_COLLECTIONDASHSCOPE_API_KEY/QWEN_BASE_URL/QWEN_MODELEMBED_MODEL/RERANK_MODELTOP_K/RETRIEVE_K/RRF_KCHUNK_*、API_PORT、CORS_ORIGINS等
docker compose -f docker/milvus/docker-compose.yml up -dingest-worker ingest --input ./data/pdfs --rebuilduvicorn rag_api.app:app --reload --port 8000cd web/vite-app
npm i
npm run dev- Ingest Worker:
- PDF 解析 → 分段/合并 → OCR → 生成 chunk → 向量化 → Milvus 入库
- RAG API:
/search返回检索结果与候选列表/chatSSE 流式输出(含检索引用)
- Web UI:
- Chat:对话 + 证据栏
- Debug:查看候选分数与内容
--rebuild会重建 collection(v1 策略为全量重建)。- 模型加载采用懒加载,避免 import 时重操作。
- OCR 与模型推理耗时较高,首次运行可能较慢。
