这篇教程面向有一定后端基础的读者,目标是用一个周末的时间,搭出一套可以真正用起来的检索增强生成(RAG)系统。整套方案全部基于开源组件,不依赖任何付费 API。
技术选型
- 文档解析:MinerU / Docling,处理 PDF 中的表格与版面
- 向量库:Qdrant,部署简单、过滤能力强
- 嵌入模型:BGE-M3,中文效果好,还支持稠密+稀疏混合检索
- 生成模型:本地 14B 级别模型,或按需替换
- 编排框架:LlamaIndex(结构清晰,方便替换组件)
关键步骤
1. 切分策略比模型更重要。按语义标题切分,而不是死板的 512 token 固定窗口。对中文文档建议保留 10%~15% 的重叠。
2. 混合检索是性价比最高的优化。稠密向量 + BM25 的混合召回,在几乎所有中文评测集上都能带来肉眼可见的提升,实现成本却很低。
3. 重排不能省。召回 Top 50 之后接一个交叉编码重排模型,最终 Top 5 的相关性会有质变。
踩过的坑
表格被切碎后检索基本失效——解决办法是在解析阶段就把表格序列化成 Markdown 再入库;另外,注意给 chunk 加上来源元数据(文件名、章节路径),不然引用溯源会非常痛苦。
完整代码我放在了仓库里,有问题欢迎留言交流。
