#模块六:RAG、检索、重排与知识增强
#61. 什么是 RAG,为什么它能缓解幻觉?
#标准答案
RAG(Retrieval-Augmented Generation,检索增强生成)本质上是把“查资料”和“生成答案”接在一起:用户提问后,系统先去外部知识库里找相关证据,再把这些证据连同问题一起交给大模型生成回答。这样做的关键价值,不是让模型突然更聪明,而是把原本只能靠参数记忆回答的问题,改成“可以边查边答”。
它能缓解幻觉,核心有三层原因。第一,外部知识可以实时更新,模型不用把所有新知识都塞进参数里;第二,回答时有显式证据,模型更容易围绕真实材料组织答案;第三,很多企业场景需要可追溯性,RAG 可以把”答案从哪来”也一起给出来。但要注意,RAG 只是降低幻觉概率,不是自动消灭幻觉:如果检索错了、证据排序错了,或者模型拿到证据却没真正利用好,仍然会答错。
#深度解析
1. RAG 与 Fine-tuning 的本质区别
| 维度 | RAG | Fine-tuning |
|---|---|---|
| 改什么 | 外部知识源 | 模型参数 |
| 知识更新 | 即时(换文档即可) | 需要重新训练 |
| 可解释性 | 高(可以指出引用来源) | 低(黑盒参数记忆) |
| 适用场景 | 知识频繁变化、需要证据 | 行为风格、任务格式 |
| 成本 | 检索系统维护 | 训练计算 |
关键洞察:RAG 和 Fine-tuning 不是互斥的,而是互补的。一个完整的系统通常是”RAG 提供知识 + Fine-tuning 提供行为”。
2. RAG 失败的三层诊断法
当 RAG 效果不好时,按这个顺序排查:
第一层:召回层(Retrieval)
- 正确证据是否在 top-k 中?
- 排查方法:看检索结果的 recall@k
- 根因:embedding 不好、query 表述与文档不匹配、chunk 切分破坏了语义完整性
第二层:重排序层(Reranking)
- 正确证据是否在前列?
- 排查方法:看 MRR(Mean Reciprocal Rank)
- 根因:reranker 模型不够强、分数校准不好
第三层:生成层(Generation)
- 模型是否真正利用了证据?
- 排查方法:看 faithfulness(答案与证据的一致性)
- 根因:prompt 中没有强制引用、证据被噪声淹没、模型”幻觉”忽略了证据
3. Query Rewrite 的作用
用户原始 query:”这玩意怎么用?” —— 模型无法理解”这玩意”指什么。
Query rewrite 把模糊 query 改写成适合检索的形式:
- “这玩意” → 根据对话历史推断指代对象
- “怎么用” → 扩展为”使用步骤、配置方法、常见问题”
常见 rewrite 策略:
- HyDE(Hypothetical Document Embedding):让模型先生成一个假设的回答,再用这个回答去检索
- Multi-query:把一个问题改写成多个不同表述,分别检索后合并结果
- Step-back:先问一个更通用的”原理级”问题,再基于原理检索具体细节
4. 面试官常见深挖追问
- ”RAG 的检索结果有 10 段,怎么决定把哪些放进 prompt?”
- 答:不是简单取 top-k,而是综合考虑:1)相关性分数阈值,低于阈值的直接丢弃;2)多样性,避免多段内容重复;3)长度预算,根据模型窗口倒推能放多少;4)时序/逻辑顺序,按文档结构或时间线组织,而不是按相关度随机排列。
- ”如果检索到的证据互相矛盾,RAG 怎么办?”
- 答:这是 RAG 的深水区。简单做法是在 prompt 中告诉模型”以下信息可能矛盾,请综合判断”;进阶做法是在检索层做冲突检测,标记矛盾证据,甚至让模型先生成”证据冲突分析”再回答。
- ”RAG 的 embedding 模型和生成模型需要配对吗?”
- 答:理想情况下应该考虑匹配。如果生成模型是中文为主的,embedding 也选中文优化过的;如果生成模型是代码模型,embedding 最好也懂代码语义。但这不是绝对的——通用 embedding(如 BGE、GTE)在大多数场景下已经足够。关键是评测:在真实业务数据上测 recall,选召回率最高的。
#62. 一个标准 RAG pipeline 包含哪些环节?
#标准答案
一个标准 RAG pipeline 通常至少包括 8 个环节:文档采集与清洗、文档切块、向量化或混合索引构建、用户 query 处理、召回、重排、上下文构造、答案生成,之后还应接上评测和引用约束。面试时最好不要只背名词,而要顺着数据流讲:原始文档先被清洗并切成可检索片段,这些片段被编码后进入索引;用户问题进来后,系统先做召回,再用 reranker 精排,把最重要的证据拼成 prompt,最后交给生成模型回答。
真正高质量的回答,还应补一句:RAG 不是单点技巧,而是一条联合链路,所以任何一层出问题都会让最终答案变差。比如切块过碎会让证据丢失,召回不准会找不到材料,重排差会把噪声顶到前面,上下文拼装差会让模型“看到了却没用好”。
#深度解析
1. RAG Pipeline 的数据流详解
原始文档
↓ [文档采集与清洗]
清洗后的文档(去噪、去重、格式统一)
↓ [文档切块]
文档片段 chunks(如每段 512 token,overlap 50 token)
↓ [向量化/索引]
向量数据库索引(如 FAISS、Milvus、Pinecone)
↓ [用户 Query 进入]
用户问题
↓ [Query 处理]
改写/扩展后的 query(如 HyDE、multi-query)
↓ [召回]
Top-k 候选片段(如 top-100)
↓ [重排序]
精排后的 top-n 片段(如 top-5)
↓ [上下文构造]
Prompt = System + 问题 + "参考信息:" + top-n 片段
↓ [答案生成]
模型生成回答
↓ [评测]
评估回答质量(正确性、忠实度、完整性)
2. 每个环节的常见失败模式
| 环节 | 成功标准 | 常见失败 | 失败后果 |
|---|---|---|---|
| 清洗 | 文档干净、格式统一 | 残留 HTML、表格解析错误 | 噪声进入索引 |
| 切块 | 每段语义完整 | 切在句子中间、代码块被切断 | 语义碎片化 |
| 索引 | 相似内容在向量空间接近 | embedding 质量差 | 召不回正确文档 |
| 召回 | 正确答案在 top-k 中 | k 太小、query 表述差异大 | 漏掉关键证据 |
| 重排 | 最相关证据在前 3 | reranker 训练不足 | 噪声顶到前面 |
| 上下文 | 证据清晰、不超限 | 片段太多、格式混乱 | 模型忽略证据 |
| 生成 | 答案基于证据、不 hallucinate | 模型编造、忽略证据 | 回答错误 |
3. 评测 RAG 的分层指标
| 层级 | 指标 | 含义 |
|---|---|---|
| 召回层 | Recall@k, MRR | 正确证据是否被找到、排名如何 |
| 重排层 | NDCG@k | 重排后相关性排序质量 |
| 生成层 | Faithfulness, Answer Relevance | 答案是否忠实于证据、是否回答问题 |
| 端到端 | Accuracy, F1 | 最终回答是否正确 |
4. 面试官常见深挖追问
- "RAG 系统里,召回和重排为什么通常是两个独立模型?"
- 答:因为它们的优化目标不同。召回模型(bi-encoder)追求"快+覆盖"——把海量文档快速筛到几百个候选;重排模型(cross-encoder)追求"准+精细"——用 query 和文档的细粒度交互判断相关性。如果把重排器当召回器用,太慢;如果把召回器当重排器用,太粗。
- "如果知识库每天更新,RAG 的索引怎么增量更新?"
- 答:1)新增文档:直接编码入库;2)修改文档:删除旧 chunk 的向量,插入新 chunk;3)删除文档:删除对应的所有 chunk 向量。挑战在于 chunk 的增删可能改变相邻 chunk 的 overlap,需要重新计算边界 chunk。
- "RAG 里的 embedding 模型需要自己训练吗?"
- 答:通常不需要从零训练。通用 embedding(如 BGE、GTE、E5)在大多数场景已经足够。但在垂直领域(如法律、医疗),通用 embedding 可能召不回专业术语,这时可以用领域数据做继续训练或对比学习微调。判断标准:在真实 query-document 对上调 recall,如果通用模型 recall@10 < 80%,值得微调。
#63. embedding model 在 RAG 中的作用是什么?
#标准答案
embedding model 的作用,是把 query 和文档片段都映射到同一个向量空间里,让语义相近的内容在空间里更接近,从而支持向量检索。换句话说,它决定了系统能不能从“用户说的话”和“知识库里的表达”之间建立语义桥梁。比如用户问“合同违约后怎么赔”,文档里写的是“违约责任与损害赔偿”,如果 embedding 不够好,系统就可能根本召不回来。
它之所以关键,是因为 RAG 的第一步不是生成,而是”先找对材料”。embedding model 选得不好,后面 reranker、prompt、生成模型再强也很难救。所以回答时最好再补一句:embedding 的好坏不仅影响召回率,还影响多语言能力、专业术语匹配、长文档切块效果,以及整个系统的延迟和索引成本。
#深度解析
1. embedding model 的两种架构:Bi-Encoder vs Cross-Encoder
| 特性 | Bi-Encoder(双编码器) | Cross-Encoder(交叉编码器) |
|---|---|---|
| 架构 | query 和 doc 分别编码,再算相似度 | query 和 doc 拼接后一起编码 |
| 相似度计算 | cosine/dot product(快速) | 线性层打分(精确但慢) |
| 速度 | 毫秒级(可预计算 doc 向量) | 几十到几百毫秒 |
| 适用阶段 | 召回阶段(retriever) | 重排阶段(reranker) |
| 经典模型 | BGE, GTE, E5, OpenAI text-embedding | BERT-based cross-encoder |
为什么 Bi-Encoder 更快?因为文档向量可以预计算并索引,查询时只需编码 query 然后做最近邻搜索。
2. embedding 训练的核心:对比学习(Contrastive Learning)
训练目标:让正样本(相关的 query-doc 对)在向量空间中靠近,负样本远离。
InfoNCE Loss:
L = -log[ exp(sim(q, d⁺)/τ) / Σ exp(sim(q, dᵢ)/τ) ]
其中:
- q: query 向量
- d⁺: 正样本 doc 向量
- dᵢ: 所有候选 doc 向量(含负样本)
- τ: 温度系数,控制分布锐度
- sim: 余弦相似度
| 策略 | 说明 | 效果 |
|---|---|---|
| In-batch negatives | 同一 batch 内的其他 doc 作为负样本 | 简单高效,但质量一般 |
| Hard negatives | 和 query 有点相关但不正确的 doc | 训练难度大但效果更好 |
| BM25 negatives | 先用 BM25 召回 top-k,去掉正样本 | 接近实际分布 |
负样本构造策略(关键!):
3. embedding model 选择决策树
选择 embedding 模型:
├─ 通用中文场景
│ └─ BGE-large-zh(开源最强中文 embedding)
├─ 通用英文场景
│ └─ GTE-large / E5-large / OpenAI text-embedding-3
├─ 多语言混合
│ └─ E5-multilingual / BGE-m3
├─ 专业领域(法律/医疗/代码)
│ └─ 领域微调:基于通用模型 + 领域数据对比学习
└─ 延迟极度敏感
└─ 小模型:GTE-base / BGE-small,或 ONNX 量化
4. embedding 维度与索引成本的权衡
| 维度 | 表达力 | 索引大小 | 检索速度 | 适用 |
|---|---|---|---|---|
| 384 | 较低 | 小 | 快 | 简单分类、低延迟场景 |
| 768 | 中等 | 中等 | 中等 | 通用 RAG |
| 1024 | 强 | 大 | 较慢 | 复杂语义匹配 |
| 3072+ | 很强 | 很大 | 慢 | 高精度场景,需降维 |
重要:OpenAI 的 text-embedding-3 支持维度截断(如从 3072 截到 512),在精度和速度间灵活取舍。
5. embedding 效果评估指标
| 指标 | 含义 | 计算方式 | 好值 |
|---|---|---|---|
| MRR (Mean Reciprocal Rank) | 第一个正确答案的平均排名倒数 | 1/rank_of_first_hit | >0.7 |
| Recall@K | top-K 中命中正确答案的比例 | hits@K / total_queries | >0.9 |
| NDCG | 考虑排序质量的相关性评分 | 加权折扣累计增益 | >0.8 |
6. 面试官常见深挖追问
- ”为什么 Cross-Encoder 比 Bi-Encoder 精确,但不能用于召回?”
- 答:Cross-Encoder 把 query 和 doc 一起输入 Transformer,注意力层可以直接交互(如 query 的 “赔偿” 和 doc 的 “违约责任” 形成 attention),所以打分更准。但它需要为每个 query-doc 对跑一次前向传播,无法预计算。面对百万级文档库,O(N×M) 的复杂度不可接受。
- ”embedding 模型对 chunk size 敏感吗?”
- 答:非常敏感。Bi-Encoder 把整段文本压缩成一个固定维度向量(如 768-d)。如果 chunk 太长(>512 tokens),后面的内容会被”平均”掉,信息稀释;如果 chunk 太短,上下文缺失。所以 embedding model 的 max sequence length 和 chunk size 要匹配。
- ”同一个 embedding 模型,为什么在不同领域表现差异很大?”
- 答:embedding 模型在通用语料上训练,学到的语义表示偏向通用分布。遇到专业术语、领域缩写、特定表达时,向量可能偏离真实语义。解决方案:1)领域微调(在领域数据上做对比学习);2)领域术语扩展(把术语映射到通用概念);3)混合检索(BM25 + 向量)。
- ”如何评估 embedding 质量?需要标注多少数据?”
- 答:最小可用方案:准备 100-500 个 query-doc 对(含正负样本),计算 Recall@10 和 MRR。如果指标低于 0.7,说明 embedding 召回能力不足,需要优化模型、切分策略或增加训练数据。
#64. chunk size 和 overlap 会怎样影响召回质量?
#标准答案
chunk size 和 overlap 本质上是在平衡“证据完整性”和“检索粒度”。chunk 太小,会把本来连在一起的证据切碎,导致单个片段语义不完整;chunk 太大,又会把无关上下文一起塞进去,导致召回向量变得模糊、噪声增加、上下文成本上升。overlap 的作用是防止关键信息刚好被切在边界上,因此相邻 chunk 会保留一部分重叠内容。
但 overlap 也不是越大越好。重叠太大时,索引中会出现大量近重复片段,既增加存储和计算成本,也会让检索结果里反复出现同样内容,挤占真正有价值的候选。所以面试里最好把答案讲成:chunk size 决定颗粒度,overlap 决定边界稳健性,两者都要围绕文档结构、问题类型和模型上下文窗口来调。
#深度解析
1. Chunk Size 的定量影响
假设一篇 1000 词的文档,用不同 chunk size 切分:
| Chunk Size | Chunk 数量 | 每 chunk 平均语义完整度 | 检索精度 | 存储成本 |
|---|---|---|---|---|
| 100 | 10 | 低(常切断句子) | 中 | 10× |
| 256 | 4 | 中(约 1-2 段) | 高 | 4× |
| 512 | 2 | 高(完整段落) | 中高 | 2× |
| 1024 | 1 | 很高(全文) | 低(向量太泛化) | 1× |
规律:
- chunk 太小 → 语义断裂,单个片段无法独立回答问题
- chunk 太大 → 向量被噪声稀释,检索时匹配精度下降
- Sweet spot:通常 200-500 tokens,具体取决于文档类型
2. 不同文档类型的 Chunk 策略
| 文档类型 | 推荐 Chunk Size | 原因 |
|---|---|---|
| 代码 | 函数/类级别 | 语义边界清晰,函数是独立单元 |
| 法律条文 | 条款级别 | 每条独立有效,跨条引用需特别处理 |
| 论文 | 段落级别(~300词) | 每段通常论述一个论点 |
| 对话记录 | 每轮对话 | 每轮有独立语义 |
| FAQ | 整问整答 | 问题和答案不可分割 |
3. Overlap 的设计原理
Overlap 解决的是"边界切断"问题:
文档:"...人工智能在医疗领域的应用包括影像诊断和药物研发..."
Chunk 1 (0-100):"...人工智能在医疗领域的应用包括影像诊"
Chunk 2 (80-180):"断和药物研发..."
无 overlap 时,"影像诊断"被切成两半,两个 chunk 都语义不完整。
Overlap=20 时:
Chunk 1 (0-100):"...人工智能在医疗领域的应用包括影像诊断"
Chunk 2 (80-180):"应用包括影像诊断和药物研发..."
推荐 overlap:chunk size 的 10-20%(如 chunk=256,overlap=25-50 tokens)。
4. 高级 Chunk 策略
- 语义切分(Semantic Chunking):不用固定长度,而用句子/段落边界,确保每个 chunk 语义完整
- 层次切分(Hierarchical Chunking):大 chunk(如 512)用于粗检索,小 chunk(如 128)用于精定位
- 上下文增强(Contextual Retrieval):每个 chunk 附带文档级上下文摘要,帮助 embedding 理解局部语义
5. 面试官常见深挖追问
- "如果一个问题的答案跨越了两个 chunk,RAG 怎么保证召回完整?"
- 答:1)overlap 让相邻 chunk 共享边界信息;2) parent-child 检索(先召回大 chunk,再在大 chunk 内定位小 chunk);3)多跳检索(先找到一个 chunk,再用其中的实体/引用去检索下一个 chunk)。
- "Chunk size 对 embedding 质量有什么影响?"
- 答:embedding 模型通常有最优输入长度(如 512 tokens)。chunk 太长超过这个长度会被截断,导致尾部信息丢失;chunk 太短则 embedding 的语义表示不够丰富(如 "深度学习是" 这个不完整句子 embedding 后没有意义)。理想 chunk 长度应接近 embedding 模型的最优长度。
- "如果文档是结构化数据(如表格、JSON),怎么 chunk?"
- 答:不能简单按长度切。表格应按行/块切,保留表头上下文;JSON 应按对象切;代码应按函数/类切。核心原则:chunk 的边界必须是语义边界,不能是任意字符位置。
#65. 什么是 hybrid retrieval?
#标准答案
hybrid retrieval 指的是把向量检索和词法检索结合起来一起用。向量检索擅长找“语义上相似”的内容,哪怕表述不完全一致也能召回;词法检索例如 BM25 更擅长关键词、实体名、数字、专业缩写这类精确匹配。两者结合的目的,就是减少单一路径的盲区。
它通常比纯向量或纯关键词更稳,因为真实业务里两种需求都会出现。比如法规条款号、报错码、商品型号这类问题,关键词检索往往更强;而用户换种说法提问时,向量检索又更有优势。所以回答时最好补一句:hybrid retrieval 的价值不只是”多加一路”,而是把召回覆盖率和精确性一起抬高,为后续 reranker 提供更好的候选集。
#深度解析
1. BM25 的核心原理
BM25(Best Match 25)是经典词法检索算法,基于 TF-IDF 改进:
score(q, d) = Σ IDF(q_i) * [f(q_i, d) * (k1 + 1)] / [f(q_i, d) + k1 * (1 - b + b * |d|/avgdl)]
f(q_i, d):词 q_i 在文档 d 中的词频IDF(q_i):逆文档频率(稀有词权重高)k1:控制词频饱和度(通常 1.2-2.0)b:控制文档长度归一化(通常 0.75)
与向量检索的本质区别:
- BM25 只关心”有没有出现这个词”和”出现了多少次”
- 向量检索关心”语义是否相近”(即使词不同,意思相近也能召回)
2. Hybrid Retrieval 的融合策略
两种检索各返回一组候选,需要融合成一个统一排序:
| 融合方法 | 原理 | 适用场景 |
|---|---|---|
| 线性加权 | score = α * score_dense + (1-α) * score_sparse |
通用场景,α 通常 0.5-0.7 |
| RRF(Reciprocal Rank Fusion) | score = Σ 1/(k + rank_i) |
不同检索器的分数不可比时 |
| 级联 | 先用稀疏召回候选,再用稠密重排 | 稀疏召回快、稠密精度高 |
RRF 是最鲁棒的方法,因为它只使用排名而不是原始分数,避免了不同检索器分数尺度不一致的问题。
3. 向量检索 vs 关键词检索的盲区对比
| 查询类型 | 向量检索 | 关键词检索 | Hybrid 优势 |
|---|---|---|---|
| “ERROR_CODE_404 怎么解决” | 差(不认识代码) | 极好 | 关键词兜底 |
| “为什么我的网页打不开” | 极好(语义匹配) | 差(没出现”404”) | 向量兜底 |
| “GPT-4 和 Claude 3 哪个好” | 中(可能召回比较文章) | 中(两者都出现) | 双重确认 |
| “2023年增值税税率” | 差(数字易变) | 极好 | 关键词精确 |
4. 实际工程实现
主流方案:
- Elasticsearch + 向量插件:传统 BM25 + HNSW 向量索引,同一平台查询
- Pinecone/Weaviate/Milvus:原生支持 hybrid search,内置 RRF
- 自研方案:向量库和关键词库独立查询,服务层做 RRF 融合
5. 面试官常见深挖追问
- ”Hybrid retrieval 里,α(向量权重)选多大合适?”
- 答:没有统一答案,需要通过验证集调参。一般原则:如果用户查询包含很多专业术语/实体/代码,α 应该偏小(更依赖关键词);如果查询是开放式自然语言,α 应该偏大(更依赖语义)。也可以通过查询分类器动态调整 α。
- ”RRF 中的 k 参数有什么影响?”
- 答:k 是平滑常数(通常取 60)。k 越大,高排名的优势越不明显(更平等);k 越小,第一名和第二名的差距越大。k=60 是经验值,能在”尊重高排名”和”给低排名机会”之间取得平衡。
- ”如果关键词检索召回 100 个、向量检索召回 100 个,融合后取多少个给 reranker?”
- 答:通常取 top-50 到 top-100。太多会增加 reranker 成本(reranker 通常比 retriever 慢 10-100 倍),太少可能漏掉正确证据。最佳值通过实验确定:固定 reranker 和生成模型,改变候选数,看最终答案准确率的变化曲线,找到拐点。
#66. reranker 和 retriever 有什么不同?
#标准答案
retriever 和 reranker 的分工可以概括成一句话:retriever 负责“别漏掉”,reranker 负责“排得准”。retriever 面对的是海量文档,目标是在很短时间内从大库里粗召回一小批候选,所以它更看重速度和覆盖率;reranker 面对的是已经缩小后的候选集,会用更重的模型、更细的 query-document 交互去重新排序,因此更看重精度和相关性。
为什么要分两层?因为如果一开始就用很重的交互模型去扫全库,成本太高;但如果只有 retriever,很多相似但不够关键的文档会排在前面,真正证据可能被埋掉。面试里高分回答通常会补一句:RAG 里生成模型往往只真正利用前几个 chunk,所以 reranker 常常决定”最后 20% 的效果上限”。
#深度解析
1. Bi-Encoder vs Cross-Encoder:两种排序范式
| 维度 | Bi-Encoder(Retriever) | Cross-Encoder(Reranker) |
|---|---|---|
| 架构 | Query 和 Doc 分别编码,再算相似度 | Query 和 Doc 拼接后一起编码 |
| 计算时机 | 离线编码 Doc,在线编码 Query | 在线计算每个 Query-Doc 对 |
| 速度 | 快(毫秒级,可扫百万文档) | 慢(秒级,只能处理几十到几百对) |
| 精度 | 中(分别编码,交互不足) | 高(充分交互,捕捉细粒度关系) |
| 显存 | 小(只需存向量) | 大(需加载完整模型) |
| 代表模型 | BGE, E5, GTE | BGE-Reranker, ColBERT, monoT5 |
核心区别:Bi-Encoder 是”分别理解再比较”,Cross-Encoder 是”放在一起理解关系”。
2. 为什么 Reranker 精度更高?
假设 query=”苹果的营养价值”,doc1=”苹果公司发布新款 iPhone”,doc2=”每天吃苹果有助于健康”。
- Bi-Encoder:分别编码 query 和两个 doc,用向量相似度比较。”苹果”这个词在 query 和 doc1 中都高频出现,可能错误地把 doc1 排前面。
- Cross-Encoder:把 “query [SEP] doc” 拼接后输入模型,模型能看到 “苹果” 和 “营养价值” 的共现关系,更容易判断 doc2 更相关。
3. 两阶段检索的成本分析
假设知识库有 100 万文档:
| 阶段 | 处理量 | 单次延迟 | 总成本 |
|---|---|---|---|
| Retriever | 100 万 → top-100 | ~10ms | 低(向量索引) |
| Reranker | top-100 → top-5 | ~50-200ms/对 × 100 = 5-20s | 高(模型推理) |
| LLM 生成 | top-5 → 答案 | ~1-5s | 中 |
如果没有 reranker,LLM 需要处理 top-100(成本大增);如果只用 reranker 扫全库,100 万 × 200ms = 55 小时,不可行。
4. 高级 Reranker:ColBERT 的 Late Interaction
ColBERT 是一种折中方案:
- 离线阶段:把 query 和 doc 分别编码成 token 级别的向量序列(不是整个文档一个向量)
- 在线阶段:计算 query 每个 token 和 doc 每个 token 的相似度,取最大匹配和
优点:比 Bi-Encoder 精度高(token 级交互),比 Cross-Encoder 快(离线预计算 doc 向量)。
5. 面试官常见深挖追问
- ”Reranker 的输入长度通常有限制(如 512 tokens),如果 doc 很长怎么办?”
- 答:1)只对 doc 的前 512 tokens 做 rerank(假设关键信息在开头);2)把长 doc 切分成多个 passage,分别和 query 做 rerank,取最高分;3)先用检索定位到相关段落,再对段落做 rerank。实践中方法 2 最常用。
- ”如果 retriever 已经把正确文档排到了第 50 名,reranker 能救回来吗?”
- 答:取决于 reranker 的质量和候选集大小。如果 reranker 只处理 top-20,那第 50 名就救不回来了。所以 retriever 的 recall@100 必须足够高——reranker 负责 precision,不负责召回。如果正确文档根本没进候选集,reranker 无能为力。
- ”什么情况下可以去掉 reranker,只用 retriever?”
- 答:1)对延迟极度敏感(reranker 增加 100-500ms);2)文档本身很短(如 FAQ),retriever 已经足够精确;3)成本敏感(reranker 需要额外 GPU);4)候选集很小(如 <10 个)。但大多数生产 RAG 系统保留 reranker,因为它对最终效果的提升通常 worth the cost。
#67. 你做过的 RAG 为什么效果不好,是召回差、重排差还是生成阶段利用不好?
#标准答案
这类题最忌讳的回答,是笼统说“RAG 效果不好,可能模型不行”。标准答法一定要分层定位。第一层先看召回:正确证据到底有没有被找回来,如果根本没召回到,那问题在 embedding、索引或 query rewrite;第二层看重排:证据虽然找回来了,但是否被排到足够靠前的位置,如果高价值 chunk 排名太后,生成模型大概率用不到;第三层再看生成利用:证据已经进 prompt 了,模型是否真的引用、整合、约束在证据之上。
如果想显得更像做过项目,可以继续补一条定位链:坏例抽样 -> 标注文档是否存在正确证据 -> 检查 top-k 召回命中 -> 检查 rerank 后排序 -> 检查最终 prompt 结构和输出引用情况。这样答,面试官会觉得你不是只知道 RAG 名词,而是真的会查链路。
#深度解析
1. 分层诊断的具体操作
| 层级 | 检查项 | 工具/方法 | 预期结果 |
|---|---|---|---|
| 召回层 | 正确证据是否在 top-k | 人工标注 + 召回率统计 | Recall@10 > 80% |
| 重排层 | 正确证据是否在前 3 | 检查 rerank 后排名 | MRR > 0.6 |
| 生成层 | 模型是否引用证据 | 引用一致性检查 | Citation Accuracy > 90% |
| Prompt 层 | 证据是否被噪声淹没 | 检查 prompt 结构 | 关键证据在前 1/3 |
2. 常见故障模式与根因
| 现象 | 根因 | 解决方案 |
|---|---|---|
| 召回为空 | embedding 与 query 语义不对齐 | 领域 embedding 微调、query rewrite |
| 召回太多噪声 | chunk 太大或索引质量差 | 缩小 chunk、过滤低质量文档 |
| 重排后正确证据掉出前 3 | reranker 与任务不匹配 | 训练/选择领域专用 reranker |
| 模型引用错误文档 | 相似文档混淆 | 增加文档唯一标识、改进 rerank |
| 模型忽略证据自己编造 | prompt 没有强制引用要求 | 加入 citation 格式要求、SFT 训练 |
3. 坏例分析的标准流程
Step 1: 抽样 50-100 个 bad case
Step 2: 人工判断"正确答案应该是什么"
Step 3: 检查知识库中是否存在正确证据
└─ 不存在 → 知识库缺口,需要补充文档
└─ 存在但没召回 → 召回问题
Step 4: 如果召回了,检查是否在 top-5
└─ 不在 top-5 → 重排问题
└─ 在 top-5 但模型没用 → 生成利用问题
Step 5: 统计各层问题比例,优先解决占比最高的
4. 量化指标参考
| 指标 | 计算方式 | 合格线 | 优秀线 |
|---|---|---|---|
| Recall@10 | 正确证据在 top-10 的比例 | 70% | 85% |
| MRR | 正确证据排名的倒数均值 | 0.5 | 0.7 |
| Citation Precision | 引用文档确实支持陈述的比例 | 80% | 95% |
| Answer Accuracy | 最终答案正确的比例 | 75% | 90% |
5. 面试官常见深挖追问
- "如果召回层没问题,但生成层总是忽略证据,怎么解决?"
- 答:1)Prompt 工程:明确要求"基于以下证据回答",并规定引用格式(如 [doc_id]);2)SFT:构造带引用的训练数据,让模型学会引用;3)RLHF:对引用准确的回答给更高奖励;4)后处理:用规则检查答案中是否出现引用标记,无引用则拒绝或重试。
- "RAG 效果不好的 case 中,召回问题、重排问题、生成问题各占多少比例?"
- 答:行业经验(因领域而异):召回问题约占 40-50%(最常见),重排问题约占 20-30%,生成利用问题约占 20-30%。所以优化 RAG 通常从召回开始,因为"没找到"比"找到了没用"更根本。
- "如果一个 bad case 在召回层、重排层、生成层都有问题,先修哪一层?"
- 答:从下往上修。先生成层(最容易、成本最低:改 prompt);再重排层(中等成本:换/训 reranker);最后召回层(最难:可能需改 embedding、重建索引)。但也有例外——如果召回层问题极严重(recall@10 < 50%),应该先修召回,因为上层优化建立在召回质量之上。
#68. 为什么不是所有知识注入问题都应该用 RAG?
#标准答案
因为 RAG 解决的是“外部知识如何动态接入”问题,而不是所有模型能力问题。若系统的短板主要是知识更新快、文档量大、需要证据可追溯,那 RAG 非常合适;但如果问题本质是输出格式不稳、角色风格不对、工具调用流程不会、推理习惯不好,这些更偏行为模式的问题,单靠检索外部文档并不能根治。
所以面试里最好把边界讲清:RAG 更像外挂知识库,fine-tuning 更像改模型习惯,系统工程则解决权限、流程和观测问题。真正成熟的判断不是”RAG 高级所以都该上”,而是先分清你缺的是知识、行为、流程,还是三者都有。
#深度解析
1. RAG 的适用边界矩阵
| 问题类型 | RAG 适合? | 更适合的方案 | 原因 |
|---|---|---|---|
| 知识频繁更新 | 是 | - | 检索动态文档,无需重新训练 |
| 需要证据溯源 | 是 | - | 可返回引用文档 |
| 大量结构化文档 | 是 | - | 向量检索擅长非结构化文本 |
| 输出格式不稳定 | 否 | SFT/格式化 Prompt | RAG 不改变生成行为 |
| 角色风格不对 | 否 | SFT/系统提示 | 风格是行为模式,不是知识 |
| 推理能力弱 | 否 | CoT 训练/更大模型 | RAG 只提供材料,不改变推理方式 |
| 常识性知识缺失 | 否 | 继续预训练 | 常识应内化到参数中 |
| 工具调用不会 | 否 | Function Calling SFT | 工具调用是行为技能 |
2. RAG 的成本结构
| 成本项 | 一次性成本 | 持续成本 | 备注 |
|---|---|---|---|
| 索引构建 | 高(需编码百万文档) | 中(增量更新) | 向量编码需 GPU |
| 存储 | 中 | 中 | 向量库 + 原文档 |
| 检索延迟 | - | 低-中 | 通常 50-200ms |
| 维护 | 中 | 高 | 文档更新需同步索引 |
| 人力 | 中 | 高 | 需持续调优召回/重排 |
如果问题用 SFT 就能解决(如固定格式的报告生成),引入 RAG 会增加不必要的复杂度和延迟。
3. “知识”vs”行为”的本质区别
| 维度 | 知识(适合 RAG) | 行为(适合 SFT) |
|---|---|---|
| 更新频率 | 高(随时变化) | 低(相对稳定) |
| 形式 | 事实、文档、数据 | 格式、风格、技能 |
| 验证方式 | 与原文对比 | 人工评估满意度 |
| 错误类型 | “说错了” | “说得太啰嗦/太正式” |
| 修复成本 | 改文档即可 | 需重新训练/调 prompt |
4. 混合方案:RAG + SFT 的组合
生产系统通常不是二选一:
- RAG 负责:动态知识、证据溯源、大规模文档
- SFT 负责:输出格式、角色风格、工具调用流程
- Prompt 负责:安全边界、引用格式、回答长度
5. 面试官常见深挖追问
- ”如果一个客服系统回答风格不对,应该 RAG 还是 SFT?”
- 答:SFT。风格是行为问题,不是知识问题。RAG 只能提供”说什么内容”的材料,不能改变”怎么说”的风格。需要收集符合期望风格的对话数据做 SFT,或者通过 system prompt 约束输出格式。
- ”如果模型总是回答'根据我的知识...'而不是引用检索到的文档,这是 RAG 问题还是模型问题?”
- 答:是模型行为问题。模型没有学会”基于证据回答”的行为模式。解决:1)Prompt 明确要求引用;2)SFT 数据中加入带引用的回答示例;3)后处理检查引用标记。RAG 系统本身可能工作正常(召回到了正确文档),但生成模型没有利用。
- ”RAG 和 Fine-tuning 在成本上怎么比较?”
- 答:RAG 的持续维护成本高(索引更新、检索调优),但增量知识更新便宜(改文档即可);SFT 的一次性训练成本高,但部署后维护成本低(除非需要更新行为)。知识频繁变化 → RAG 更划算;行为需要精确控制 → SFT 更直接。
#69. 如果一个知识库有百万文档,你会怎么做索引、召回、重排和增量更新?
#标准答案
面对百万文档,不能再用“单索引 + 单召回”思路。更稳妥的做法通常是:先做文档清洗与结构化切块,再建立向量索引和词法索引的混合检索体系;查询阶段先粗召回出一批候选,再用 reranker 精排;同时按业务重要性做冷热分层,把高频、时效性强的数据放在更快的索引层,低频长尾数据放在大库里。
增量更新也要单独设计。新增或变更文档应支持局部重切块、局部重编码和局部写入,而不是每次全量重建;但为了避免索引长期漂移或碎片化,仍应定期全量重建。面试时如果你能主动讲到”召回质量、更新延迟、存储成本、线上 SLA”要一起平衡,会比只说”建个向量库”成熟得多。
#深度解析
1. 百万级文档的系统架构
┌─────────────────────────────────────────┐
│ 查询层 (Query Layer) │
│ Query Rewrite → Intent Classification │
└──────────────────┬──────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 检索层 (Retrieval Layer) │
│ ┌──────────┐ ┌──────────┐ │
│ │ 向量索引 │ ←→ │ 词法索引 │ │
│ │ (HNSW) │ │ (BM25) │ │
│ └──────────┘ └──────────┘ │
│ ↓ 混合召回 top-200 │
└──────────────────┬──────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 重排层 (Rerank Layer) │
│ Cross-Encoder Reranker │
│ ↓ top-5 给 LLM │
└──────────────────┬──────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 生成层 (Generation Layer) │
│ LLM + 引用生成 │
└─────────────────────────────────────────┘
2. 索引设计的分层策略
| 分层 | 文档数量 | 索引类型 | 更新频率 | 延迟要求 |
|---|---|---|---|---|
| 热数据 | 1-10 万 | 内存向量库(如 Faiss IVF) | 实时/分钟级 | < 50ms |
| 温数据 | 10-100 万 | 磁盘向量库(如 Milvus/Pinecone) | 小时级 | < 200ms |
| 冷数据 | 100 万+ | 对象存储 + 按需加载 | 天级 | 秒级 |
3. 向量索引算法选择
| 算法 | 构建成本 | 查询成本 | 召回率 | 适用规模 |
|---|---|---|---|---|
| Flat(暴力搜索) | 低 | 高(O(N)) | 100% | < 10K |
| IVF(倒排文件) | 中 | 中 | 95-99% | 10K-1M |
| HNSW | 高 | 低 | 98-99.5% | 100K-10M |
| PQ(乘积量化) | 中 | 很低 | 90-95% | 1M+ |
百万级文档推荐:HNSW + PQ 组合,平衡召回率和查询速度。
4. 增量更新策略
| 策略 | 实现 | 优点 | 缺点 |
|---|---|---|---|
| 实时增量 | 新文档立刻编码写入 | 延迟最低 | 索引碎片化、查询速度下降 |
| 批量增量 | 每小时/天批量更新 | 平衡 | 有一定延迟 |
| 全量重建 | 每周/月重建整个索引 | 索引最优 | 期间服务中断或需双索引切换 |
推荐:批量增量为主 + 定期全量重建(如每天增量,每周全量)。
5. 面试官常见深挖追问
- ”百万文档建一次索引要多久?需要多少资源?”
- 答:以 BGE-large 编码(512 维向量)为例:单张 A100 编码速度约 1000-5000 文档/秒(取决于文档长度)。100 万文档约需 200-1000 GPU 分钟(3-16 小时)。HNSW 索引构建约需 1-4 小时。总时间约 1 天,需要 1-4 张 A100。存储:100 万 × 512 维 × 4 字节 ≈ 2 GB(向量)+ 原文档存储。
- ”如果文档每天更新 1%,增量更新和全量重建怎么选?”
- 答:增量更新足够。每天 1 万文档的局部更新对 HNSW 索引影响很小。但建议每月做一次全量重建,因为:1)增量写入可能导致索引结构非最优;2)删除文档后索引中留有”空洞”;3)长期累积的碎片会影响查询性能。
- ”向量库选型:Milvus、Pinecone、Weaviate、Qdrant 怎么选?”
- 答:Pinecone 是托管服务,最快上手但成本较高;Milvus 功能最全(支持混合检索、多模态、分布式),适合大规模自建;Weaviate 原生支持模块化(可直接集成 embedding 模型);Qdrant 轻量高效,适合中小规模。百万级自建推荐 Milvus 或 Qdrant;不想运维推荐 Pinecone。
#70. GraphRAG 解决的是什么问题,它相比普通向量检索到底多了什么能力?
#标准答案
GraphRAG 主要解决的是普通向量检索难以稳健处理的“跨文档关系、多跳推理、实体网络”问题。普通向量检索回答的是“哪段文本和 query 语义最像”,它很擅长局部相关性;但如果问题需要把多个实体、事件、时间线、因果关系串起来,仅靠相似度往往不够。
GraphRAG 多出来的能力,是把知识组织成节点和边,让系统不仅知道”这段像不像”,还知道”这个实体和那个实体有什么关系””哪些证据应该沿着图继续扩展”。因此它更适合企业知识图谱、复杂调查、跨文档分析等场景。但它也更复杂,若问题本身只是单跳问答,GraphRAG 可能只是把系统做重了。
#深度解析
1. GraphRAG 的典型流程(以微软 GraphRAG 为例)
Step 1: 文档切分 → 文本 chunk
Step 2: 实体抽取(LLM)→ 识别人物、组织、地点、事件
Step 3: 关系抽取(LLM)→ “A 是 B 的 CEO”、”C 收购了 D”
Step 4: 构建知识图谱 → 节点=实体,边=关系
Step 5: 社区检测 → 把相关实体聚成社区
Step 6: 生成社区摘要 → 每个社区一段高层总结
Step 7: 查询时 → 先在社区摘要层定位,再深入具体实体
2. 向量检索 vs GraphRAG 的能力对比
| 能力 | 向量检索 | GraphRAG |
|---|---|---|
| 单跳问答 | 强(语义匹配) | 中(需实体识别) |
| 多跳推理 | 弱 | 强(沿图遍历) |
| 实体关系 | 弱(隐含在文本中) | 强(显式边) |
| 全局总结 | 弱(只有局部 chunk) | 强(社区摘要) |
| 可解释性 | 中(返回相关段落) | 强(返回关系路径) |
| 构建成本 | 低 | 高(需抽取实体关系) |
| 查询延迟 | 低(~100ms) | 中-高(图遍历 + LLM) |
3. GraphRAG 的适用场景
| 场景 | 为什么适合 | 示例查询 |
|---|---|---|
| 企业知识图谱 | 组织架构、汇报关系、项目归属是图结构 | “张三参与的项目有哪些?” |
| 复杂调查 | 需要追踪多个人物/事件的关联 | “A 公司和 B 公司的共同投资方是谁?” |
| 跨文档时间线 | 事件顺序散落在多个文档中 | “这个产品从立项到上市的完整历程?” |
| 因果推理 | 原因和结果在不同文档中 | “为什么 2023 年 Q3 销量下降?” |
4. GraphRAG 的局限
- 构建成本高:需要 LLM 抽取实体和关系,百万文档可能需数万次 LLM 调用
- 抽取误差累积:实体识别错误会导致图结构错误,影响下游查询
- 动态更新复杂:新文档加入后,可能需要重新抽取和建图
- 查询延迟高:图遍历 + LLM 生成摘要,延迟通常是向量检索的 5-10 倍
5. 面试官常见深挖追问
- ”GraphRAG 和知识图谱 + RAG 的混合方案有什么区别?”
- 答:本质类似,但 GraphRAG 更强调”从非结构化文本自动抽取图谱”,而传统知识图谱通常是人工或半自动构建的。GraphRAG 的卖点是”无需预定义 schema,LLM 自动发现实体和关系”。但代价是抽取质量不稳定,且难以保证一致性。
- ”GraphRAG 的社区检测是做什么的?为什么需要它?”
- 答:社区检测(如 Louvain 算法)把图谱中紧密连接的实体聚成社区。目的:1)降维——百万实体直接查询太慢,先定位到相关社区再深入;2)全局视角——社区摘要提供跨文档的高层概览,回答”总结”类问题。没有社区检测,GraphRAG 就退化为普通实体关系查询。
- ”如果文档每天都在变,GraphRAG 怎么增量更新?”
- 答:是难点。新文档需要:1)抽取新实体/关系;2)合并到现有图谱(实体对齐:判断”张三”和”Mr. Zhang”是否同一人);3)更新社区结构和摘要。实体对齐(Entity Resolution)是最大挑战——错误合并会导致图谱污染,不合并会导致信息碎片化。通常需要规则 + 模型结合的混合策略。
#71. “Lost in the Middle” 在 RAG 中怎么缓解?
#标准答案
缓解 Lost in the Middle 的关键,不是继续往 prompt 里塞更多材料,而是让最关键证据更靠前、更集中、更结构化。常见做法包括:用更强的 reranker 把高价值 chunk 排到最前;控制上下文长度,避免低价值材料把证据稀释掉;按主题分组或先做摘要,让证据结构更清晰;必要时采用分步检索或 iterative retrieval,而不是一次性把所有材料拼进去。
如果想回答得更工程化,可以补一句:这个问题说明长上下文能力和检索质量不是一回事。模型形式上支持 128K,也不代表它会平均利用每一段证据。所以 RAG 的优化重点常常不在“加大窗口”,而在“把对的证据摆到对的位置”。
#深度解析
1. "Lost in the Middle" 的实验证据
2023 年斯坦福论文《Lost in the Middle》的定量发现:
- 当上下文包含 20 个文档时,关键信息在开头的准确率 ~90%
- 关键信息在结尾的准确率 ~85%
- 关键信息在中间(第 10-15 位)的准确率骤降到 ~50%
这说明:LLM 不是"看不完",而是"注意力分配不均匀"——开头和结尾有位置偏置(positional bias),中间信息被忽略。
2. 缓解策略的效果对比
| 策略 | 原理 | 效果提升 | 代价 |
|---|---|---|---|
| 重排(Reranking) | 把关键证据排前 3 | +20-30% | 增加 reranker 延迟 |
| 控制上下文长度 | 只保留 top-5 chunk | +15-20% | 可能遗漏辅助证据 |
| 摘要压缩 | 把多个 chunk 压缩成摘要 | +10-15% | 可能丢失细节 |
| 分步检索 | 先粗定位再精检索 | +15-25% | 增加一轮延迟 |
| 关键信息前置 | 手动把答案放开头 | +25-35% | 需要知道哪个是答案 |
3. 为什么"加大窗口"不是解决方案?
常见误区:"模型支持 128K,我把所有召回的 chunk 都塞进去不就好了?"
问题:
- 128K 上下文 ≠ 128K 的有效利用能力
- 即使装得下,注意力分配仍然不均匀
- 更多 chunk = 更多噪声 = 中间信息被进一步稀释
正确思路:在有限且精心选择的上下文里放置最关键证据,而不是盲目扩大窗口。
4. 高级策略:Iterative Retrieval
不是一次性检索所有证据,而是多轮交互:
Round 1: 检索 "公司 A 的 CEO 是谁" → 得到 "张三"
Round 2: 检索 "张三 公司 B" → 发现张三同时是 B 的顾问
Round 3: 检索 "公司 A 和 B 的关系" → 发现关联交易
优点:每轮上下文很短(2-3 个 chunk),不存在"Lost in the Middle" 缺点:延迟增加(多轮检索 + 多轮生成)
5. 面试官常见深挖追问
- "如果 reranker 已经把正确证据排到了第 2 位,模型仍然忽略它,怎么办?"
- 答:这是生成层问题。可能原因:1)模型训练时没有"必须引用前 3 个证据"的约束;2)prompt 没有明确要求引用。解决:在 prompt 中加入"请基于以下证据回答,并引用 [doc_id]"的强制要求,或做 citation-aware SFT。
- "Lost in the Middle 和 Recency Bias 有什么区别?"
- 答:Recency Bias(近因偏置)是模型更关注最近看到的内容(如对话末尾);Lost in the Middle 是模型忽略中间位置的内容。两者相关但不完全相同。在 RAG 中,如果所有证据同时放入 prompt,表现出来的是 Lost in the Middle(中间证据被忽略);如果是多轮对话,可能同时有 Recency Bias(更关注最近几轮的证据)。
- "为什么有些模型(如 Gemini 1.5 Pro)号称能解决 Lost in the Middle?"
- 答:通过改进注意力机制(如稀疏 attention、位置编码优化)和更长的训练序列,这些模型在"大海捞针"测试(needle in haystack)中表现更好。但注意:"能找到针"≠"能综合所有信息做出最佳判断"。即使模型能从 128K 中找到关键句,它仍然可能不善于综合分散在全文中的多段证据。所以 RAG 优化仍然重要。
#72. 你如何评估 RAG,不只是看最终答案对不对?
#标准答案
评估 RAG 至少要分三层。第一层是召回层:正确证据有没有被召回,top-k 命中率、recall、MRR 这类指标能帮助判断“找没找到”;第二层是利用层:模型最终回答是否真正忠实于证据,是否引用了正确片段,是否把无关噪声带进了答案;第三层才是任务层:最终答案对不对、有没有帮助、用户是否满意。
如果只看最终答案,很难定位问题到底出在检索、重排还是生成。一个成熟的回答还可以补一句:线上还应结合人工坏例审查、引用一致性检查、用户反馈和失败类型聚类,形成闭环,而不是把 RAG 当成一次性的离线 benchmark 任务。
#深度解析
1. RAG 评估的三层指标体系
| 层级 | 指标 | 计算方式 | 目标值 |
|---|---|---|---|
| 召回层 | Recall@K | 正确证据在 top-K 的比例 | > 80% |
| MRR | 正确证据排名的倒数均值 | > 0.6 | |
| Hit Rate | 至少一次命中的比例 | > 90% | |
| 利用层 | Citation Precision | 引用文档支持陈述的比例 | > 85% |
| Citation Recall | 陈述有引用支持的比例 | > 80% | |
| Faithfulness | 回答与证据的一致性 | > 85% | |
| 任务层 | Answer Accuracy | 最终答案正确率 | 因任务而异 |
| User Satisfaction | 用户满意度评分 | > 4.0/5 | |
| Task Completion | 任务完成率 | > 85% |
2. 端到端评估 vs 组件评估
| 方式 | 优点 | 缺点 |
|---|---|---|
| 端到端 | 反映真实用户体验 | 无法定位问题根因 |
| 组件评估 | 精确定位瓶颈 | 不能反映组件间的交互影响 |
| 混合评估 | 两者兼顾 | 成本高 |
推荐:开发阶段用组件评估定位问题,上线后用端到端评估监控效果。
3. 自动评估方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| LLM-as-a-Judge | 用 GPT-4 评回答质量 | 主观维度(流畅度、有用性) |
| RAGAS | 自动化指标(faithfulness/answer_relevancy) | 快速迭代评估 |
| ARES | 用轻量模型评上下文相关性 | 大规模批量评估 |
| 人工评估 | 标注员打分 | 最终验证、高风险场景 |
RAGAS 指标计算:
faithfulness= 回答中的陈述能被证据支持的比例answer_relevancy= 回答与问题的相关性context_precision= 上下文中相关 chunk 的比例context_recall= 回答问题所需信息在上下文中的覆盖度
4. 线上闭环评估体系
离线评估(开发期)
├─ 自动指标(RAGAS)→ 快速迭代
├─ LLM Judge → 主观质量
└─ 人工抽检 → ground truth
线上评估(部署期)
├─ 实时指标:延迟、错误率、引用率
├─ 用户反馈:点赞/点踩、满意度
├─ 坏例聚类:自动归类失败模式
└─ 定期人工审计:深度分析
5. 面试官常见深挖追问
- "RAGAS 的 faithfulness 怎么自动计算?"
- 答:步骤:1)用 LLM 把回答拆成独立陈述;2)对每个陈述,检查上下文中是否有证据支持;3)支持的陈述数 / 总陈述数 = faithfulness。自动化但依赖 LLM 的判断质量,可能有偏差。
- "如果一个 RAG 系统 offline 指标很好,但线上用户满意度低,可能是什么原因?"
- 答:1)offline 测试集与线上分布不一致(数据漂移);2)offline 指标没覆盖用户体验维度(如回答太长、太正式);3)线上有离线没遇到的 edge case;4)延迟问题——offline 不计延迟,线上慢导致用户不满。解决:增加线上 A/B 测试、收集用户反馈、定期用线上数据更新测试集。
- "怎么设计一个'可复现'的 RAG 评估流程?"
- 答:1)固定测试集(含 query、标准证据、参考答案);2)固定评估指标和计算脚本;3)固定模型版本和配置;4)记录每次实验的完整配置(prompt、chunk size、top-k、reranker);5)用版本控制管理测试集和评估代码。关键是:任何改动都要能通过相同的评估流程量化影响。