面向技术文档的检索增强问答系统:121 篇文档切成 1557 个检索块,BGE 语义向量 + BM25 两路召回、RRF 融合,答案带「文档 > 章节 > 小节」引用;检索不到依据时明确拒答而不是硬编。20 条标注问题实测混合检索 Hit@1 0.938、Hit@3 1.000、MRR 0.969,拒答准确率 100%,单次问答 64 ms,模型与索引随包离线可跑。
技术栈
Python、Django、RAG、BGE、BM25、jieba
功能模块
- 混合检索:BGE-small-zh 512 维语义召回 + BM25 词面召回,RRF 按名次融合后按「文档 + 章节」去重,引用不重复、排序更稳
- 可溯源引用:每条回答附 4 张引用卡片,标明文档名、章节路径、原文片段与余弦相似度,点文档名可回原文逐块核对
- 可解释拒答:相似度双阈值 0.45/0.70,中间区间再看「实体词是否出现在召回片段」与「是否属于知识库词表」,四条域外问题全部拦下
- 查询扩展:20 组领域同义词把「父子组件怎么传值」「页面打开太慢」映射为 Props / Emits / 代码分割,口语问法首条命中率明显提升
- 检索调试页:同一问题三列并排对比纯向量、纯 BM25 与混合 RRF,顶部显示同义词扩展命中的术语,排序差异一眼可见
- 效果评测页:20 条标注问题(16 正例 + 4 域外)一键跑出 Hit@1、Hit@3、MRR、拒答准确率,并逐条列出实际首条命中的文档
- 工程实现:清洗层保护代码块与 script setup 语法糖 这类转义标签,切块带章节路径;索引为 NumPy 矩阵 + pickle,不依赖向量数据库,断网可跑
- 知识库浏览:121 篇文档按字数与块数列表,点进去可逐块查看原文与章节路径,写论文核对引用时最直接
运行环境
- 编程语言:Python 3.8
- Web 框架:Django 4.2
- 嵌入模型:BGE-small-zh-v1.5(512 维,97MB,本地随包,离线加载)
- 检索:NumPy 向量内积 + BM25 + RRF 融合;jieba 分词
- 数据库:SQLite(仅存问答日志,免安装)
- 前端:原生 HTML + CSS + JavaScript(服务端渲染,无构建步骤)
- 数据规模:121 篇文档 / 1557 个检索块 / 平均 262 字 / 索引约 5MB
- 启动方式:双击启动脚本,或 python3 manage.py runserver 8091
界面截图






文档预览
交付的任务书、开题报告与论文均为 Word 文档,下面是真实页面预览:



交付内容
- 完整源码(清洗、切分、嵌入、BM25、RRF、查询扩展、拒答判据、评测共 10 个模块)
- 121 篇语料与已建好的索引(免重建,直接可问)
- 本地 BGE 嵌入模型(97MB,断网可运行)
- 毕业设计任务书(Word)
- 毕业设计开题报告(Word)
- 毕业论文(Word,七章制,含检索对比、拒答测试、性能与失败案例分析)
- 系统使用与二次开发说明(Word + md)、20 条评测集与评测脚本
- 运行截图 6 张 + 功能演示视频(76 秒)