面试官:你项目的 Agent 模式是 ReAct 对吧,讲一下你对 ReAct 的理解?

0 阅读11分钟

这两年只要简历里写了 AgentRAGFunction Call工作流编排,面试官大概率都会盯着问。

很多人一上来就很自信:

“我的项目里用了 ReAct 模式,先 Reason,再 Act,模型会边思考边调用工具,最后得出答案。”

这句话不能说错。

但问题是,如果你只能答到这里,那在一个认真一点的面试官眼里,你大概率只是看过几篇文章、跑过几个 Demo,还没有真正把 Agent 系统做进生产。

因为真正做过的人都知道,面试官一旦顺着这个口子往下追,后面全是硬骨头:

  • Function Call 到底是怎么工作的?
  • ReActPlan-and-Execute 到底有什么本质区别?
  • 你的文档切分策略为什么这么设计?切太碎和切太大分别会有什么坑?
  • 你的 Prompt 是怎么一步步调出来的?你怎么证明它真的优化了,而不是纯玄学?
  • 你项目里最难的部分,到底是“把模型接上去”,还是“把系统做稳定”?

这时候很多人就开始露馅了。

因为 AI 面试最怕的一点就是:表面词汇很新,实际回答很虚。

今天我们就借着 ReAct 这个问题,把 5 个最容易被连环追问的高阶问题,一口气串起来讲透。

第一问:ReAct 到底是什么?别只会背“Reason + Act”

ReAct 这个词很多人都会背,但真正讲明白的不多。

它不是一句“边推理边行动”就结束了,它本质上是一种 让模型把思考过程和工具调用交替进行的决策范式

你可以把它理解成下面这个循环:

用户问题
  -> 模型先判断现在知道什么、不知道什么
  -> 决定要不要调用工具
  -> 执行工具
  -> 读取工具结果
  -> 再判断下一步
  -> 直到可以给出最终答案

比如用户问:

“帮我总结一下这份招股书里和营收增长最相关的 3 个风险点。”

一个成熟的 ReAct Agent 往往不会一步到位瞎答,而是会经历类似这样的链路:

  1. 先识别用户意图,是“总结 + 归因 + 风险提炼”
  2. 判断当前上下文不够,需要检索相关文档片段
  3. 调用检索工具,拿回多个 chunk
  4. 发现 chunk 太多,继续筛选和聚合
  5. 最后基于证据生成结构化答案

所以 ReAct 的关键,不是“会调用工具”,而是:

  • 先判断信息是否足够
  • 在每一步动态决定下一步动作
  • 让模型根据外部反馈不断修正路径

这和传统工作流最大的不同在于,它不是一条完全写死的链,而是带反馈闭环的动态决策过程

一句更像做过项目的人会说的话是:

ReAct 的核心价值,不在于把 Reason 和 Act 这两个词拼起来,而在于它让模型能基于中间结果动态调整后续动作,从而把“静态提示词”升级成“可迭代决策过程”。

第二问:你刚才提到 Function Call,它到底是怎么工作的?

这题特别容易把人问懵。

很多人会说:

“Function Call 就是模型帮你选工具,然后返回参数。”

还是太浅。

它真正的工作流程,一般是这样的:

1. 开发者把可用工具的名称、描述、参数 Schema 传给模型
2. 模型根据用户输入,判断是否需要调用工具
3. 如果需要,模型返回结构化的工具调用意图
4. 业务系统并不直接相信模型,而是先做参数校验
5. 校验通过后,由宿主程序真正执行工具
6. 把工具执行结果再喂回模型
7. 模型基于结果继续推理,决定是否继续调用工具或直接回答

看起来像是模型“会调用函数”,但你一定要明白:

真正执行函数的,从来不是模型,而是你的业务系统。

模型只是产生了一份“调用建议”,比如:

{
  "tool_name": "search_docs",
  "arguments": {
    "query": "招股书 营收增长 风险点",
    "top_k": 5
  }
}

后面真正做事的,是你的 Agent Runtime。

这一点为什么重要?

因为它直接关系到线上系统安不安全。

