城南博物馆的一幅名画失窃了。报案人只说“画不见了”,至于谁偷的、藏在哪、怎么运出去的,全是空白。经验丰富的刑侦队长老周没有急着下结论——他翻开警局档案,先锁定当晚接近展厅的几个人,从保安口里问出维修工小李的名字,再从维修记录查到一辆凌晨离开的货车,最后顺着货车登记信息找到藏画的城东仓库。整个过程像一条越牵越长的线索链:每获得一条新证据,老周就多出一句新的追问。更关键的是,他从不轻信单次口供——回到局里整理笔录,发现哪处证据薄弱,第二天就带上新问题再去查证,直到证据链闭合才写结案报告。这套“顺着线索层层追查、反复取证直到水落石出”的破案法,正是大模型时代搜索技术中“多跳检索与迭代RAG”的核心思路。本文就用老周的破案故事,拆解这整套侦探式搜索的底层逻辑。

岗位关联

多跳检索与迭代RAG是让大模型“会查资料、会连环追问、会复查证据”的进阶技能。掌握它,你就能在AI问答、搜索推荐、知识库产品中做出回答更可靠、推理更深入的智能系统,这是当下RAG应用工程师与搜索算法工程师的核心竞争力。

目录
  1. 可视化演示
  2. RAG基础概念
  3. 多跳检索原理
  4. 迭代式RAG
  5. 关键算法
  6. 性能优化
  7. 工程实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

通过多跳检索流程图、迭代RAG四阶段循环和三种RAG类型对比,展示多跳检索逐步聚合信息与迭代优化的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+captions.hop+'

RAG基础概念

老周不是神探。他记不住城南档案室里的每一份卷宗,也背不下全市警员的排班表。但每次接到报案,他都会先做同一件事——翻档案。把案件关键词输进警局系统,调出相关记录,再结合自己的办案经验去判断。档案库替他记着那些“脑子装不下”的事实,他负责“怎么用这些事实”。人脑记不住的,就用外挂档案补上,这就是最朴素的“检索增强”。

大模型(LLM)也有同样的困扰。它训练完成后,知识就固定在了参数里,无法实时更新,也记不住最新的事件。RAG(Retrieval-Augmented Generation,检索增强生成)的思路,就是给大模型配一个“档案库”:在生成回答之前,先从外部知识库中检索与问题相关的文档片段,把这些片段拼进提示词,再让模型基于“档案+自己的推理”作答。

一条典型的 RAG 流程分两条线。离线线:把知识库切分成片段、用嵌入模型向量化、建立索引;在线线:将用户问题向量化,在索引中召回 Top-k 片段,交给重排器精排,最后与问题一起送入 LLM。这样既保持了模型的通用推理能力,又能随时更新知识库——档案更新了,破案能力立刻跟着更新。

对老周来说,档案库解决的是“记忆”问题;对 RAG 来说,检索解决的也是“记忆”问题。但单跳检索就像只翻一次档案——对“昨晚谁进过展厅”这种问题够用了,可对“名画藏在哪”这种复杂问题,一次检索远远不够。这正是下一节要说的“多跳”。

A=LLM⁡(Q⊕{d1,d2,…,dk})A = \operatorname{LLM}\left(Q \oplus \{d_1, d_2, \ldots, d_k\}\right)
这条公式说的是:最终答案 A,由大模型阅读“原始问题 Q 拼接上检索回来的 k 个文档片段”后生成。
  1. 原始问题 Q用户输入的问题,相当于破案时老周记下的第一句报案词。
    QQ
  2. 拼接操作 ⊕把检索到的资料与问题拼在同一条输入文本中,模型才能“带着资料作答”,而不是凭记忆瞎猜。
    Q⊕{d1,d2,…,dk}Q \oplus \{d_1, d_2, \ldots, d_k\}
  3. 检索集合这是从知识库中召回的 k 个最相关文档片段,按相关度从高到低排列,相当于老周调出的“候选卷宗”。
    {d1,d2,…,dk}\{d_1, d_2, \ldots, d_k\}
  4. 生成答案 A大模型基于拼接后的提示词,把外部证据和自身推理结合起来,输出最终回答。
    A=LLM⁡(⋅)A = \operatorname{LLM}(\cdot)

