第 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 预算。
- 设置超时和取消。
- 工具结果明确告知是否完成。
- 允许用户停止或继续。
自测题
- ReAct 循环的四个阶段是什么?
- turn 和 step 的区别是什么?
- 工具结果为什么必须回填到模型上下文?
- Agent Loop 终止的条件有哪些?
本章小结
Agent Loop 是 Agent 产品的心脏。前端面试的重点不是记住源码,而是能说清“模型、工具、观察、再模型”的循环,以及循环状态如何展示和控制。
进一步阅读:
packages/core/agent-loop/src/agent.tsdocs/architecture.md#turn-flow