Demo 阶段的 RAG 很容易「看起来能用」:塞一个向量库,接一个大模型,问答就通了。但一旦上生产,三个问题会立刻浮出来——召回准不准、重排贵不贵、延迟扛不扛得住。
一、召回:别只靠向量
纯向量检索在语义相近但用词不同的场景很强,可一旦用户的 query 里带了专有名词、编号、精确措辞,稠密向量反而容易漂。实测里更稳的是混合召回:
- BM25 / 全文检索抓精确命中;
- Embedding 抓语义邻近;
- 两路结果做融合(RRF 或加权),再进重排。
分层 + 重叠切片也很关键:切太碎丢上下文,切太大稀释相关度。
二、重排:值这个钱,但要卡预算
bge-reranker 这类交叉编码器能把初排的噪声压下去不少,代价是每个候选都要过一遍模型。实用的做法:
- 初排召回放宽(比如 topK=50);
- 只对前 N(比如 20)做重排;
- 重排结果取前 5 喂给生成。
准确率的提升通常值这一步,但 N 要卡死,别让它吃掉你的延迟预算。
三、延迟:200ms 不是靠单点,是靠省
把 P95 推理链路压进几百毫秒,靠的不是某一个快,而是每一段都省:
| 环节 | 手段 |
|---|---|
| 检索 | 预计算 embedding、向量库分片、缓存热 query |
| 重排 | 限候选数、批量推理 |
| 生成 | 路由到合适规格的模型、流式返回先给首字 |
小结
RAG 从 Demo 到生产,本质是从「能答」到「稳、准、快地答」。召回用混合、重排卡预算、延迟靠层层省——这三条是我反复验证有效的地基。
评测要跟上:groundedness、召回率、一致性、延迟,一个都不能只凭感觉。