Skip to content
签到签到

第 3 章:ReAct Agent Loop

本章解决的问题

面试中常问 Agent 为什么能反复调用工具。这一章解释 ReAct、turn 和 step,并用伪代码展示 Agent Loop。

交互图解:一次 Agent Turn 完整调用链 · 查看图解导读

大白话理解

ReAct 是 Reasoning 和 Acting 的组合,意思是:

text
观察当前情况
-> 思考下一步
-> 执行动作
-> 观察动作结果
-> 再思考

这个过程会一直重复,直到模型认为任务完成,或者达到系统限制。

必须掌握的概念

1. Reasoning

模型根据上下文决定下一步要做什么。这个决定可能是文本,也可能是工具调用。

2. Acting

系统执行模型选择的动作。动作可能是:

  • 读取文件
  • 搜索网页
  • 执行命令
  • 调用另一个工具

3. Observation

工具返回结果后,系统把结果追加到上下文。模型看到结果后继续推理。

4. Turn 与 Step

DeepSeek Harness 中:

  • step:一次模型请求加它触发的工具执行。
  • turn:一个或多个 step,从输入被认领到模型和工具都停止。

一个 turn 可能因为工具调用而包含多个 step。

DeepSeek Harness 对应实现

DeepSeek Harness 的默认 Agent Loop 是 ReactLoopAgent。它的 turn() 方法大致执行:

text
打开 turn
认领输入
组装 prompt
打开 step
写入用户消息
请求模型
写入 assistant chunk 和 assistant message
如果有工具调用:
  执行工具
  写入 tool result
  继续下一步
否则:
  关闭 step
  关闭 turn

这个流程来自 packages/core/agent-loop/src/agent.ts,但学习时不要求逐行阅读。

代码示例

下面是一个简化的 ReAct Loop:

ts
interface AgentMessage {
  role: 'user' | 'assistant' | 'tool'
  content: string
}

interface ToolResult {
  toolName: string
  output: string
}

interface ModelReply {
  text: string
  toolCall?: { name: string; input: string }
  done: boolean
}

async function reactLoop(
  task: string,
  model: (messages: AgentMessage[]) => Promise<ModelReply>,
  runTool: (name: string, input: string) => Promise<ToolResult>,
  maxSteps = 6,
): Promise<AgentMessage[]> {
  const messages: AgentMessage[] = [{ role: 'user', content: task }]

  for (let step = 0; step < maxSteps; step += 1) {
    const reply = await model(messages)
    messages.push({ role: 'assistant', content: reply.text })

    if (reply.done || !reply.toolCall) return messages

    const result = await runTool(reply.toolCall.name, reply.toolCall.input)
    messages.push({
      role: 'tool',
      content: `${result.toolName}: ${result.output}`,
    })
  }

  return messages
}

这个例子展示了 Agent Loop 的核心:模型输出工具调用,系统执行工具,工具结果回填,模型继续推理。

面试怎么问

问:ReAct 是什么?

回答要点:

  • ReAct 是 Reasoning 和 Acting 的循环。
  • 模型先推理,再调用工具,再根据工具结果继续推理。
  • 前端需要展示每一步的思考、工具调用和结果。

问:一个用户输入一定对应一次模型请求吗?

回答要点:

  • 不一定。
  • 如果模型调用工具,系统执行后还要再次请求模型。
  • 因此一个 turn 可能包含多个 step。

问:如何防止 Agent 无限循环?

回答要点:

  • 设置最大 step 数或 token 预算。
  • 设置超时和取消。
  • 工具结果明确告知是否完成。
  • 允许用户停止或继续。

自测题

  1. ReAct 循环的四个阶段是什么?
  2. turn 和 step 的区别是什么?
  3. 工具结果为什么必须回填到模型上下文?
  4. Agent Loop 终止的条件有哪些?

本章小结

Agent Loop 是 Agent 产品的心脏。前端面试的重点不是记住源码,而是能说清“模型、工具、观察、再模型”的循环,以及循环状态如何展示和控制。

进一步阅读:

  • packages/core/agent-loop/src/agent.ts
  • docs/architecture.md#turn-flow