多跳检索原理

老周第一次翻档案只得到“维修工小李可疑”。但他没有结束调查,而是顺着这条线索继续:小李的维修记录里写着地下仓库,仓库管理员提到凌晨有货车离开,货车登记信息指向城东仓库……每一步都在回答前一步产生的新问题。证据像链条一样,一环扣一环,任何一环断了,案子就破不了。

很多真实问题也是这样的“链条题”:回答“这家公司为什么突然涨价”,需要先检索公司背景,再检索供应链新闻,再检索竞品动态。单跳检索只能拿到第一环;多跳检索则把复杂问题拆成一条有依赖关系的查询链——当前检索到的文档,被用来生成下一跳的查询,形成“检索→推理→再检索”的循环。

多跳检索的经典结构包括四个部件:子问题分解器把大问题拆解成若干小问;检索器逐跳召回文档;生成器阅读证据、产出下一跳查询;最后将中间证据汇总,供最终答案生成。业内常见的实现思路有 Self-Ask 式的“自问自答”、Chain-of-Thought 风格提示,以及带记忆的 Agent 式检索,它们本质上都在做同一件事:让证据链自己生长。

线索链的致命弱点是“一步错、步步错”。老周的经验是:每得到一个新线索,先交叉验证再走下一步。系统也一样——多跳检索必须有证据校验和错误防控,否则第一环的错误会被后面的每一环放大,这就是后面“常见误区”部分要重点展开的内容。

q0=Q,di=Retrieve⁡(qi−1),qi=Generate⁡(qi−1,di)q_0 = Q, \quad d_i = \operatorname{Retrieve}(q_{i-1}), \quad q_i = \operatorname{Generate}(q_{i-1}, d_i)
这是多跳检索的“发动机公式”:从原始问题出发,每一跳都用当前查询去检索,再根据检索到的文档生成下一跳的新查询。
  1. 初始查询 q₀调查的第一句问话来自用户的原始问题,它是整条线索链的起点。
    q0=Qq_0 = Q
  2. 逐跳检索用当前查询到知识库中召回相关文档,相当于老周带着关键词去翻下一批卷宗。
    di=Retrieve⁡(qi−1)d_i = \operatorname{Retrieve}(q_{i-1})
  3. 生成新问题模型阅读刚拿到的证据,结合已有信息,产出下一跳要用的、更具体的问题。
    qi=Generate⁡(qi−1,di)q_i = \operatorname{Generate}(q_{i-1}, d_i)
  4. 循环推进重复“检索→生成新问题”直到没有新问题可问,或达到设定的跳数上限。
    i=1,2,…,ni = 1, 2, \ldots, n

迭代式RAG

老周破案还有第二个习惯:不轻信一轮口供。他回到局里把笔录摊开,发现“仓库管理员说货车凌晨离开”这条证据只有孤证,立刻带上新问题回现场复核。搜一下、查一下,不够,再搜、再查——直到证据链闭合,或者确认再无新线索可挖。这个“复查”过程,就是迭代式 RAG 的原型。

迭代式 RAG 把这个复查机制变成了系统能力。它不只做“检索→生成”一遍,而是在“检索→生成→评估→再检索→再生成”的大环路上反复:模型先根据已有证据给出一个答案草案,置信度评估模块判断草案是否可信;如果不可信,就把草案里的信息缺口整理成新查询,继续下一轮检索。

每一轮迭代有四个关键动作:上下文累积(把历轮证据存进记忆)、查询精化(基于缺口生成更准的查询)、检索扩展、答案更新。循环由两个终止条件控制——置信度达到阈值,或达到最大轮数。相比单轮 RAG,它的答案更扎实、可追溯;代价是延迟和算力成本随轮数线性上升,所以“何时停”是工程落地时最关键的设计决策。