如果你把模型返回的参数不做校验,直接执行,就可能出现:

  • 参数类型错乱
  • 越权访问
  • 工具误调用
  • 连环调用打爆下游服务

所以成熟系统一般都会加一层很厚的防线:

  • JSON Schema 校验
  • 参数兜底和默认值修正
  • 工具白名单
  • 超时控制
  • 重试与熔断
  • 结果裁剪和脱敏

面试里比较加分的一句话是:

Function Call 本质上不是“模型直接调用函数”,而是“模型输出结构化决策,宿主系统负责安全执行并回传结果”的协议机制。

这句话一出来,面试官基本就知道你不是只停留在 SDK 层。

第三问:Plan-and-Execute 和 ReAct,到底有什么区别?

这题特别适合压力面。

因为它不是问你知不知道概念,而是问你有没有架构取舍能力

很多人会答:

  • ReAct 是边想边做
  • Plan-and-Execute 是先做计划再执行

没错,但还不够。

真正的区别在于它们对“决策时机”的处理完全不同。

ReAct:局部决策,走一步看一步

思考 -> 调工具 -> 看结果 -> 再思考 -> 再调工具

优点:

  • 灵活
  • 对不确定任务友好
  • 遇到新信息时能及时修正

缺点:

  • 容易走弯路
  • 工具调用次数可能很多
  • 成本不稳定

Plan-and-Execute:先做全局规划,再分步执行

先产出任务计划
  -> 子任务1
  -> 子任务2
  -> 子任务3
再逐个执行

优点:

  • 路径更清晰
  • 更容易控制成本和步骤数
  • 更适合长任务、多阶段任务

缺点:

  • 前面的计划一旦做歪,后面容易全歪
  • 对环境变化和中途反馈没那么敏感

所以它们不是谁更高级,而是谁更适合当前场景。

一个比较成熟的回答应该是:

  • 开放式问题、信息不完整、工具反馈不确定:更适合 ReAct
  • 任务链路长、步骤明确、需要成本可控:更适合 Plan-and-Execute
  • 复杂生产场景:常常是两者混搭,先粗规划,再局部 ReAct

你甚至可以再往上讲一层:

ReAct 更像“战术级动态决策”,Plan-and-Execute 更像“战略级任务编排”。很多真正能落地的 Agent 系统,都是先用计划控制方向,再用 ReAct 处理执行阶段的不确定性。

这个味道就很对了。

第四问:你的文档切分策略是什么?为什么这题比你想象得难?

很多人做 RAG,真的就只会一句:

“我把文档按固定长度切 chunk,再做 overlap。”

这话一出口,面试官十有八九就会追问:

“为什么固定长度?为什么 overlap 取这个值?你怎么证明这样切比较合理?”

这题难就难在,它根本没有银弹。

切分策略本质上是在平衡 3 个东西:

  • 召回率
  • 语义完整性
  • 上下文噪音

你切得太碎,会发生什么?

  • 单个 chunk 语义不完整
  • 指代关系断裂
  • 模型拿到的是“碎片证据”
  • 检索命中了也答不全

你切得太大,又会发生什么?

  • 无关信息变多
  • 向量表达被稀释
  • 排名精度下降
  • 上下文窗口被快速吃满

所以真正靠谱的切分,通常不是只按字符数一刀切,而是分层切

文档级
  -> 章节级
  -> 段落级
  -> 必要时再做滑窗切分

如果是技术文档、合同、招股书、FAQ,它们的切分策略通常都不一样:

  • FAQ / 短问答:按问答对切最合适
  • 技术文档:优先按标题层级、段落和代码块边界切
  • 合同 / 法律文本:优先保持条款完整性
  • 长报告 / 招股书:按章节语义分组,再在组内做滑窗

真正高分的回答,不是背一个数字说“我一般切 500 字”,而是说清楚:

  1. 为什么这么切
  2. 这个策略服务的是什么业务目标
  3. 你怎么评估它效果好不好

比如你可以这样答:

我的切分策略不是固定一个 chunk size 到处用,而是先保持语义边界,再在边界内部控制长度。因为检索系统最怕的不是“切得不整齐”,而是“召回的片段既不完整又不聚焦”。我会结合命中率、答案引用质量和最终问答准确率去反推切分策略,而不是拍脑袋定一个长度。

