RAG
RAG(检索增强生成)是 AI 应用岗出现频率最高的项目类型。这一篇按六步流程展开,重点是排查思路和评估方法——面试官最爱问"效果不好怎么办"。
六步流程
加载 → 切分 → 向量化 → 存储 → 检索 → 生成
任何一步坏了都会"看着对其实错":程序不报错、回答通顺,但内容是错的或空的。所以排查 RAG 问题永远不能只看最后的回答,要逐步验中间产物。
切分(Chunking)
切分直接决定检索粒度:切太大,一块里混多个主题,召回不精准还浪费 token;切太小,上下文破碎,模型拿到残句。
- 经验参数:块 500 字左右 + overlap 10%~20%。overlap 让跨块的句子两边都有完整上下文,不因为边界切断而丢语义。
- 中文必须把
。!?写进分隔符:默认分隔符按英文标点/换行切,中文长句不会被正确断开,导致块超长或语义混杂。
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=80, # ~16% overlap
separators=["\n\n", "\n", "。", "!", "?", ",", " "], # 中文标点必须加
)
chunks = splitter.split_documents(docs)
向量化:稀疏 vs 稠密
- 稀疏向量(BM25、TF-IDF):维度等于词表大小,绝大多数位置为 0。按字面关键词匹配,精确命中术语、编号、人名强。
- 稠密向量(embedding 模型):固定低维(如 1024 维),每一维都有值。按语义相似匹配,同义改写也能召回,但对生僻术语可能"看着像其实不是"。
成熟方案是混合检索:两路都查再融合(如 RRF),关键词兜底术语,语义兜底改写。
分数方向注意:常见 embedding/重排模型分数越小越相似(距离语义),别把"取 top-k"写成"取分数最大的 k 条"——这是真实项目里出现过的方向性 bug。
生成:防编造三原则
- 只用检索到的资料回答——提示词里明确"仅根据以下资料回答,资料中没有就说不确定"。
- 标注来源——回答附引用(文档名/段落),可追溯也能帮用户核验。
- 检索为空用阈值兜底——相似度低于阈值就直说"资料库中未找到",宁可不答也不编。
多轮对话检索还有一个必做步骤:先改写成独立问题再检索。用户第二轮问"那第二种呢?"——直接拿这句去查向量库必挂。先用模型把"它"消解掉,改写成自包含的完整问题再检索。
效果不好怎么排查(高频追问)
80% 的问题不在提示词,在检索。 排查顺序:
1. 先查检索命中:把 top-k 文档打出来人眼看
├─ 没召回 → 切分太粗/查询太差/向量模型不匹配 → 换混合检索、改写查询、调块大小
└─ 召回了但排序差 → 上重排(reranker)、调 top-k
2. 检索没问题再看生成:提示词是否约束"只用资料"、是否被历史对话带偏
3. 数据源头:文档本身过期、重复、格式乱(表格被切碎)
这一套顺序答出来,比背十个 RAG 概念更加分——它证明你真的调过。
评估:Recall@k
评估看 Recall@k:构造一批"问题 → 应被命中的标准文档"对,检查标准文档是否出现在 top-k 检索结果中。它是 RAG 检索质量的黄金指标——召回都不对,生成再好也没用。
配套指标:MRR(标准文档排名越靠前越好)、忠实度(答案是否只基于资料)、答案相关性。RAG 专项评估可参考本站 RAG 分类的展开篇目。
RAG 与微调怎么选
| 维度 | RAG | 微调 |
|---|---|---|
| 知识更新 | 换文档即生效,实时 | 要重新训练,周期长 |
| 成本 | 向量化便宜,主要成本在检索链路 | 训练 GPU 成本高 |
| 可溯源 | 有引用 | 无 |
| 适合 | 知识频繁更新、要引用来源(企业文档问答) | 固定领域的风格/格式/专业能力(客服语气、行业术语) |
标准答法:知识问题用 RAG,能力问题用微调,两者可叠加(微调过的模型作为 RAG 的生成端)。
高频面试题
| 问题 | 答题要点 |
|---|---|
| 讲一下 RAG 流程?和微调怎么选? | 六步:加载→切分→向量化→存储→检索→生成;知识更新频繁选 RAG,固定领域能力选微调 |
| 切分参数怎么定?中文为什么要加分隔符? | 500 字左右 + overlap 10%~20%;默认分隔符不含中文标点,长句切不开 |
| 稀疏和稠密向量什么意思? | 稀疏按词表关键词匹配(BM25),稠密按语义相似(embedding);生产用混合检索 |
| 检索为空怎么办?怎么防编造? | 阈值兜底直说"未找到";提示词限定只用资料 + 标注来源 |
| 效果不好按什么顺序排查? | 先查检索命中(80% 问题在检索)→ 排序 → 生成提示词 → 数据源;不看提示词瞎调是外行 |
| 怎么评估 RAG? | Recall@k 为主,辅以 MRR、忠实度、相关性;构造标准问答对 |