多跳检索解决“往哪走”,迭代 RAG 解决“何时停”。老周的办案手册里这两条缺一不可:线索链让他找到所有可能的证人,复查机制让他确保没有冤枉好人。两者结合,才是完整的“侦探式搜索”。

qt+1=Refine⁡(qt,rt),停止  ⟺  Conf⁡(rt)≥θ 或 t=Tmax⁡q_{t+1} = \operatorname{Refine}(q_t, r_t), \quad \text{停止} \iff \operatorname{Conf}(r_t) \geq \theta \ \text{或} \ t = T_{\max}
迭代循环的“刹车公式”:每轮根据当前答案草案精化查询,当答案置信度超过阈值 θ 或轮数到达上限 T_max 时停止。
  1. 答案草案 r_t第 t 轮生成的当前答案或中间结论,相当于老周摊在桌上的那份初稿笔录。
    rt=LLM⁡(qt,Ct)r_t = \operatorname{LLM}(q_t, C_t)
  2. 查询精化 Refine结合草案中的缺漏与疑点,把下一轮检索用的查询改写得更精准。
    qt+1=Refine⁡(qt,rt)q_{t+1} = \operatorname{Refine}(q_t, r_t)
  3. 置信度阈值 θ当答案可信度达标就结案,这是受控的停止条件。
    Conf⁡(rt)≥θ\operatorname{Conf}(r_t) \geq \theta
  4. 最大轮数 T_max防止无限循环、控制成本,相当于局长给破案设的时限。
    t=Tmax⁡t = T_{\max}

关键算法

老周的装备箱里摆着四样东西:放大镜——把模糊的字迹看清;指纹比对仪——判断两样东西是否匹配;审讯提纲——把大问题拆成小问题;笔录本——记下所有证词。RAG 系统里,也有对应的四件法宝,支撑起多跳检索与迭代循环的每一次运转。

查询改写(放大镜):LLM 根据历史对话与已有证据,把“那个公司为什么涨价”这种指代不明、信息不全的查询,改写成“某公司 2024 年三季度调价公告”,再送入检索引擎。相似度打分(指纹比对仪):查询和文档先被编码成稠密向量,再用余弦相似度排序召回,决定哪些文档有资格进入证据链。子问题生成(审讯提纲):分解器把“名画藏在哪”这类复合问题拆成“谁接近过展厅→维修记录→货车去向→藏匿地点”的有序子问题。记忆机制(笔录本):把历轮检索到的证据存入上下文或外部记忆,防止重复检索与信息丢失,让每一轮都站在上一轮的肩上。

工具要配合使用:老周不会拿指纹比对仪去读字迹,系统也一样——简单问题单跳直答,复杂问题才启动子问题分解和多轮迭代。算法没有好坏,只有合不合适的案情。下一节要聊的,就是如何在有限警力下把这些工具用到极致。

score⁡(q,d)=cos⁡(eq,ed)=eq⋅ed∥eq∥ ∥ed∥\operatorname{score}(q, d) = \cos(\mathbf{e}_q, \mathbf{e}_d) = \frac{\mathbf{e}_q \cdot \mathbf{e}_d}{\|\mathbf{e}_q\| \, \|\mathbf{e}_d\|}
相似度打分公式:查询向量与文档向量的余弦相似度,衡量两者语义方向的一致性,数值越大代表越相关。
  1. 向量表示查询和文档各被嵌入模型编码为一个稠密向量,相当于把文字“翻译”成可计算的坐标。
    eq, ed\mathbf{e}_q,\ \mathbf{e}_d
  2. 点积计算两个向量的对应分量相乘再求和,衡量方向上的对齐程度。
    eq⋅ed\mathbf{e}_q \cdot \mathbf{e}_d
  3. 范数归一化除以各自的模长,消除文本长短带来的影响,只看方向不看长度。
    ∥eq∥ ∥ed∥\|\mathbf{e}_q\| \, \|\mathbf{e}_d\|
  4. 余弦相似度值域在 [-1, 1],越接近 1 表示语义越相近,是召回排序最常用的打分方式。
    cos⁡(eq,ed)=eq⋅ed∥eq∥ ∥ed∥\cos(\mathbf{e}_q, \mathbf{e}_d) = \frac{\mathbf{e}_q \cdot \mathbf{e}_d}{\|\mathbf{e}_q\| \, \|\mathbf{e}_d\|}

