结论先行:中文没有天然词边界,分词方式直接决定召回率,选错了后面每个环节都在为它还债。CJK bigram 把文本按二字滑动窗口切分,既保住单字级的召回面,又兼顾短语精度,是企业中文 RAG 里最稳妥的默认选择。
一、分词的取舍
英文靠空格天然分词,中文没有这个便利,建索引之前必须先回答“按什么粒度切”。这个选择决定了召回率的上限:切法不对,后面检索和排序怎么调都补不回来。还有一条容易被忽视:索引端和查询端必须用同一种切法,两边不一致,索引建得再好也查不中。
按词分词依赖词典,一旦某个术语没被覆盖——新型号、新法规、新机构名——整词就召回不到。在投研、法务这类术语快速更新的语料里,未登录词是常态而非例外,词典永远追不上语料。按单字切则相反:任何字面都能命中,召回面拉满,但候选噪声大、语义被切碎,排序质量跟着下滑,索引体积也被成倍放大。
CJK bigram 是两者的折中:每两个字作为一个 token 滑动切分,例如“营业收入”切成“营业”“业收”“收入”。任意字面组合都能被覆盖,又不至于碎到单字,在召回与噪声之间取得工程上最好用的平衡;索引膨胀的部分交给常规倒排压缩消化,不算它该背的锅。
二、为什么对 RAG 特别重要
企业文档里大量是型号、编号、指标词、法条编号。这些词的语义空间很挤——彼此相近,字面却各不相同——向量检索容易漏,必须靠 BM25 这类字面检索兜底。财报季集中入库时,漏召回会集中爆发:研报标题里的新词、公告里的机构简称,向量一概不认识,而字面匹配不受词典限制。
字面检索的价值可以用一个测试说明:检索冒烟测试里 000001、000002 这类股票代码要做到 10/10 命中,靠的不是语义理解,而是字面匹配的确定性。编号类查询错了就是错的,没有“语义相近”可讲。冒烟测试就该包含这类查询,每次发布前跑一遍,把召回底线钉死。
BM25 的效果直接受分词影响。bigram 让型号片段更容易被字面命中;再配合口语映射改写——把用户口语里的“营收”对齐到文档里的“营业收入”——召回显著提升。分词和改写是 BM25 支路的两个开关,缺一个都会拖后腿。
| 分词方式 | 召回 | 精度/噪声 |
|---|---|---|
| 按词 | 低(未登录词漏) | 高 |
| 按单字 | 高 | 噪声大 |
| CJK bigram | 较高 | 较平衡 |
三、和向量检索互补
bigram 服务于混合检索里的 BM25 支路,与 Dense 向量各取所长:向量负责语义泛化,“换个说法也能找到”;bigram + BM25 负责字面与编号,“一个字都不能错”。两路结果按 1.6 : 1.0 的权重做 RRF 融合,共同托住中文检索的召回底线。权重不是拍出来的:字面支路稳、语义支路浮动,给字面侧更高权重,整体指标更稳。
实际接入时还有两个配套:一是查询侧的意图分类与时间过滤,把明显不该进检索的请求先拦掉;二是评测侧给编号类、术语类查询单独建测试集,别让它们被通用指标平均掉。这两件事都不复杂,却决定 bigram 的收益能不能兑现到业务上。
融合只是中间站:排序质量还要靠 Cross-Encoder 精排兜住,而这一切是否有效,最终要用 HitRate@K、MRR 这类检索指标说话,而不是靠体感。bigram 是这条链路的底层。上层的融合策略见 混合检索;融合之后的精排见 Cross-Encoder 精排;怎么衡量召回好不好,见 RAG 评测三层指标。
真实场景:中文投研查询里的精确词召回
中文 RAG 的召回难点集中在三类查询:公司简称与证券代码(「平安银行」「000001」)、指标简称(「营收」「净利」)、报告期表述(「23 年报」「中报」)。这些词要么不在通用分词词典里,要么会被错误切分——按词切分遇到词典未覆盖的新术语就整体漏召回。CJK bigram 把文本按双字切索引,「营业收入」被切成 营业 / 业收 / 收入 三个 bigram,任何包含这些连续字的查询都能命中,不再依赖词典是否收录。
bigram 解决的是「切得开」,口语映射改写解决的是「听得懂」:用户问「上次那份说营收的」,查询改写把它翻译成包含指标名与报告期的规范查询,两层配合才构成完整的中文检索前处理。这也是混合检索里 BM25 侧权重取 1.6 的原因之一——中文查询里精确词的区分度高于语义泛化,见混合检索:BM25 与 Dense 的融合权重。中文语料的切分策略对检索块的影响,见RAG 切片策略。
常见问题 FAQ
Q1:中文为什么不能像英文那样按空格分词?
中文没有词边界,索引前必须先选定切分粒度。按词分词依赖词典,遇到未覆盖的新术语会整词漏召回;按单字切噪声又太大,所以需要 bigram 这样的折中默认。
Q2:CJK bigram 是什么?
把文本按二字滑动窗口切分,例如“营业收入”切成“营业”“业收”“收入”。任意字面组合都能覆盖,又不至于碎到单字,在召回与噪声之间最平衡。
Q3:bigram 和向量检索是什么关系?
bigram 服务于混合检索里的 BM25 支路,负责字面与编号召回,与负责语义泛化的 Dense 向量互补,两路结果再按权重做 RRF 融合。
Q4:为什么企业中文 RAG 推荐 bigram?
企业文档里型号、编号、法条编号多,向量检索容易漏,要靠 BM25 字面兜底;BM25 效果直接受分词影响,bigram 在召回与噪声间最平衡,是稳妥默认。
需要搭建企业级 RAG 知识库?了解丑梨AI
私有化部署的 RAG 数据工程基座:解析、清洗、脱敏、压缩、切片、治理、评测一站式流水线,全本地推理,数据不出域,单机可部署。