大多数人搭 RAG,第一步就错了

大多数工程师搭 RAG 系统,第一步就去研究选哪个 embedding 模型。这其实是反的。

我见过不止一个团队,在 text-embedding-ada-002bge-m3 之间来回横跳,跑了无数次 benchmark,最后发现系统效果不好------问题压根不在 embedding,在 chunking。


那个把两周时间烧在 embedding 选型上的工程师

去年有个朋友在做内部知识库 RAG,产品要求"用户问什么都能答"。他把前两周全用在了这件事上:

  • 跑了 OpenAI、Cohere、BGE、Jina 四家 embedding 的对比
  • 搭了评测脚本,统计 top-k 召回率
  • 换了三次向量数据库(Pinecone → Qdrant → pgvector)

最终 top-3 召回率到了 78%,他觉得差不多了。

上线两周后,用户反馈"答非所问"的 ticket 不断涌入。他去翻 log,发现命中的 chunk 虽然语义相关,但内容是文档的某个孤立段落------没有上下文,模型根本无法给出有用的回答。

问题不是 embedding 不准,是 chunk 切得太碎,上下文完全割断了。


Embedding 选型的收益边际在递减

这是一个经常被忽视的现实:主流 embedding 模型之间的性能差距,在通用文本任务上已经非常小。

2025 年的 MTEB 榜单前 10 名,top-3 召回率差距普遍在 3% 以内。而一个糟糕的 chunking 策略,能把这个指标直接打掉 20%。

换句话说,你花两周做 embedding 选型,收益可能是 +3%;而花两天优化 chunking 策略,收益可能是 +20%。

这不是说 embedding 不重要,而是优先级错了


真正的三个瓶颈

1. Chunking 策略

固定长度切分(fixed-size chunking)是最常见的起点,也是最快到达瓶颈的选择。

几个实测中收益更稳定的策略:

  • 句子级 + 滑动窗口:保留上下文连续性,适合叙述型文档
  • 按语义分段:用小模型做段落边界检测,适合结构化报告
  • 父子 chunk:检索时用小 chunk,送给 LLM 时附上父 chunk,兼顾精度和上下文

没有银弹,关键是要有评估集来量化不同策略的差异,而不是凭感觉换。

2. 评估闭环

这是大多数 RAG 项目最缺的一环。

没有评估集,你就是在用眼睛观测一个黑盒。改了 chunking 是更好还是更差?改了 retrieval 策略有没有回归?你不知道。

一个最小可行的评估闭环:

  1. 从真实用户问题中抽取 50-100 个代表性 case
  2. 人工标注每个问题的"理想 chunk"(ground truth)
  3. 每次改动后跑一次,对比 Recall@3 和 MRR

工具层面,RAGAS 框架可以半自动化这个流程,值得一试。

3. 检索质量:别只用向量检索

纯向量检索有一个经典失效场景:精确词匹配。

用户搜"Claude Sonnet 4.6 的 context window 是多少",向量检索很可能把语义相近的"Claude 3.5 context window"排在前面。

混合检索(BM25 + 向量)在这类场景下表现更稳。pgvector 0.7+ 已经支持混合检索,实现成本不高,效果提升显著。


一个可以参考的迭代顺序

  1. 先用固定 chunking + 任意主流 embedding 跑通 pipeline,别在这两步卡太久
  2. 搭最小评估集,给自己一把尺
  3. 优化 chunking 策略,用评估集量化每次改动
  4. 加混合检索
  5. 调 reranker(可选,收益视场景而定)
  6. 这时候再考虑换 embedding 模型是否有额外收益

RAG 系统的效果,80% 在数据处理和检索质量,20% 在模型选择。

相关推荐
电魂泡哥2 小时前
Mysql索引下推、索引跳跃、索引覆盖
后端
2301_780789662 小时前
2025年ddos防护还能防护住越来越大的ddos攻击吗
网络·后端·tcp/ip·网络安全·架构·ddos
程序员柒叔2 小时前
Agent / Subagent / Swarm 解析:ClaudeCode源码深度解读
人工智能·后端
ERBU DISH2 小时前
如何使用Spring Boot框架整合Redis:超详细案例教程
spring boot·redis·后端
火莲华2 小时前
Go刨根问底系列 sync.Mutex part3
后端
倚栏听风雨2 小时前
Claude-Agent-SDK:Streaming Input 流式输入
后端
神奇小汤圆2 小时前
面试官灵魂拷问:为什么 SQL 语句不要过多的 join?
后端
渐儿2 小时前
Python 装饰器深度解析
后端
红星照耀华夏2 小时前
Redis Geospatial 深度剖析:从 Geohash 编码到跳表索引的完整链路
后端