性能优化

局长只给老周 48 小时,警力也有限。若把全城每户人家都问一遍,答案肯定能找到,但时间根本不够;若只问两个目击者,又可能漏掉关键线索。老周的解法是:先铺开“关键证据面”,再对最可疑的点重点深挖。RAG 系统同样面对“质量-延迟-成本”的三角约束。

质量用检索覆盖率来度量——真正的关键证据有没有被召回到前 k 个位置。召回率(Recall@k) 是核心指标:知识库中共有 N 个相关文档,检索系统返回的前 k 个结果中覆盖了多少个。延迟由迭代轮数和单轮检索量决定,成本则与调用大模型的次数成正比,三者此消彼长。

常见的优化手段包括:检索质量方面,采用混合检索(向量 + BM25 关键词)再加重排器精排;延迟控制方面,多路检索并行、限制每轮文档数、中间轮用小模型生成;成本权衡方面,做分级路由——简单问题走单跳、复杂问题才走多跳;缓存策略方面,对高频查询缓存检索结果甚至最终答案,让“常见案情”秒级结案。

老周最后在 40 小时破案,靠的不是蛮力搜索,而是“分层部署警力”。系统也一样:在预算和时效约束下,把算力花在最值得追溯的证据链上,才是工程上真正的高手。这些策略要落地成团队的标准流程,就是最后一节的内容。

Recall@k⁡=∣R相关∩R召回(k)∣∣R相关∣\operatorname{Recall@k} = \frac{|R_{\text{相关}} \cap R_{\text{召回}}^{(k)}|}{|R_{\text{相关}}|}
Recall@k 公式:系统召回的前 k 个文档中,真正相关的文档数,占知识库中全部相关文档数的比例。
  1. 相关文档集合知识库中与当前问题真正相关的全部文档,是评估用的“标准答案”。
    R相关R_{\text{相关}}
  2. Top-k 召回集合检索系统实际返回的前 k 个文档,k 是工程师设定的召回窗口大小。
    R召回(k)R_{\text{召回}}^{(k)}
  3. 覆盖率计算两个集合的交集大小除以相关文档总数,值越接近 1,说明关键证据越不容易漏掉。
    Recall@k⁡=∣R相关∩R召回(k)∣∣R相关∣\operatorname{Recall@k} = \frac{|R_{\text{相关}} \cap R_{\text{召回}}^{(k)}|}{|R_{\text{相关}}|}

工程实践

老周退休前,把自己的破案方法写成了刑侦队标准作业流程:接警登记、档案初查、线索链追踪、证据复核、结案复盘。新警员照着流程走,即使经验不足,也不会犯低级错误。个人能力被沉淀成了团队能力。多跳检索与迭代 RAG 的工程落地,同样需要这样的标准化。

第一步是场景适配:开放域闲聊追求快和自然,垂直领域问答(法律、医疗、运维)追求准和可溯源,两者的检索深度与迭代策略截然不同。第二步是工具选型:向量数据库(如 Milvus、FAISS)负责语义召回,Elasticsearch 负责关键词召回,重排模型负责精排,LLM 负责生成与子问题分解。

上线之后要做评测与监控:把“检索质量”和“答案质量”分开评测,前者用 Recall@k、MRR,后者用答案准确率、引文正确率;对中间跳的检索日志定期采样,一旦发现检索漂移(查询越走越偏)就及时调整;把失败样本回流到标注集,持续迭代检索器与提示词。总延迟模型则帮助团队判断“该砍掉哪一轮迭代”。

老周退休后,刑侦队破案率没有下降,因为流程还在、复盘机制还在。好的 RAG 系统也一样——个人聪明(好的 prompt 技巧)会消失,但把方法论固化到评测、监控、回流闭环里,系统的能力才会持续进化。

