在大模型应用落地中企业知识库问答是最常见的场景之一。很多团队的第一版方案通常是把文档切分成片段生成向量用户提问后做向量相似度检索再把检索结果交给大模型生成答案。这就是典型的 RAGRetrieval-Augmented Generation检索增强生成流程。但在真实业务中仅靠“向量召回”往往效果并不稳定。例如用户问“离职员工的年假折算规则是什么”如果知识库中同时存在《员工休假制度》《薪酬结算说明》《离职流程手册》向量检索可能召回语义相近但并非最相关的内容导致大模型回答不准确。因此本文聚焦一个具体问题企业知识库 RAG 中如何通过混合检索 重排序提升答案准确率。一、为什么单纯向量检索不够向量检索的优势是能理解语义相似性例如“离职”与“解除劳动合同”“年假”与“带薪休假”之间存在语义关联。但它也有明显短板。1. 对关键词精确匹配不敏感有些企业制度中会出现非常关键的词例如“年假折算”“离职结算”“未休年假”“按日工资折算”这些词可能决定答案是否正确。如果仅使用向量检索系统可能召回一段整体语义相近但缺少核心关键词的内容。2. 文档切片后上下文丢失企业文档通常包含标题、章节、表格和条款。如果切片过小模型可能只看到某个条款片段看不到它属于哪个制度如果切片过大又会引入太多无关信息影响大模型生成。3. 相似度分数不等于业务相关性向量数据库返回的 topK 结果只表示“语义距离近”并不一定表示“最适合回答问题”。尤其是当知识库中有大量相似制度文档时召回结果容易混杂。二、推荐架构混合检索 重排序比较实用的方案是将 RAG 检索拆成两步粗召回使用向量检索和关键词检索同时召回候选片段精排序使用 reranker 模型对候选片段重新打分选出最相关内容。整体流程如下用户问题 ↓问题改写 / 标准化 ↓向量检索 BM25 关键词检索 ↓候选结果合并去重 ↓Reranker 重排序 ↓选择 TopN 片段 ↓拼接 Prompt ↓大模型生成答案这种方式兼顾了语义理解和关键词精确匹配适合企业制度、产品手册、客服知识库等场景。三、文档切分不要只按固定长度切很多初学者会直接按 500 字或 1000 字切分文档但企业知识库更推荐“结构化切分”。例如一份制度文档一、适用范围二、年假规则 2.1 年假天数计算 2.2 未休年假处理三、离职结算 3.1 离职工资结算 3.2 未休年假折算更合理的切分方式是以章节为单位并保留标题路径json{ title: 员工休假制度, section: 三、离职结算 / 3.2 未休年假折算, content: 员工离职时未休年假可按日工资标准折算...}这样在后续检索时标题和正文都可以参与向量化大模型也能知道片段的上下文来源。一个推荐的片段格式是文档员工休假制度章节三、离职结算 / 3.2 未休年假折算内容员工离职时未休年假可按日工资标准折算计算方式为……这样可以显著减少“大模型拿到片段但不知道片段来自哪里”的问题。四、混合检索的实现思路混合检索一般包括两类召回1. 向量检索向量检索负责语义匹配。例如用户问“离职后没休完的假怎么算”即使文档中写的是“未休年假折算”向量检索也有机会召回相关内容。伪代码如下pythonquery_embedding embedding_model.encode(query) vector_results vector_db.search( embeddingquery_embedding, top_k20)2. BM25 关键词检索BM25 适合处理精确关键词尤其在中文企业文档中很有价值。例如“年假折算”“离职结算”等词一旦命中通常相关性较高。pythonbm25_results bm25.search( queryquery, top_k20)然后将两路结果合并pythoncandidates merge_and_deduplicate( vector_results, bm25_results)这里需要注意不要简单只取向量 top5因为很多关键条款可能出现在 BM25 结果中。五、Reranker提升准确率的关键步骤重排序模型的作用是判断“问题”和“候选片段”之间的真实相关性。它不是只看两个向量距离而是将问题和文档片段一起输入模型输出相关性分数。例如pythonpairs [ [query, doc[content]] for doc in candidates] scores reranker.predict(pairs) ranked_docs sorted( zip(candidates, scores), keylambda x: x[1], reverseTrue)最终只取前 3 到 5 个片段交给大模型pythontop_docs ranked_docs[:5]在企业知识库场景中reranker 往往能明显改善以下问题向量检索召回语义相似但答非所问的内容多个制度文档内容相近难以区分用户问题较短关键词不完整文档中存在大量模板化表述。常用的 reranker 模型包括 bge-reranker、cohere rerank以及一些国产大模型厂商提供的重排序接口。六、Prompt 拼接也要控制格式检索结果进入大模型前建议使用统一格式并明确要求模型“只能基于资料回答”。示例 Prompt你是企业内部知识库助手。请根据以下资料回答用户问题。如果资料中没有明确答案请回答“知识库中未找到明确依据”不要编造。 【资料1】文档员工休假制度章节三、离职结算 / 3.2 未休年假折算内容…… 【资料2】文档薪酬结算说明章节二、离职工资计算内容…… 用户问题离职员工的年假折算规则是什么这样做有两个好处降低大模型幻觉方便前端展示答案引用来源。七、效果评估不要只看“感觉变好了”RAG 优化一定要做评估。可以准备 50 到 100 个真实业务问题人工标注标准答案和对应文档片段。常见指标包括RecallK正确片段是否出现在前 K 个召回结果中MRR正确片段排名是否靠前答案命中率大模型最终回答是否符合标准答案无答案识别率知识库没有答案时模型是否拒答。例如可以对比三种方案方案Recall5答案准确率仅向量检索72%65%向量 BM2584%73%向量 BM25 Reranker91%82%实际项目中reranker 带来的收益通常比较明显尤其是在文档相似度高、制度条款多的场景。八、落地建议最后总结一些实践经验切分时保留标题路径不要只保存正文向量检索 topK 不宜太小建议先召回 20 到 50 条BM25 不要省略中文制度类文档非常依赖关键词reranker 放在候选合并后用于精排Prompt 中要求模型基于资料回答避免自由发挥建立评测集用数据判断优化是否有效。总结企业知识库 RAG 的难点不在于“能不能接上大模型”而在于“能不能稳定检索到正确资料”。如果只依赖向量检索面对制度条款、产品参数、流程说明等复杂文档时很容易出现召回不准的问题。更可靠的方案是结构化切分文档使用向量检索和 BM25 做混合召回再通过 reranker 进行精排序最后将高质量片段交给大模型生成答案。对于企业级知识库问答来说这套方案成本可控、实现难度适中并且能显著提升回答准确率是 RAG 应用从 Demo 走向生产环境的重要一步。