这就不是“用过 RAG”,而是“调过 RAG”了。

第五问:Prompt 你是怎么一步步优化的?怎么测试质量?

这题特别毒。

因为很多人做 Prompt,真实过程其实就是:

  • 改一句
  • 跑一遍
  • 感觉好像好了
  • 再改一句

这在 demo 阶段问题不大,但只要一上生产,这种做法基本等于玄学炼丹。

一个真正工程化的 Prompt 优化流程,至少应该包含 4 个部分:

1. 先定义“好”的标准

你不先定义指标,后面全是空谈。

常见维度包括:

  • 回答正确率
  • 幻觉率
  • 工具调用正确率
  • 首次命中率
  • 平均 token 消耗
  • 平均响应时延

2. 构造评测集

不要拿两三个顺手样例测了就说“效果不错”。

你需要有一批覆盖真实场景的数据:

  • 简单问题
  • 歧义问题
  • 对抗性问题
  • 超长上下文问题
  • 工具容易误调用的问题

3. 做版本化对比

Prompt 不能瞎改,最好每次改动都能回答:

  • 改了什么
  • 为什么改
  • 哪些样例变好了
  • 哪些样例变差了

4. 联合看线上反馈

离线评测很重要,但线上才是真战场。

因为很多问题只会在线上暴露:

  • 用户表达比测试集脏得多
  • 工具返回不稳定
  • 多轮对话会把上下文拉歪
  • 某些提示词会导致 token 暴涨

所以成熟团队往往会同时看:

  • 离线评测结果
  • A/B 实验
  • 用户满意度
  • 失败样本回放
  • 成本曲线

一句很有说服力的话术是:

Prompt 优化不是文学创作,而是实验科学。核心不是“我觉得这样写更好”,而是“我能不能通过评测数据和失败案例证明这次修改确实更优”。

这句话很容易让你跟只会调提示词的人拉开差距。

🎤 面试里的高分收尾话术

如果面试官从 ReAct 一路追到了 Function Call、任务编排、RAG、Prompt 优化,你最后可以用这段话把整条线收住:

我理解 Agent 不是“把大模型接几个工具”这么简单,它本质上是一个以模型为决策核心、以工具系统为执行能力、以评测闭环为优化手段的工程系统。
ReAct 解决的是动态决策问题,Function Call 解决的是模型和外部能力之间的结构化协议问题,RAG 切分策略解决的是证据质量问题,而 Prompt 优化和评测体系解决的是系统是否真的可持续迭代的问题。
所以真正难的部分通常不是把能力做出来,而是把不确定性关进笼子里,让系统在成本、稳定性、效果之间找到平衡。

这段话的价值在于,它能让面试官感受到你看的是“系统”,不是“功能点”。

为什么现在大厂特别爱问这类题?

因为这类问题特别容易筛人。

表面上,大家简历上都能写:

  • 做过 Agent
  • 接过 Function Call
  • 做过 RAG
  • 调过 Prompt

但只要面试官顺着追问 5 分钟,马上就能分出来:

  • 谁只是调了个 SDK
  • 谁只是搭了个 demo
  • 谁真正踩过线上坑
  • 谁有能力把系统继续做深

表面上这题问的是:

  • 你对 ReAct 的理解

实际上它考的是:

  • 你对 Agent 决策范式的理解
  • 你对工具调用边界的理解
  • 你对 RAG 证据链质量的理解
  • 你对 Prompt 工程化优化的理解
  • 你有没有把 AI 应用做成“系统”而不是“玩具”

AI 面试最怕空话。真正有竞争力的候选人,不是能把名词解释出来,而是能把每一个名词背后的工程代价、失败模式和优化路径讲清楚。

END

写在最后:

最近私信问我面试题的小伙伴实在太多了,一个个回有点回不过来。

我大家公认最容易挂的 AI/Go/Java 面试坑点 整理成了一份 PDF 文档。里面不光有题,还有解题思路和避坑指南。

想要的同学,直接加我微信wangzhongyang1993,或者关注并私信我 【面试】,我统一发给大家。