问题
模型不知道你的私有知识,微调成本高、更新慢;朴素 RAG(向量检索 topK 塞 prompt)上线后经常答非所问——检索质量成了整个系统的短板。
核心模式
生产级 RAG 是一条多阶段流水线,不是一次向量检索:
def rag_pipeline(query, kb):
# 1. 查询改写:多轮对话中的"它/这个"补全为完整查询
q = rewrite(query, history)
# 2. 混合检索:向量召回语义 + BM25 召回关键词
cands = merge(vector_search(q, kb, k=20), bm25_search(q, kb, k=20))
# 3. 重排序:cross-encoder 精排
ranked = rerank(q, cands)[:5]
# 4. 上下文组装:带引用来源
ctx = format_with_citations(ranked)
# 5. 生成 + 兜底:检索质量差时拒答而非硬答
if max_score(ranked) < THRESHOLD:
return refuse_or_fallback()
return generate(q, ctx)
每个阶段都是可调优的旋钮;任何一环掉链子,最终答案就掉链子。
实战要点
- 切分策略决定上限:按语义结构切(标题/段落)优于按长度硬切;chunk 带父文档指针,命中小块可回溯上下文
- 混合检索是性价比最高的优化:专有名词、型号、代码符号这些向量检索的弱项,BM25 一抓一个准
- 必须设相似度阈值+拒答机制:坏上下文比没上下文更糟——模型会强行用无关材料编答案
- 评估要分治:检索命中率(答案是否在 top5 里)与生成正确率分开测,才知道该优化哪段