一、承接上篇:文档能转能盖能去,但检索还靠翻找
上篇把向量底座——本地 BGE 嵌入模型、ChromaDB 与外部 Milvus——搭好了,检索的地基打牢了。可当文档堆成库,人依然靠"打开—搜索—翻页"找答案,效率低且易漏。我们要让工具直接回答问题。(嵌入模型、向量库与外部接入的底座细节已在上阶段讲透,本篇聚焦上层的混合检索与 RAG 编排。)
二、痛点:纯语义检索的三重陷阱
把"宪法第 X 条修正案"和"宪法"混淆,年份 / 版本 / 条款号搅在一起,答非所问;
大模型幻觉,回答无依据,在企业场景里尤其危险;
企业知识必须隔离,绝不能泄漏到公网。
三、技术核心:本地向量库 + 混合检索
底座是 ChromaDB 持久化 + 本地 BGE-large-zh-v1.5(1024 维,CPU/CUDA 自适应,禁止联网下载),并预留可插拔 VectorStore(Milvus / Qdrant)。
检索层用混合策略保精度:
BM25(中文二元词组):保留"年份 / 第 X 条 / 编号"这类精确词,不被向量模糊掉;
向量语义:兜住同义表达;
RRF 加权融合 + 本地确定性重排序:兼顾召回与排序稳定。
架构上做 LangChain 迁移(ChatPromptTemplate / Runnable / SQLiteChatMessageHistory 长期记忆)。多模式(思考 / 人工客服 / 法律 / 自定义)各自绑定独立 System Prompt 与独立向量库,元数据隔离维度为 knowledge_scope / user_key / conversation_id / document_id。
入库做 MD5 精确去重,提取年份 / 版本元数据并支持年份敏感检索;BGE 入库后显式释放 GPU 显存(共享实例 + RLock + reset)。离线查询重写保留年份 / 条款号。审计 trace 可溯源,API Key 用 DPAPI 加密脱敏,防泄漏。
混合检索(示意):BM25 + 向量 + RRF 融合
results = rrf_fuse(bm25_search(q), # 保留精确词
vector_search(q), # 语义兜底
weights=…) # 加权融合
四、踩坑实录:GPU、显存与漏检
选了 CUDA 却没用上 GPU:装的是 torch CPU 版,且 Runtime 没消费 device 配置。换 torch cu128 并真正消费配置后生效。
BGE 不释放显存,阶梯增长:改为共享单一 Embedding 实例 + 显式释放,显存回落。
法律文档漏检:重写提示词,强制保留文件名 / 年份 / 版本 / 条款号,禁止模型"自行回答或加事实",并给 Reranker 增加标题 / 类型匹配。
附件"已就绪但模型未读":逐层验证 上传→解析→会话记录→原文直读→Prompt→模型→SSE;数据库方法签名漂移导致直读 TypeError;异常处理器自身抛 NameError 掩盖原始异常——均修。
混合检索为什么比纯向量更稳
纯向量检索的软肋,恰恰是企业文档的高频诉求:精确的词(年份、第 X 条、编号)会被语义模糊掉,"宪法第 X 条修正案"和"宪法"就混了。所以我们用 BM25(中文二元词组)守住精确词,用向量兜住同义,再用 RRF 加权融合 + 本地确定性重排序平衡两者。可插拔 VectorStore(Milvus / Qdrant)预留,底座仍是本地 ChromaDB + BGE-large-zh-v1.5,禁止联网下载。
多模式(思考 / 人工客服 / 法律 / 自定义)各自绑定独立 System Prompt 与独立向量库,元数据按 knowledge_scope / user_key / conversation_id / document_id 隔离,知识不串门。入库 MD5 精确去重、提取年份/版本元数据做年份敏感检索;BGE 入库后显式释放 GPU 显存(共享实例 + RLock + reset),避免阶梯增长。
很多团队上检索问答的第一步就栽在检索不准:用户问的是某一年某一条的具体条款,模型却答成了泛泛的概念。问题不在模型,而在检索层把精确信息模糊掉了。我们用混合检索把这件事掰回来——精确的年份、条款号交给关键词,语义相近的说法交给向量,两者再融合排序,答案才站得住脚。对企业知识来说,宁可保守一点、答得准,也别为了聪明而胡说。
本地知识库的意义,是把散落各处的文档,变成随时能对话的资产。我们坚持混合检索,本质上是承认一件事:纯语义检索在企业场景里不够可靠,精确信息必须被守住。多模式隔离则保证了不同业务的知识不串门,合规上站得住。但能力再强,一旦多人使用,就必须有权限管控与稳定运行兜底——这是终章要收尾的话题。检索准了,问答才敢用。知识被隔离好、对外不泄露、对内可溯源,工具才算真正可信,这也是本地化最硬的底气。
本阶段使用建议
法律/条款类文档,强制在查询与提示词里保留文件名、年份、版本、条款号;
选了 CUDA 就装 torch cu128 并真正消费 device 配置,别让 GPU 空转;
附件"已就绪但模型未读"时,逐层验证 上传→解析→会话记录→原文直读→Prompt→模型→SSE;
API Key 用 DPAPI 加密脱敏,审计 trace 可溯源,防泄漏。
五、小结
本地 RAG 的灵魂是"可控":检索可控、知识隔离可控、显存与合规可控。它把文档从"存档"变成"可对话的资产"。
下期预告:底座稳了、检索准了,功能再强,一旦多人、跨机使用,没有权限管控和稳定运行兜底,前面所有能力都是空中楼阁。下一篇讲权限安全与一键部署(终章)。
标签:#RAG #ChromaDB #BGE #混合检索 #知识库