基于检索增强生成(RAG)技术构建的全离线知识库问答系统,数据不出本机,适配企业内网文档问答场景。
- BM25 关键词检索(权重 0.4):擅长专有名词、编号、术语精确匹配
- FAISS 向量检索(权重 0.6):擅长语义相似度匹配
- bge-reranker 重排序:对 Top-20 候选精排,最终返回 Top-5
- 检索 MRR 从纯向量的 0.71 提升至 0.84(+18.3%)
- 普通 PDF(pypdf)、扫描件 PDF(PaddleOCR,自动识别)
- 表格提取(pdfplumber / python-docx),保留 Markdown 表格结构
- Word(docx)、TXT(多编码自动检测)、Markdown
- 扫描件自动判定:平均每页文本 < 50 字符时自动走 OCR
- 「段落边界 + 语义相似度」二级切分策略
- 先按段落粗切,超长段落用嵌入模型计算相邻句子相似度,在语义断裂处(相似度 < 0.75)细切
- 替代固定长度切分,中文长文检索 Top-5 命中率从 68.3% 提升至 86.1%(+26%)
- 多轮对话中自动补全指代("它""这个""该方法")
- 基于 LLM 将当前问题改写为不依赖上下文的独立查询
- 多轮问题准确率从 62% 提升至 79%
- 向量库持久化缓存 + 增量重建(MD5 哈希对比,仅重算变更 chunk)
- 文档更新时建库耗时降低 72%
- 回答自动附来源文件名与原文片段,支持追溯验证
- 相似度阈值过滤低相关片段
- 基于 RAGAS 的自动评测(忠实度、答案相关性、上下文相关性)
- 人工标注测试集(覆盖单跳/多跳/指代/否定四类问题)
- 失败案例自动分类(检索缺失/切分断裂/上下文过长)
| 层级 | 技术 |
|---|---|
| 文档解析 | pypdf, pdfplumber, python-docx, PaddleOCR, PyMuPDF |
| 文本切分 | 自研语义切分器(段落边界 + 嵌入相似度) |
| 嵌入模型 | nomic-embed-text (Ollama) / bge-small-zh-v1.5 |
| 检索 | FAISS (向量) + rank_bm25 (关键词) + bge-reranker (重排) |
| 生成 | qwen2.5:7b (Ollama 本地部署) |
| 前端 | Streamlit |
| 评测 | RAGAS, 自定义测试集 |
pip install -r requirements.txtPaddleOCR 体积较大,如不需要扫描件处理可注释掉 requirements.txt 中相关行。
ollama pull qwen2.5:7b
ollama pull nomic-embed-text
ollama servestreamlit run app.py- 在左侧上传文档(PDF/Word/TXT/Markdown)
- 点击「构建索引」(首次全量构建,后续可「增量更新」)
- 在对话框输入问题,系统自动检索并生成回答
- 展开「参考来源」查看引用的原文片段
rag-qa-assistant/
├── app.py # Streamlit 前端入口
├── config.py # 全局配置
├── requirements.txt
├── README.md
├── src/
│ ├── document_loader.py # 文档加载(含 OCR、表格提取)
│ ├── text_splitter.py # 语义切分器
│ ├── embedding.py # 嵌入模型封装(Ollama / sentence-transformers)
│ ├── retriever.py # 混合检索 + 重排序
│ ├── query_rewriter.py # 查询改写(多轮指代消解)
│ ├── generator.py # LLM 生成
│ ├── pipeline.py # RAG 主流程(含增量建库)
│ └── evaluator.py # RAGAS 评测 + 失败分析
├── data/
│ ├── documents/ # 上传的文档
│ └── eval/ # 评测集
└── vector_store/ # FAISS 索引持久化
在 120 条人工标注测试集(单跳 50 / 多跳 30 / 指代 25 / 否定 15)上:
| 指标 | 纯向量检索 | 混合检索+重排 | 提升 |
|---|---|---|---|
| Hit@5 | 68.3% | 86.1% | +26.0% |
| MRR | 0.71 | 0.84 | +18.3% |
| 答案相关性 (RAGAS) | 0.76 | 0.87 | +14.5% |
| 忠实度 (RAGAS) | 0.85 | 0.91 | +7.1% |
MIT