搭建 RAG 系统时,多数工程师第一步便开始研究该选哪个 embedding 模型,其实这个顺序恰好反了。

我见过不止一个团队,在 text-embedding-ada-002 和 bge-m3 跑了无数次 benchmark,又在不同选择之间来回横跳,到头来系统效果仍不好。真正的问题出在 chunking,压根不是 embedding。
去年有位朋友负责内部知识库 RAG,产品提出了“用户问什么都能答”的要求。他在前两周只做了这件事:
最终 top-3 召回率达到 78%,他认为已经基本够用。
上线两周后,用户关于“答非所问”的 ticket 接连出现。他检查 log 后发现,命中的 chunk 虽然语义相关,却只是文档中的孤立段落;由于缺乏上下文,模型根本给不出有用答案。
上下文会完全割断,是因为 chunk 切得太碎,而非 embedding 不准。
一个常被忽略的现实是:在通用文本任务中,主流 embedding 模型之间的性能差距已经很小。
糟糕的 chunking 策略会直接打掉 20% 的指标;相比之下,2025 年 MTEB 榜单前 10 名之间,top-3 召回率普遍只相差 3% 以内。
优化 chunking 策略只花两天,收益可能有 +20%;embedding 选型即使投入两周,可能也只有 +3%。
需要调整的是优先级,并非否定 embedding 的重要性。
最常见的起步选择是固定长度切分(fixed-size chunking),但它也会最快触及瓶颈。
实测中,下面几种策略的收益更加稳定:
不存在通用银弹,重点是借助评估集量化各类策略的差异,而非凭感觉不断更换。
多数 RAG 项目最缺少的正是这一环。
缺少评估集,就等于只凭肉眼观察一个黑盒。调整 chunking 后究竟变好还是变差?改变 retrieval 策略是否产生回归?这些都无法判断。
最小可行评估闭环可以这样建立:
在工具层面,RAGAS 框架能够将这套流程半自动化,可以尝试。
精确词匹配是纯向量检索的一个经典失效场景。
向量检索可能先把语义接近的"Claude 3.5 context window"排出来,即使用户实际搜的是"Claude Sonnet 4.6 的 context window 是多少"。
这类场景更适合表现稳定的混合检索(BM25 + 向量)。混合检索已被 pgvector 0.7+ 支持,既有显著的效果提升,实现成本也不高。
RAG 系统效果的 80% 来自数据处理与检索质量,模型选择只占 20%。