嵌入模型选不好会怎样:中文检索质量的社区经验
-
很多中文知识库项目的失败,不是大模型不会回答,而是第一步检索就错了。用户问“发票抬头怎么改”,系统召回“发票下载”;用户问“未成年人退款规则”,系统召回“成年人会员退款”;用户输入产品型号、错误码、人名、学校名、法规条款,向量检索返回一堆语义相近但证据不对的片段。最后生成模型只能在错误上下文上编答案,界面看起来流畅,结果却不可信。
embedding 模型选型是中文检索的地基。模型不合适,后面再调提示词、换大模型、加长上下文、换向量数据库,都只是缓解症状。社区里常见的经验是:英文场景表现不错的 embedding,到了中文业务资料、混合中英术语、口语化提问、表格字段、代码文档和跨语言检索时,质量可能突然下滑。更麻烦的是,这种下滑不一定会报错,系统仍然能返回结果,只是返回错结果。
本文从社区实践角度复盘“嵌入模型选不好会怎样”。重点放在中文检索、embedding 选型、中文分词、跨语言检索、混合检索和评测集。它不是模型排行榜复述,而是帮助你识别真实系统里的检索事故:问题是出在模型、切分、索引、召回、重排、分词、评测,还是资料本身。
一、坏 embedding 的第一种后果:召回看似相关,证据实际不对
中文检索最危险的失败,是“看起来差不多”。用户问“如何取消自动续费”,系统召回“如何开通自动续费”;用户问“退课多久到账”,系统召回“买课后多久到账”;用户问“账号注销后数据保留多久”,系统召回“账号冻结后数据保留多久”。这些片段在语义空间里很近,但业务含义相反或条件不同。
生成模型看到这些片段后,往往会给出自信回答。因为片段里确实有相关词,句子也通顺。读者不一定马上发现错误,直到按答案操作失败。对客服、教育、医疗、金融、法律和政务场景,这种错误比“没有答案”更危险。没有答案至少会提醒用户换问题;错证据会让用户相信错误流程。
坏 embedding 还会造成“同主题误召回”。中文资料里,很多概念共享词根。例如“退款”“退费”“退课”“退货”“退订”“退税”,模型可能觉得都接近。业务上它们却属于不同流程,涉及不同时间、责任人、材料和审批。若资料切分又把条件拆散,系统更容易把相邻但不适用的规则当成依据。
另一个常见问题是反义和否定。中文里“不支持”“暂不支持”“仅支持”“禁止”“除外”“不得”“无需”“必须”都是关键限制。embedding 召回如果只抓主题,忽视否定和限制词,就会把“支持线下退款”和“不支持线下退款”都排到前面。生成模型再做摘要时,可能合并出一个不存在的规则。
解决这类问题,不能只调高 topK。topK 越大,噪声越多。更稳的方式是建立带标准证据的问题集,检查正确片段是否进入候选;引入精确词检索处理关键名词和限制词;使用 reranker 对候选进行二次排序;在回答阶段强制引用直接证据。检索系统的目标不是“返回相关话题”,而是“返回能支撑答案的证据”。
二、第二种后果:中文专有名词和业务短语被稀释
中文业务资料里有大量专有短语:产品名、套餐名、校区名、课程名、制度名、活动名、药品名、政策名、功能模块名。这些词未必出现在通用 embedding 的训练重点中。模型如果不理解它们,就会把词拆成普通语义,导致召回漂移。
比如“星火计划”“青苗班”“智学通”“轻享版”“小微企业数电票”“高企认定”“三方存管”“双减课后服务”,这些词在具体社区或企业里是明确对象。通用模型可能只捕捉“计划”“班”“企业”“服务”等泛化含义,忽略真正的实体边界。结果是用户查某个项目,系统召回另一个名字相似的项目。
中文没有天然空格,词边界更依赖分词、语料和上下文。向量模型虽然不一定显式依赖传统分词,但 tokenizer 仍会影响表示。全文检索更直接受分词影响。若分词器把“数电票”拆成“数”“电票”,把“统一身份认证”拆得过碎,BM25 也会失去精确匹配优势。
社区里常见的改法是加入业务词典。对全文检索,jieba 的自定义词典、Elasticsearch 的 smartcn 或 IK 分词配置、HanLP 等工具都可以帮助保留词边界。对向量检索,业务词典不能直接改变模型语义,但可以通过字段增强、标题继承、实体别名、关键词索引和混合召回来补足。比如片段元数据里保留标准产品名、别名、拼音缩写和英文缩写。
专有名词还需要别名治理。用户可能输入“数电票”“数字发票”“全电票”“电子发票”,也可能输入产品内部简称。embedding 有时能拉近这些表达,有时不能。更稳的做法是维护别名表,在检索前做查询扩展,同时保留原查询做精确检索。不要完全依赖模型“自己理解所有叫法”。
三、第三种后果:长文档和表格被压成模糊语义
很多中文知识库来自 PDF、Word、表格、制度文件、FAQ 和网页。坏 embedding 往往与坏切分一起出现。长文档被按固定字数切开后,标题、条件、例外、表格列名和脚注分散到不同片段。embedding 模型只能看到局部文本,无法判断片段真正适用范围。
表格尤其容易出事。比如一张“各渠道退款时效表”,行是渠道,列是条件、到账时间、手续费和备注。若解析后变成一段没有列名的文字,模型可能把不同渠道的时效混在一起。用户问“微信支付退款多久到”,召回片段里同时出现支付宝、银行卡和企业转账,生成模型就可能答错。
政策文件也类似。一个条款前半段写适用对象,后半段写例外条件,下一条写审批流程。固定长度切分可能把“适用对象”和“例外条件”分开。用户问具体场景时,系统召回了规则但漏了例外,答案就会过度承诺。
embedding 模型本身也有上下文长度和长文本能力差异。BGE-M3、jina-embeddings-v3、Qwen3 Embedding 等模型都强调长上下文或多粒度能力,但这不代表可以把整份制度直接塞进去。长上下文 embedding 能缓解长片段表示问题,却不能替代文档结构解析。标题层级、表格坐标、条款编号、页码和版本仍然要保留。
社区实践里,长文档检索通常要做多粒度索引。文档级摘要用于粗召回,章节级片段用于主题定位,条款级或行级片段用于证据引用。表格要保留行列标题和单位。回答必须引用到可核验位置,而不是只引用一个大段落。坏 embedding 的问题,很多时候是被坏文档结构放大了。
四、第四种后果:跨语言检索失灵
中文技术社区和企业资料经常中英混合。用户可能用中文问“怎么配置回调地址”,文档里写
webhook callback URL;用户问“令牌过期”,代码和接口文档里写token expired;用户问“向量重排”,资料里写rerank、cross-encoder或late interaction。如果 embedding 模型跨语言对齐不好,就会漏召回。跨语言检索不是“模型支持中文”这么简单。它要求中文查询和英文文档、英文查询和中文文档、混合术语和缩写都落在可比较的向量空间。multilingual-E5、BGE-M3、jina-embeddings-v3、Qwen3 Embedding 这些模型都在多语言检索上做过专门训练或评测,通常比只面向英文优化的模型更适合中英混合知识库。
但多语言模型也不是万能。某些模型在公开 MTEB 或 C-MTEB 上分数高,到了具体行业仍会失误。原因可能是行业词不在训练分布里,文档里有大量缩写,中文问题很口语化,或者英文资料是代码、日志和配置。跨语言检索必须用本地问题集验证,不能只看排行榜。
跨语言检索还会遇到翻译歧义。比如“备案”可以是 ICP filing,也可以是 record filing;“对账”可以是 reconciliation;“开票”可以是 invoicing;“工单”可以是 ticket。模型可能找到语义上近但业务上错的英文概念。若系统在查询前自动翻译,更要保留原中文查询,避免翻译损失。
一个实用方案是三路召回:原中文查询做向量检索,查询扩展后的中英术语做全文检索,必要时加入受控翻译查询做补充。对召回结果再用 reranker 排序,并让答案引用原文。这样能降低跨语言漏召回,也能避免翻译结果独占检索入口。
五、第五种后果:向量相似度高,却无法解释为什么
向量检索的一个社区痛点是可解释性。BM25 命中哪些词,比较容易看;向量相似度为什么高,通常不直观。坏 embedding 会让系统返回高分但不相干的片段,运营和工程人员很难判断问题在哪里。
这种情况在中文短文本里很常见。用户问题很短,比如“怎么解绑”“发票错了”“一直转圈”“没有到账”。短查询缺少实体和条件,向量检索会用泛化语义找一堆相似问题。若没有会话上下文、业务入口和元数据过滤,召回结果看似合理却无法支撑具体回答。
日志和代码场景也会出现高分错配。错误码、函数名、配置键、路径和版本号不一定有丰富语义。向量模型可能把相似报错描述拉近,却漏掉唯一关键字段。用户查
ERR_AUTH_401,结果召回一堆认证失败概念文档,但真正包含错误码的片段排在后面。此时全文检索比向量检索更可靠。可解释性需要在系统层补足。每条结果应显示来源、标题路径、片段 ID、BM25 分、向量分、rerank 分、命中的关键词、更新时间和权限过滤。社区里排查检索质量时,最怕只有最终答案,没有召回轨迹。没有轨迹,就不知道该换模型、改切分、加词典、调权重还是补资料。
一个好的检索排查页面不面向最终用户,但对团队很重要。它能输入一个问题,展示多路召回结果,标记哪些被重排选中,查看原文位置,并记录人工判断。最终用户界面只需要清晰答案和引用;团队内部需要完整证据链。二者不要混在一起。
六、embedding 选型先看任务,不先看榜单
选 embedding 模型之前,先定义任务。中文检索到底是在做 FAQ 问答、政策条款、商品搜索、代码搜索、论文检索、客服工单、教育题库、法律文书、医疗资料、跨语言文档,还是聊天记忆?不同任务对模型要求不同。
FAQ 问答通常需要短查询匹配短答案,重点是意图和同义表达。政策条款需要精确条件和引用,重点是不能漏限制词。商品搜索需要实体、属性、型号、品牌和同义词。代码搜索需要函数名、路径、注释、调用和英文术语。论文检索需要长标题、摘要、术语和跨语言。聊天记忆需要时间、人物和事件。一个模型不可能在所有任务里都以同样方式胜出。
模型选型至少看七个维度。第一,中文能力,尤其是简体、繁体、口语、专业词和长句。第二,多语言能力,是否支持中英互查和混合术语。第三,检索任务表现,不要只看分类或聚类平均分。第四,上下文长度和长文档表示能力。第五,向量维度、存储成本和延迟。第六,部署方式,是 API、私有化还是本地推理。第七,许可证、数据合规和可持续维护。
OpenAI 的
text-embedding-3-small和text-embedding-3-large提供成熟 API 和可调维度,适合需要托管服务和稳定接口的项目。BGE 系列尤其是 BGE-M3 在开源中文和多语言社区里常被作为本地默认选择之一,它支持 dense、sparse 和 multi-vector 多种表示。multilingual-E5 有明确的多语言训练路线和不同尺寸。Jina embeddings v3 强调多语言、多任务和 8192 token 长上下文。Qwen3 Embedding 在中文、多语言和代码检索评测中表现突出,并提供不同参数规模。但选型不能只看“谁分数最高”。大模型可能延迟高、显存占用大、成本高;小模型可能在本地够快但召回不稳;API 模型省运维但有数据出境和费用问题;开源模型可控但需要部署和批处理优化。对中文社区项目来说,最稳的路线是先选两到四个候选模型,用本地评测集跑真实查询,再决定默认方案。
七、中文分词仍然重要
很多人以为有了 embedding,中文分词就不重要了。实际社区经验恰好相反:只要系统包含全文检索、BM25、关键词高亮、过滤、统计、同义词、实体识别和混合检索,分词仍然是基础工程。
中文没有空格,搜索系统必须决定“南京市长江大桥”怎么切,“未成年人退款”怎么切,“高新区管委会”怎么切,“小程序支付回调”怎么切。切错以后,BM25 召回会受影响。对向量检索来说,分词器不直接参与相似度计算,但文档清洗、标题提取、关键词字段和查询扩展仍然会用到词边界。
jieba 的优点是简单、可自定义词典、社区使用广;Elasticsearch smartcn 集成 Lucene 的中文分析能力,适合 ES 体系;HanLP 更偏完整 NLP 工具链,适合需要实体、词性和更复杂分析的场景。选择哪一个不是信仰问题,而是看系统语言、部署、性能和可控性。
业务词典是中文检索的低成本提升点。把产品名、课程名、学校名、城市区域、政策名、错误码、接口名、功能名、行业术语加入词典,可以显著减少精确检索漏召回。词典还要维护别名和停用词。比如“AI”“人工智能”“大模型”可能是同义词;“系统”“平台”“功能”在某些场景里是低价值词。
分词也会带来风险。过度自定义会让词典膨胀,召回变窄;错误同义词会把不同业务合并;停用词删除不当会丢失否定词,比如“不”“无”“非”“未”。中文检索里,否定词往往很关键,不能像普通停用词一样随意删。
因此,分词优化要和评测集绑定。每次加词、同义词或停用词,都跑真实查询,看 Recall@K、MRR、nDCG 和人工标注是否改善。没有评测的词典优化,很容易从“经验调参”变成“越调越乱”。
八、混合检索不是万能,但通常是中文系统的起点
纯向量检索擅长语义相近,纯关键词检索擅长精确匹配。中文业务系统两者都需要。用户有时问自然语言问题,有时输入错误码、政策编号、产品型号、合同条款、人名或缩写。只用一种检索方式,都会有明显短板。
Weaviate、Elasticsearch、Qdrant、Milvus 等文档都强调混合检索:把 BM25 或 sparse 检索与 dense vector 检索结合,再用融合或重排得到最终排序。社区常见做法是 BM25 召回一批,向量召回一批,合并去重后用 RRF、加权分数或 reranker 排序。BGE-M3 这类模型还能同时提供 dense、sparse 和 multi-vector 表示,为混合检索提供模型层支持。
混合检索的价值在于互补。精确词命中可以保证错误码、型号、姓名、条款号不丢;向量检索可以找到同义表达、口语化问题和跨语言资料;reranker 可以在候选集中重新判断问题与片段是否真正匹配。对中文知识库来说,这是比“只调向量 topK”更稳的基线。
但混合检索不是打开开关就好。BM25 分数和向量分数尺度不同,直接相加可能不合理;RRF 依赖排名,可能忽略分数差距;固定权重不适合所有问题。查询里有错误码时,应提高关键词权重;查询很口语时,应提高语义权重;查询包含产品名和操作意图时,两者都重要。
混合检索还依赖文档质量。若 PDF 解析把表格搞乱,BM25 和向量都会受伤;若切分丢标题,向量召回会缺主题;若分词错,关键词召回会漏;若元数据缺失,系统无法限定产品、版本和权限。混合检索是召回策略,不是文档治理替代品。
九、重排器解决“候选多但排序差”
embedding 检索通常是第一阶段召回,目标是不要漏掉可能相关的候选。第一阶段为了速度,往往使用单向量相似度,无法细致比较问题和片段。重排器负责第二阶段,把几十到几百个候选重新排序,判断哪些最能回答问题。
重排器可以是 cross-encoder、LLM reranker、多向量 late interaction 或模型自带 rerank 系列。它通常比向量检索慢,但更准确,因为它同时看查询和候选文本。对中文长条款、否定条件和相似 FAQ,重排器能显著减少“主题相关但答案不对”的问题。
Qwen3 系列同时提供 embedding 和 reranker,BGE 也有 reranker 模型,Jina 有 reranker 模型。实际选择时,要关注中文能力、最大输入长度、延迟、批处理、部署成本和是否支持中英混合。不要只把 reranker 当作“最后加分项”,它经常决定 RAG 系统是否能从“能搜到话题”变成“能搜到证据”。
重排也需要评测。若第一阶段召回已经漏掉正确片段,重排器救不了;若候选里有正确片段但排在后面,重排器才有用。因此评测要分层:先看 Recall@50 判断召回,再看 nDCG@10 或 MRR@10 判断排序。只看最终答案无法定位问题。
重排输入也要克制。把太长片段塞给 reranker,会增加成本并稀释重点。更好的方式是保留标题路径、关键段落、表格行列和必要上下文,让重排器比较完整证据而不是整篇文档。对代码和日志,还要保留文件路径、函数名和错误码。
十、评测集是中文检索质量的核心资产
没有评测集,embedding 选型就是凭感觉。社区里很多争论,比如“某模型中文更好”“某模型跨语言更强”“某模型向量维度太大不划算”,如果没有本地问题集,都只能算经验。评测集让团队能用自己的资料、自己的问题、自己的标准比较模型。
一个中文检索评测集至少包含三部分:问题、标准证据、不可接受证据。问题来自真实用户搜索、客服问答、运营反馈、工单、产品 FAQ、课程问答、日志排障和人工设计的边界题。标准证据是应该召回的文档片段、条款、表格行或代码位置。不可接受证据是容易混淆但不适用的片段,例如相似产品、旧版本、反向规则和过期政策。
问题类型要覆盖真实分布。需要有短查询、长问题、口语问题、错别字、同义词、专有名词、英文缩写、中英混合、否定条件、时间条件、版本条件、表格查询和跨语言查询。只用标准 FAQ 问句评测,会高估系统能力。真实用户不会按文档标题提问。
指标可以从简单开始。Recall@K 表示正确证据是否进入前 K 个候选;MRR 看第一个正确证据排第几;nDCG 适合多个相关证据;Precision@K 看前 K 个噪声多不多。对 RAG 回答,还要评估引用是否支撑答案、答案是否忠实、是否遗漏限制条件。MTEB、C-MTEB、MMTEB 这类公开基准有参考意义,但本地评测集更能反映业务质量。
评测集要持续更新。每次用户反馈“答错了”,不要只改提示词,应把问题加入评测集,标注正确证据。每次新增资料域,也补对应问题。每次换 embedding、改切分、加分词词典、调混合权重、换 reranker,都跑评测。这样检索系统才会稳定进步。
十一、公开榜单怎么用
MTEB 是通用文本 embedding 评测的重要基准,覆盖检索、语义相似度、分类、聚类、重排、摘要等任务。C-MTEB 更关注中文 embedding,覆盖多类中文任务。MMTEB 扩展到更多语言。它们的价值在于提供统一比较框架,让团队快速筛掉明显不适合的模型。
但公开榜单不是最终答案。第一,榜单平均分可能混合多种任务,而你的系统只关心中文检索。第二,公开数据和你的行业资料差异很大。第三,模型可能对常见公开任务优化较多。第四,部署参数、池化方式、归一化、指令模板和量化方式都会影响实际结果。第五,排行榜更新频繁,不同版本之间不一定可直接比较。
使用榜单的正确方式,是缩小候选范围。比如先选一个托管 API 模型、一个中等开源模型、一个强中文多语言模型和一个轻量本地模型。然后在本地评测集上比较召回、排序、延迟、成本和部署复杂度。不要因为某个模型在榜单上高一分,就忽略它的推理成本和许可证。
论文和模型卡也要认真读。E5 模型常要求 query 和 passage 使用不同前缀;某些模型需要特定 instruction;Qwen3 Embedding 在使用方式上有模型卡说明;有些 GGUF 或量化版本可能与官方结果不同;有些模型支持 Matryoshka 降维,有些不支持。使用方式错了,再强的模型也会表现很差。
社区经验里,一个常见事故是“模型不错,但接法错了”。没有归一化、池化方式错、少了查询前缀、截断太短、批处理混入空字符串、量化损失过大、文档和查询用了不同模型、重建索引不完整,都会让检索质量掉得像换了坏模型。选型时要同时验证模型和接入实现。
十二、中文检索事故排查顺序
当用户反馈“搜不到”或“答错了”,不要马上换大模型。可以按顺序排查。第一,看原始资料是否存在正确答案。很多问题不是检索失败,而是资料缺失、过期或写得含糊。
第二,看解析是否正确。PDF 是否乱序,表格是否丢列名,网页是否混入导航,代码是否切断函数,图片 OCR 是否错字。解析错了,embedding 只能索引垃圾。
第三,看切分是否保留证据边界。标题、条款、表格行、代码函数、问答对是否完整。片段太短会丢条件,太长会噪声过大。
第四,看检索候选。正确证据是否进入 top50。如果没有,优先查模型、分词、查询扩展、元数据过滤和索引更新。如果进入了但排名靠后,优先查重排和融合权重。
第五,看权限和版本过滤。很多“搜不到”其实是用户无权限,或者系统默认过滤了旧版本;很多“答错”其实是召回了过期文档。元数据过滤要在调试页面显示。
第六,看生成阶段。若检索证据正确但回答错,问题可能在提示词、引用约束、上下文过长或模型总结能力。此时才考虑调整生成模型和回答策略。
这个顺序能避免盲目调参。embedding 选不好确实会造成大问题,但不是所有检索问题都该归咎于 embedding。社区里成熟的做法,是把检索链路拆开看,用证据定位。
十三、代码知识库里的 embedding 特殊问题
中文社区也常把代码仓库接入知识库,让用户用中文问“这个接口在哪里鉴权”“支付回调失败怎么排查”“前端保存按钮调哪个 API”。代码检索比普通文档更复杂,因为代码里大量内容是英文符号、路径、类型和调用关系。
如果 embedding 模型不擅长代码或跨语言,中文问题很难命中英文函数。用户问“续期登录态”,代码可能是
refreshSessionToken;问“防止重复提交”,代码可能是idempotencyKey;问“审查订单权限”,代码可能是authorizeOrderAccess。这时只靠中文语义检索不够,需要符号索引、全文检索、调用图和代码 embedding 结合。代码索引还要保留仓库上下文。文件路径、模块名、导出符号、测试文件、接口文档和最近提交都影响答案。向量片段如果只保存函数体,不保存路径和调用方,模型可能知道这段代码做什么,却不知道它在系统里如何生效。
测试驱动和代码审查智能体也离不开检索质量。助手要修 bug,必须先找到相关测试和实现;审查智能体要判断风险,必须找到调用方、权限边界和数据模型。坏 embedding 会让代码助手改错文件、补错测试、漏掉真正风险。对 AI 代码助手来说,检索质量就是工程质量的一部分。
因此,代码知识库最好不要只用通用中文 embedding。至少要混合代码符号检索、路径检索、全文检索和适合代码的向量模型。中文问题可以先做术语扩展,再查符号和文档。最终回答引用到仓库、文件和行号,而不是只给自然语言解释。
十四、权限、隐私和回滚也影响 embedding 选型
embedding 选型不只是质量问题,还有权限和隐私问题。若使用外部 API 生成向量,原文会发送到供应商。公开文档问题不大,内部合同、客户资料、学生数据、医疗记录、代码仓库和商业计划就需要严格评估。托管模型省运维,但数据边界要清楚。
本地开源模型可控性更高,但要承担部署成本。GPU、批处理、队列、监控、模型升级和索引重建都需要工程能力。对小社区站点,可以先用 API 模型验证;对私有资料和长期知识库,更适合评估 BGE、E5、Jina、Qwen 等可本地部署方案。
权限过滤必须在检索前执行。不同用户、组织、项目、版本和资料等级应先过滤,再做向量或混合检索。不能把无权限片段交给生成模型,再要求它不要泄露。embedding 本身不懂权限,权限是索引和查询系统的责任。
回滚也要考虑 embedding。换模型后,旧向量和新向量不能混用;调整维度后,索引结构可能要重建;改切分策略后,引用位置会变化;加词典和同义词后,BM25 结果会变化。每次改检索链路,都要保留旧索引版本或可重建流程。否则上线后质量下降,团队很难快速恢复。
生产系统应记录每个片段使用的解析版本、切分版本、embedding 模型、向量维度、索引时间和来源版本。用户反馈错误时,才能复盘当时的检索环境。没有这些元数据,检索质量问题会变成无法重现的口水仗。
十五、一个务实选型流程
第一步,整理二十到五十个真实中文问题。不要从模型榜单开始,而是从用户会问什么开始。问题里要有专有名词、短查询、口语、中英混合、否定条件、表格问题和跨语言问题。
第二步,标注标准证据。每个问题至少标出一个正确片段,最好再标出容易混淆的错误片段。没有标准证据,无法判断模型好坏。
第三步,选候选模型。可以选择一个 API 模型,例如 OpenAI
text-embedding-3-large或text-embedding-3-small;一个开源中文多语言模型,例如 BGE-M3;一个 multilingual-E5;一个 Jina 或 Qwen3 Embedding。候选不必太多,先覆盖部署形态和能力差异。第四步,固定解析和切分。不要一边换模型一边换切分,否则不知道提升来自哪里。先用同一批片段生成向量,比较 Recall@10、Recall@50、MRR 和人工判断。
第五步,加入全文检索。用中文分词和业务词典建立 BM25 基线。很多团队会惊讶地发现,在错误码、型号、条款号和产品名问题上,BM25 仍然很强。
第六步,做混合检索和重排。比较向量单路、BM25 单路、RRF 融合、加权融合和 reranker 后排序。看哪些问题提升,哪些问题下降。不要只看平均分,要看失败案例。
第七步,测成本和延迟。模型分数高但延迟不可接受,不能直接上线。评估批量生成、增量索引、查询并发、内存、磁盘和向量库成本。中文社区项目经常预算有限,性价比很重要。
第八步,小流量灰度。上线后记录用户搜索、召回结果、点击来源、追问和反馈。把错误案例回流到评测集。embedding 选型不是一次购买,而是持续质量工程。
十六、社区经验总结
第一,中文检索不要迷信纯向量。向量检索能处理语义,但对精确词、否定、型号、条款、代码符号和专有名词不够稳定。混合检索通常是更好的起点。
第二,模型分数不能替代本地评测。MTEB、C-MTEB 和模型卡能帮你筛候选,但不能证明它适合你的资料。真实问题集才是最终裁判。
第三,中文分词和业务词典仍然有价值。它们不只是旧式搜索技术,而是精确召回、混合检索和可解释调试的基础。
第四,长文档先治理结构。解析、标题、表格、条款和引用位置不处理好,换再强 embedding 也会召回错误证据。
第五,跨语言检索要专门测。中文问题查英文资料、英文缩写查中文文档、中英混合日志查中文说明,都是高频场景。多语言模型要用真实问题验证。
第六,重排器经常比换生成模型更有效。检索候选里已有正确证据但排序靠后时,reranker 是关键工具。
第七,保留检索轨迹。没有来源、分数、命中词、模型版本和索引版本,团队无法调质量。最终用户不需要看调试字段,但工程团队必须能复盘。
第八,embedding 升级要有回滚。模型、维度、切分和词典变化都会影响结果。生产系统要能重建旧索引,也要能解释新旧差异。
选 embedding 模型,看似是模型问题,实际是中文检索工程问题。模型要选,分词要做,混合检索要调,评测集要建,权限和版本要管。只有把这些连起来,中文知识库才不会停留在“能搜出一些东西”,而是能稳定找到正确证据。
十七、几个典型中文检索失败场景
第一个场景是政策问答。用户问“灵活就业人员能不能补缴去年的社保”,资料里有“单位职工补缴”“灵活就业参保”“当年补缴”“跨年补缴”多篇文章。坏 embedding 可能只抓住“补缴社保”,把单位职工规则排到前面。答案看起来有政策味道,但适用对象错了。这个场景需要条款级切分、适用对象元数据、时间条件过滤和高质量重排。
第二个场景是教育课程。用户问“青苗班请假后课时怎么恢复”,资料里有“青苗班退费”“菁英班请假”“青苗班补课”“普通班课时冻结”。模型如果不理解班型名,就会把“请假”和“课时”相关资料混在一起。这里业务词典和别名表非常关键,同时要把班型、校区、课程版本作为元数据。
第三个场景是企业内部知识库。用户问“数电票红冲要谁审批”,资料里有财务制度、发票开具指南、旧版纸质发票流程和税务局公告。纯向量检索可能召回税务通用说明,却漏掉企业内部审批角色。这个场景不能只看语义相关,还要看资料权威等级。正式制度和当前流程应优先于旧公告和讨论记录。
第四个场景是客服工单。用户问“钱扣了但是订单没出来”,工单里有大量相似描述:支付成功未回调、订单创建失败、库存锁定失败、优惠券占用、银行短信延迟。坏 embedding 会把“扣钱”和“订单”相关工单全召回。真正有用的是错误码、支付渠道、时间窗口和订单状态字段。这里需要结构化过滤和日志字段,而不是只靠文本相似度。
第五个场景是开发文档。用户问“webhook 为什么验签失败”,文档里有签名算法、回调地址配置、重试机制、密钥轮换和示例代码。若模型只召回“回调失败重试”,答案会建议等待重试,实际问题可能是签名基串拼接错。开发文档要保留代码块、参数名、错误码和版本,全文检索与代码检索同样重要。
第六个场景是社区帖子。用户问“本地模型跑中文 RAG 为什么答非所问”,帖子里既有真实经验,也有过期参数、个人猜测和广告。embedding 只负责相似度,不负责可信度。社区内容进入知识库时,需要来源等级、时间、点赞或采纳状态、人工精选和过期标记。否则系统会把旧经验当成当前最佳实践。
这些场景共同说明一件事:坏 embedding 的后果不是单点错误,而是整条回答链路偏离。召回错了,重排可能救不回来;证据错了,生成模型越会写,误导性越强;引用错了,用户更难发现问题。中文检索必须把模型、分词、元数据、资料等级和评测结合起来看。
十八、上线前应做的中文检索验收
中文知识库上线前,至少要做一次面向真实问题的验收。不要只用“上传文档后问三个标题问题”证明可用。标题问题通常最容易命中,不能代表真实用户。验收问题应来自实际搜索词、客服记录、社群问题、产品文档留言和运营反馈。
验收第一项是正确证据召回。随机抽取一百个问题,人工标注标准证据,检查正确片段是否进入前十和前五十。如果前五十都没有,说明召回层有问题;如果前五十有但前十没有,说明排序或重排有问题;如果前十有但答案仍错,说明生成和引用约束有问题。
验收第二项是混淆样本。专门设计相似但不适用的问题,例如“退款”和“退货”,“注销”和“冻结”,“不支持”和“支持”,“试用版”和“正式版”,“旧政策”和“新政策”。检索系统如果不能区分这些样本,日常使用一定会出错。混淆样本比普通样本更能暴露 embedding 弱点。
验收第三项是精确词样本。把错误码、条款号、产品型号、接口名、文件名、人名和地名放进问题里,看系统是否优先命中包含这些精确词的片段。若向量结果压过精确命中,混合权重就需要调整。中文系统里,精确词常常是答案入口。
验收第四项是跨语言样本。用中文问题查英文文档,用英文缩写查中文说明,用中英混合问题查代码和配置。只要知识库里存在英文术语,就必须做这项验收。跨语言失败不会在中文 FAQ 样本里暴露,等开发者或高级用户使用时才会出现。
验收第五项是版本和权限样本。用普通用户、管理员、项目成员、非项目成员分别提问,看是否只召回有权限且当前有效的资料。embedding 不负责权限,索引系统必须负责。若无权限片段进入生成上下文,安全风险已经发生。
验收第六项是无答案样本。准备一些知识库没有覆盖的问题,系统应能明确说明没有找到可靠依据,而不是从相似资料里硬编。一个检索系统是否成熟,不只看它能答多少问题,也看它能否识别“不该回答”的问题。
这些验收不需要一开始做得很复杂。哪怕只有五十个问题,只要包含标准证据和混淆样本,也比没有评测强得多。上线后继续把用户反馈加入评测集,中文检索质量才会从一次性选型变成持续改进。
十九、模型升级时如何避免质量倒退
embedding 模型升级很诱人。新模型分数更高、维度更灵活、上下文更长、中文能力更强,看起来应该直接替换。但生产系统里,升级 embedding 等于重建检索空间,不能像换普通配置一样随手改。
升级前要冻结评测集。用当前线上模型跑一遍,记录每个问题的召回结果、排序、答案引用、延迟和成本。再用新模型在同一批资料上重建索引,跑同一批问题。只看平均分不够,要看哪些问题变好,哪些问题变坏。特别关注高频问题、高风险问题和曾经出错的问题。
升级时要保留双索引窗口。新旧索引同时存在,小流量灰度到新模型,记录用户点击、反馈和无答案率。若质量下降,可以快速切回旧索引。不要覆盖旧向量后才发现问题,因为此时回滚需要重新批量生成,恢复时间会很长。
升级还要检查维度和归一化。模型维度变化会影响向量库 schema、存储成本和查询参数;是否需要归一化会影响相似度计算;查询前缀、文档前缀、instruction、截断长度和池化方式都可能变化。很多质量倒退不是新模型差,而是接入细节没跟着改。
升级后要重新校准混合权重。新 embedding 的分数分布可能不同,原来的向量和 BM25 权重不一定合适。reranker 输入也可能需要调整片段长度。不要假设“只换向量,其他不变”一定稳定。
最后,要向内容团队同步变化。某些资料原本靠关键词命中,新模型可能更依赖语义;某些旧文档和新文档语义接近,版本字段就更重要。embedding 升级不是纯技术动作,它会改变用户找到知识的方式。只有评测、灰度、回滚和反馈闭环都在,升级才算稳。
参考资料
- OpenAI Embeddings 文档:https://platform.openai.com/docs/guides/embeddings
- OpenAI 新 embedding 模型介绍:https://openai.com/blog/new-embedding-models-and-api-updates
- BGE-M3 官方文档:https://bge-model.com/bge/bge_m3.html
- BAAI/bge-m3 Hugging Face 模型卡:https://huggingface.co/BAAI/bge-m3
- BGE-M3 论文:https://arxiv.org/abs/2402.03216
- Multilingual E5 论文:https://arxiv.org/abs/2402.05672
- intfloat/multilingual-e5-large 模型卡:https://huggingface.co/intfloat/multilingual-e5-large
- Jina embeddings v3 模型卡:https://huggingface.co/jinaai/jina-embeddings-v3
- Jina embeddings v3 论文:https://arxiv.org/abs/2409.10173
- Qwen3 Embedding 官方博客:https://qwenlm.github.io/blog/qwen3-embedding/
- Qwen3 Embedding 论文:https://arxiv.org/abs/2506.05176
- MTEB 官方组织与榜单入口:https://huggingface.co/mteb
- C-MTEB 论文:https://arxiv.org/abs/2309.07597
- Weaviate Hybrid Search 文档:https://weaviate.io/developers/weaviate/concepts/search/hybrid-search
- Elasticsearch Hybrid Search 文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text-hybrid-search.html/
- Qdrant Hybrid Search 文档:https://qdrant.tech/documentation/concepts/hybrid-queries/
- Elasticsearch Smart Chinese Analysis 文档:https://www.elastic.co/docs/reference/elasticsearch/plugins/analysis-smartcn
- jieba 中文分词项目:https://github.com/fxsjy/jieba