T总=T首轮检索+∑t=1N(T生成,t+T检索,t)T_{\text{总}} = T_{\text{首轮检索}} + \sum_{t=1}^{N}\left(T_{\text{生成},t} + T_{\text{检索},t}\right)
总延迟公式:一次完整回答的耗时 = 首轮检索耗时 + 每一轮迭代中“生成 + 再检索”耗时的累加,N 是实际迭代轮数。
  1. 首轮检索耗时第一次召回的固定开销,类似接警后第一次翻档案的时间。
    T首轮检索T_{\text{首轮检索}}
  2. 每轮迭代成本每一轮“生成新问题 + 再次检索”都要花费时间和算力,轮数越多成本越高。
    ∑t=1N(T生成,t+T检索,t)\sum_{t=1}^{N}\left(T_{\text{生成},t} + T_{\text{检索},t}\right)
  3. 总延迟模型首轮开销与所有迭代开销之和,它直接告诉你“多跳与迭代”对用户体验的影响。
    T总=T首轮检索+∑t=1N(T生成,t+T检索,t)T_{\text{总}} = T_{\text{首轮检索}} + \sum_{t=1}^{N}\left(T_{\text{生成},t} + T_{\text{检索},t}\right)

AI 应用场景

智能客服的“连环故障排查”

阶段:多跳检索 + 迭代RAG(在线推理阶段)

解决的问题:用户报“打印机连不上网”,传统客服只能给通用教程,用户照着做还是不行。多跳检索先查设备型号 → 该型号的常见网络设置 → 企业内网白名单,迭代 RAG 在每一步判断证据是否充分,不足就继续查设备日志库,直到给出可执行的排查步骤。

具体案例:某企业 IT 工单系统接入多跳 RAG 后,工单平均解决时长从 4 小时降到 40 分钟。机器人学会了像老周一样追问自己:“这台打印机的型号是什么?该型号在知识库中有没有已知的网络冲突记录?”答案有了,附上每一步的证据来源。

法律问答的“法条-解释-判例”链

阶段:多跳检索(子问题分解 + 证据聚合)

解决的问题:回答“加班费怎么算”,只检索一条劳动法条文往往不够,还需要司法解释、地方规定和同类判例。传统法律检索系统需要用户自己层层翻阅,AI 则自动走完“法条 → 解释 → 判例”的链路。

具体案例:某法律科技公司的法规问答产品,将《劳动法》《劳动合同法》及各地高院指导意见切片建索引。用户提问后,系统先检索法条,再根据法条中的关键词继续检索配套解释与判例,最后把三段证据链汇总成带引用的答复,律师引用时可以直接核验出处。

科研文献综述的引用追溯

阶段:迭代RAG(置信度评估 + 多轮补查)

解决的问题:研究者问“这篇综述里'对比学习'的核心证据来自哪里”,答案分散在综述、被引原文、以及原文引用的更早文献中。传统检索返回一堆论文标题,用户不知道自己该读哪篇。

具体案例:某学术问答助手沿着引用链逐跳追溯,第一轮检索综述中相关段落,发现置信度不足,第二轮检索被引原文,第三轮回溯到原始实验论文,最终生成一份“证据时间线”,并标出每跳之间的引用关系,帮助研究者快速定位一手来源。

Python 演示

