2026 年,我们用两周重做了一套内部金融知识库的检索链路。这轮工作集中在上个月,基座仍是 Qwen2.5-7B,没有换更大的模型,也没有加 Agent。主验收指标是召回率:起点 78%,完整链路最后稳定在 92%。
把失败样本逐条摊开后,问题大多发生在模型回答之前:PDF 转出来的文本太脏,答案在分块时被截断,条款号没被向量检索抓住,或者相关片段进了候选集,却排不进 Top 10。
所以这两周只动了四个地方:PDF 清洗、分块、BM25 混合检索和 Rerank。
先说明测试口径。除了 78% 的起点和 92% 的最终结果,分块、混合检索和重排环节的数据都来自各自的对照测试,不能首尾相接,算成一条累计增长曲线。任何一个环节变化,都会改变后面的候选集。
500 字切一刀,答案留在了下一块
第一版流程很常见:PDF 转文本,按 500 字固定窗口切块,再写入向量数据库。
金融报告偏偏不适合这么切。表格经常跨页,条款会引用附件,标题、说明和数值也可能被分到相邻的两个块里。
用户问「2026 年 Q2 的流动性覆盖率要求是多少」时,向量检索能找到带有「流动性覆盖率」的片段,但具体数值可能留在下一块。相关内容没有进入候选集,Qwen2.5-7B 自然答不出来。
这是召回问题,不是生成问题。换模型没有用。
织蝶云对 2026 年 RAG 的梳理把固定窗口、单路稠密向量和无重排列为基础向量 RAG 的常见链路,并指出企业文档中容易出现检索不准、表格难解析等问题。我们的失败样本也集中在这些位置。
五种切法摆在一起,94% 没有赢
我们把 5 种分块方式重新跑了一遍:
| 分块方式 | 召回率 | 复测表现 |
|---|---|---|
| 固定窗口切块 | 78% | 以 500 字为窗口,条款和数值容易被拆开 |
| 语义分割切块 | 82% | 按句子边界切分,语义连续性有所改善 |
| Parent-Child | 最高 94% | 小片段负责检索,父文档补充上下文;额外增加 160ms 延迟 |
| Markdown 结构分块 | 88% | 标题、列表清晰时表现较好,遇到 OCR 扫描件会明显下降 |
| 混合切块 | 稳定在 90%-92% | 正文按语义切分,表格和关键条款单独提取 |
Parent-Child 的 94% 很漂亮,但不是现有业务的答案。
小片段命中后再回填父文档,确实更容易补齐上下文,代价是多出 160ms 延迟。金融高频问答对响应时间敏感,回填后的长上下文还会带入更多无关内容,分散 Qwen2.5-7B 的注意力。
最后留下的是混合切块:正文按语义边界处理,表格、指标和关键条款单独存成结构化数据块。它的峰值不如 Parent-Child,稳定性和延迟更符合当前场景。
表里的 78%、82%、94%、88% 和 90%-92% 是分块方案的并行复测结果,不代表召回率按这个顺序逐步上升。完整链路的最终验收结果仍是 92%。
BM25 补上条款号和数字
分块解决的是答案有没有被拆开。下一步,是候选集能不能把它捞回来。
向量检索擅长处理表达差异。用户说「钱不够用怎么办」,它可以找到「流动性风险管理」相关内容。但问题里一旦出现专有名词、条款号或具体数字,单路向量检索就容易漏项,例如「巴塞尔协议 III 第 12 条的具体金额」。
我们在原有链路中加入 BM25,利用词频和逆文档频率补足精确词项检索:
- 向量检索取前 50 条;
- BM25 检索取前 50 条;
- 两组结果去重合并,再交给重排模型。
在这一轮对照测试中,召回率从 82% 提高到 88%。向量结果负责兜住口语化表达,BM25 把条款号、产品名和数字补回来。
CSDN 的 2026 年 RAG 实战优化指南也把分块、检索策略和重排序放在同一条处理链上讨论。单独把某一个参数调得很漂亮,并不能保证最终结果更好。
100 条候选,只让 Qwen 看前 10 条
混合检索扩大了候选范围,也带来了更多噪声。我们用轻量级 Cross-Encoder 对最多 100 条候选片段重新打分,最终只取 Top 10 交给 Qwen2.5-7B。
金融问答里有不少「关键词相同、回答对象不同」的干扰项。用户问某家银行的坏账率,候选结果里可能同时出现全行业平均坏账率。两段文本看起来都相关,真正需要的却只有一段。
加入 Rerank 后,完整链路的召回率从 88% 稳定到 92%。这 4 个百分点发生在排序阶段:相关片段已经进入候选集,Cross-Encoder 负责把它推到 Top 10。
精排交给专用模型,也避免了让 Qwen2.5-7B 逐条比较候选内容。
PDF 清洗不是预处理杂活
金融 PDF 常见水印、隐藏图层、跨页表格和复杂排版。原始文件直接转文本,容易混入乱码、重复页眉和无效字符。后面的分块、向量化和排序,都会继续放大这些噪声。
我们增加了一条 PDF 清洗管线,主要做三件事:去除水印和无效字符、清理隐藏图层、还原表格结构。
按项目内部的清洗口径,同一批文档处理后的文本干净度提高了 30%。这个数字只用于前后对比,不是通用基准。
清洗结果也会影响分块选择。Markdown 结构分块在标题和列表层级完整时能达到 88%,但扫描件经过 OCR 后,标题层级经常丢失。结构一旦不可靠,依赖 Markdown 层级的切法就会失效。
没有固定题库,92% 就没有可比性
我们准备了 500 条 Golden QA,覆盖常见业务问题、边界情况和刁钻提问。每次修改分块、检索参数或排序逻辑,都回到同一批数据上重跑。
题目、知识库和统计口径不变,才能判断一次调整到底有效,还是刚好碰上了更容易的问题。对这次项目来说,固定评估集和检索链路本身同样重要。
最后留下的是这五步
上线采用的处理链并不复杂:
- 清洗 PDF,处理水印、乱码、隐藏图层和表格;
- 使用混合切块,正文按语义切分,表格和关键条款独立存储;
- 向量检索与 BM25 各取前 50 条,去重合并;
- 轻量级 Cross-Encoder 对最多 100 条候选重排,取 Top 10;
- Qwen2.5-7B 根据最终上下文生成回答。
企业级 RAG 产品的落地复盘把相关工作拆成检索前优化、知识库构建和检索后增强。对照这次改动,PDF 清洗与分块属于知识库构建,BM25 和 Rerank 则直接影响检索结果。按环节查问题,比笼统地把责任推给模型更有效。
这次最难的取舍,不是把数字推到 94%,而是决定停在 92%。Parent-Child 的召回率更高,但多出 160ms 延迟和更长的上下文;混合切块配合 PDF 清洗、BM25 与 Rerank,更适合当前金融问答场景。
遇到类似问题,可以先查三个位置:答案是否在分块时被切断,条款号和专有名词是否被向量检索漏掉,相关片段是否已经召回却排在 Top 10 之外。
这两周里,基座模型没有动。78% 到 92% 的差距,主要来自文档质量和检索链路。