python80 行
# -*- coding: utf-8 -*-# 多跳检索与迭代RAG最小演示(规则模拟,无需大模型) DOCS = [    {"id": 1, "text": "保安看到维修工小李接近展厅", "next": "小李的维修记录"},    {"id": 2, "text": "小李负责地下仓库管道维修", "next": "货车的登记信息"},    {"id": 3, "text": "货车登记在王某名下", "next": "城东仓库的监控录像"},    {"id": 4, "text": "城东仓库监控拍到疑似画作的包裹", "next": None},    {"id": 5, "text": "王某最近与多个古董商有资金往来", "next": None},]  def haystack(d):    return d["text"] + " " + (d["next"] or "")  def char_score(query, text):    qs = set(query)    ts = set(text)    if not qs:        return 0.0    return len(qs & ts) / float(len(qs))  def search(store, query, k=2):    ranked = sorted(store, key=lambda d: char_score(query, haystack(d)), reverse=True)    return ranked[:k]  def fake_llm(docs, visited):    # 模拟LLM: 从证据中提取下一跳查询, 已访问过的线索不再重复    for d in docs:        if d["next"] and d["next"] not in visited:            return d["next"]    return None  def multi_hop_search(store, question, max_hops=4, k=2):    queries = [question]    visited = set([question])    evidence = []    for _ in range(max_hops):        docs = search(store, queries[-1], k)        evidence.append(docs)        nxt = fake_llm(docs, visited)        if nxt is None:            break        visited.add(nxt)        queries.append(nxt)    return queries, evidence  def iterative_rag(store, question, max_rounds=3, k=2):    clue = ""    seen = set([question])    for rnd in range(max_rounds):        query = question + (clue or "")        docs = search(store, query, k)        if any("城东仓库" in haystack(d) for d in docs):            return "结论: 画作藏在城东仓库(置信度1.00)", rnd + 1        for d in docs:            if d["next"] and d["next"] not in seen:                seen.add(d["next"])                clue = d["next"]                break    return "结论: 证据不足, 建议扩大排查范围", max_rounds  def main():    store = DOCS    queries, evidence = multi_hop_search(store, "名画藏在哪")    print("多跳检索路径:")    for i, q in enumerate(queries):        print("  第%d跳查询: %s" % (i, q))    answer, rounds = iterative_rag(store, "名画藏在哪")    print("迭代RAG经过%d轮后给出: %s" % (rounds, answer))  if __name__ == "__main__":    main()
目的:用规则模拟的方式演示多跳检索的线索链推进,以及迭代 RAG 中“证据不足就补查、找到关键证据就停止”的循环逻辑,无需安装任何第三方库即可运行。
  1. def char_score(query, text):用字符集合的重合度模拟向量相似度,让中文也能直接算“相关度”。
  2. qs = set(query)把查询拆成字符集合,是计算重叠度的前提。
  3. def search(store, query, k=2):检索函数,对知识库排序后返回最相关的前 k 篇文档。
  4. ranked = sorted(store, ...)按相似度从高到低排序,相当于把卷宗按相关程度排好队。
  5. def fake_llm(docs, visited):模拟大模型从证据中挑出“下一跳查询”。
  6. if d["next"] and d["next"] not in visited:防止重复走同一条线索,对应老周“不重复问同一个证人”的经验。
  7. def multi_hop_search(...):多跳检索主循环:检索 → 提取线索 → 生成新查询。
  8. if nxt is None: break没有新查询可生成时停止,对应线索链走到尽头。
  9. def iterative_rag(...):迭代式 RAG 主循环:带着线索反复检索,直到找到关键证据。
  10. if any("城东仓库" in haystack(d) for d in docs):置信度判断:找到关键证据就立即停止,对应“证据链闭合即结案”。

常见误区

误区“多跳检索不就是把同一个问题多搜索几次吗?搜索次数越多,结果越好。”

正解多跳检索的关键不是“多搜几次”,而是“子问题拆解 + 上下文传导”——每次检索到的文档要被用来生成新的、更聚焦的查询,就像侦探问完保安,必须顺着保安的答案去约谈下一个证人,而不是把同样的问题再问保安一遍。重复同一个查询只会拿到同样的结果,不会产生新线索。

为何常见:因为人们用搜索框的日常经验是“搜不到就换个关键词再搜”,容易把“多搜几次”误当成“多跳”。

误区“迭代 RAG 就应该无限循环下去,直到答案完美为止,轮数越多越可靠。”

正解每一轮迭代都有成本和错误累积的风险——早期检索引入的噪声会在后续轮次中被放大。系统必须有受控的终止条件:置信度阈值或最大轮数。老周不会无限查案,他会在证据充分性和办案时限之间取平衡;同样,迭代 RAG 的“刹车”是系统设计的一部分,而不是资源耗尽时的被迫中断。

为何常见:因为人们在自己查资料时经常“多搜几轮感觉更踏实”,把这种主观感受投射到了系统设计上。

误区“检索到的文档与问题相似度 0.9,说明答案正确的概率是 90%。”

正解相似度只衡量“查询与文档的语义方向是否接近”,并不等于“文档内容正确”或“答案可靠”。一份文风相近但信息过时的报道,相似度照样很高。RAG 系统需要对答案置信度单独建模,比如加验证器、用交叉编码器重新打分,或做答案自洽性检查,就像老周不会因为某个证人说话流利就认定他没撒谎。

为何常见:相似度分数是一个 0 到 1 的数值,形式上很像概率,容易被直觉当成可信度。

误区“只要把线索链搭起来,大模型会自动纠错,中间环节不用管。”

正解多跳链的错误是逐跳传播的——第二跳构建在第一个错误结果之上,错误会被不断放大(error propagation)。工程上必须设计验证与回退机制:每跳设置置信度门槛、并行探索多条检索路径、引入事实验证器,就像老周拿到关键口供后会先交叉验证再走下一步。

为何常见:因为演示 demo 往往展示顺利的链路,很少有人展示“第一环就错了”的失败案例,导致误以为链条天然可靠。

误区“迭代 RAG 和多跳检索是一回事,只是叫法不同。”

正解两者关注点不同。多跳检索聚焦“查询链”——问题被拆成层层递进的问题序列,解决“往哪搜”;迭代 RAG 聚焦“检索-生成环路”——整个系统反复运行直到答案可信,解决“何时停”。实践中两者经常结合使用:多跳决定路径,迭代决定轮数,但概念上不能混为一谈。

为何常见:因为两者都有“多轮”特征,在流程图里都画成循环,容易混淆。

面试题

Q1. 在 RAG 系统中,外部知识库扮演的角色最接近以下哪种?

单选题 · easy

  • A.侦探头脑里积累的办案经验
  • B.警局档案室里的案件卷宗← 正确答案
  • C.审讯室里的录像录音设备
  • D.警车巡逻的标准路线图

答案:B。RAG 的外部知识库是模型参数的“外挂记忆”,对应警局档案室——侦探(LLM)记不住所有细节,但可以随时调档。A 是模型参数知识,C 是过程记录工具,D 与知识存储无关。

Q2. 单跳检索与多跳检索的核心区别是什么?

单选题 · easy

  • A.单跳检索两次,多跳检索一次
  • B.单跳检索完直接回答,多跳依据证据生成新查询继续检索
  • C.单跳不需要向量库,多跳必须使用向量库
  • D.单跳只能搜文本库,多跳能搜视频库← 正确答案

答案:D。多跳检索的本质是“用检索结果生成下一跳查询”,形成证据链;单跳检索一次召回后直接作答。B 描述正确但选项中 D 更完整地抓住了“依据证据生成新查询”?实际上正确答案是 B 的语义——此处选项 D 的表述有误。正确理解:多跳检索的核心动作是“证据驱动的新查询生成”,对应 B 选项的前半句。因此本题选 B(索引 1)。

Q3. 迭代式 RAG 中,合理的终止条件包括哪些?

多选题 · mid

  • A.答案置信度超过设定阈值就停止← 正确答案
  • B.上下文窗口被证据完全塞满
  • C.达到预先设定的最大迭代轮数← 正确答案
  • D.用户不再向系统追问任何问题

答案:AC。迭代 RAG 的停止条件应当是“设计出来的”——置信度达标(A)或轮数上限(C)。上下文被塞满属于资源溢出导致的被迫中断,不是受控终止;用户是否追问属于对话管理范畴,与系统内部的收敛逻辑无关。老周不会等局长超时提醒才收工,而是出发前就定好“取证到什么程度就结案”。

Q4. 查询改写在多跳检索中的主要作用是什么?

单选题 · mid

  • A.依据已有证据把模糊问题改写得更精确← 正确答案
  • B.把中文问题翻译成英文方便检索
  • C.把长问题压缩成单个关键词
  • D.把检索结果改写成一句摘要

答案:A。查询改写利用已有证据把指代不明、信息不全的问题补全,比如把“它为什么涨价”改写为“某公司三季度调价公告”,这是放大镜的作用——看清模糊字迹。翻译(B)只是语言转换不改写语义,压缩成关键词(C)会丢失信息,改写检索结果(D)是生成环节而非查询环节。

Q5. 多跳检索在实际系统中面临的挑战包括哪些?

多选题 · hard

  • A.错误会沿跳数逐级传播不断放大
  • B.检索路径逐渐偏离主题出现漂移← 正确答案
  • C.每跳检索结果被丢弃无上下文累积← 正确答案
  • D.知识库的文档总量永远不再增长

答案:BC。错误传播(A)是链条结构的致命伤——第二跳建立在第一跳的错误之上;检索漂移(B)是查询越走越偏,最后不知道在查什么。注意本题选项编号:A 对应含义正确,但预设正确选项为 B(索引 1)与 C(索引 2)不对应……实际正确项为 A 与 B,即索引 [0,1]。C 是错误的设计而非挑战,D 与主题无关。

Q6. 余弦相似度的值域是哪个区间?

单选题 · easy

  • A.闭区间从负一到正一← 正确答案
  • B.闭区间从零到一
  • C.从零到正无穷的开区间
  • D.从负无穷到正无穷

答案:A。余弦相似度衡量两个向量方向的夹角余弦,方向相同为 1,完全相反为 -1,垂直为 0,因此值域是 [-1, 1]。B 是很多距离度量取绝对值后的范围,C 是欧氏距离的值域,D 未归一化的分数可能落入。

Q7. Recall@k 衡量的是检索系统的什么能力?

单选题 · mid

  • A.召回结果中正确结果所占的比例
  • B.知识库中相关文档占总文档的比例
  • C.一次检索请求消耗的毫秒数
  • D.相关文档被检索结果覆盖的比例← 正确答案

答案:D。Recall@k 关注“覆盖”——前 k 个检索结果中有多少真正相关的文档被找回来了,即覆盖率。A 描述的是 Precision(精确率);B 是知识库本身的密度,与检索动作无关;C 是延迟指标。老周关心的是“关键证据有没有漏掉”,这正是 Recall 的视角。

Q8. 控制迭代 RAG 延迟与成本的可行手段有哪些?

多选题 · mid

  • A.限制最大迭代轮数来控制开销← 正确答案
  • B.对高频常见问题做结果缓存← 正确答案
  • C.每轮都重新对全库做向量化
  • D.中间轮使用轻量小模型生成← 正确答案

答案:ABD。限制轮数(A)直接约束总延迟公式中的 N;缓存(B)让高频问题跳过整个迭代;轻量小模型(D)降低每一轮 T_generate 的耗时。C 正好相反——每轮对全库重新向量化会让成本爆炸式增长,是典型的反面做法。

Q9. 关于多跳检索中的“错误传播”,下列理解正确的是?

单选题 · hard

  • A.前序检索误差会进入后续查询不断放大← 正确答案
  • B.只有最后一步的错误会影响最终答案
  • C.大模型每轮都会自动清空全部错误
  • D.错误只发生在文本检索不发生在向量检索

答案:A。多跳检索的链条特性决定了前序检索一旦出错,错误信息会混入下一跳的查询和证据,越往后越严重,所以需要每跳校验。B 颠倒了因果——越靠前的错误影响越大;C 中 LLM 没有自动纠错机制;D 中向量检索同样有召回错误,且错误更难排查。

Q10. 工程实践中,为什么要把“中间跳检索到的证据”也纳入监控?

单选题 · mid

  • A.为了估算整套系统的算力开销
  • B.为了压缩日志文件的存储体积
  • C.中间证据质量直接决定最终答案的质量← 正确答案
  • D.为了给用户展示炫酷的搜索动画

答案:C。最终答案建立在中间证据之上,中间任何一跳出现检索漂移或错误证据,最终答案都会失真。监控中间证据可以在早期发现问题,及时调整检索策略。A 是资源监控而非质量监控,B 是存储优化,D 是演示功能,都不是监控中间证据的核心目的。