Agent 是如何拥有“手脚”的(ReAct 运行流程)

前言

大语言模型(LLM)非常擅长一件事:

复制代码
理解问题并生成回答

例如:解释代码、回答技术问题、写文章、生成程序代码。

但是 LLM 本身无法直接感知或改变外部环境。例如它本身不能:

  • 读取本地文件
  • 写入文件
  • 查看目录结构
  • 执行终端命令
  • 调用外部 API

换句话说:

复制代码
LLM 只有"大脑",没有"手和脚"

如果希望 AI 能操作真实世界(读文件、写代码、运行命令等),就必须给它提供 工具(Tools),并由程序在模型决策后去真正执行这些工具。

这就是 Agent 的核心思想:

复制代码
模型负责思考
程序负责执行
工具提供能力

很多人第一次接触 Agent 时会问:

模型只是聊天,怎么能读文件、写文件、执行命令?

答案其实很简单:

复制代码
模型负责思考
程序负责执行
工具提供能力

Agent 的核心运行方式叫 ReAct

ReAct(Reason + Act)最早来自一篇论文:

复制代码
ReAct: Synergizing Reasoning and Acting in Language Models

该论文发表于 2022 年 10 月

主要作者:

复制代码
Shunyu Yao
Jeffrey Zhao
Dian Yu
Nan Du
Izhak Shafran
Karthik Narasimhan
Yuan Cao

机构:

复制代码
Google Research
Princeton University

论文地址:

复制代码
https://arxiv.org/abs/2210.03629

论文提出让大模型通过"推理 + 行动"的循环来调用工具解决复杂任务。

ReAct 的基本思想是:

复制代码
Reason(推理) + Act(行动)

也可以简单理解为:

复制代码
推理 + 行动

也就是:

复制代码
思考 → 调工具 → 看结果 → 再思考

循环直到任务完成。


一、第一次发送给模型的完整内容

程序第一次调用模型时,会把 系统提示词 + 用户问题 一起发给模型。

例如:

xml 复制代码
<System_Prompt>

你是一个文件助手。

你必须按照以下 XML 结构返回决策:

<Thought>你的思考</Thought>
<Action>调用的方法</Action>
<Parameters>
<path>文件路径</path>
<content>写入内容</content>
</Parameters>

可用工具:

1. list_files(path)
作用:列出目录文件

2. read_file(path)
作用:读取文件内容

3. write_file(path, content)
作用:写入文件

当任务完成时返回:

<Final_Answer>最终答案</Final_Answer>

</System_Prompt>

<User_Question>

帮我看看当前目录有没有 info.txt,
如果有就读取它,并把前10个字写入 brief.txt

</User_Question>

这里有两个关键部分:

复制代码
System_Prompt → 告诉模型规则和工具
User_Question → 告诉模型任务

二、第一轮:Agent 思考并决定行动

模型会返回:

xml 复制代码
<Thought>
用户想处理 info.txt,但我不能假设文件存在,
应该先查看目录。
</Thought>

<Action>
list_files
</Action>

<Parameters>
<path>.</path>
</Parameters>

注意:

模型并没有真的查看文件。

它只是说:

复制代码
我想调用 list_files

三、程序执行工具

程序解析:

复制代码
<Action>list_files</Action>

然后调用真实代码,例如:

python 复制代码
os.listdir(".")

得到结果:

复制代码
info.txt
main.py
README.md

程序再把结果发回模型:

xml 复制代码
<Observation>
文件列表:
info.txt
main.py
README.md
</Observation>

四、第二轮:模型继续思考

模型看到 Observation 后继续判断:

xml 复制代码
<Thought>
目录中存在 info.txt,
下一步应该读取它的内容。
</Thought>

<Action>
read_file
</Action>

<Parameters>
<path>info.txt</path>
</Parameters>

程序执行:

复制代码
read_file("info.txt")

返回:

xml 复制代码
<Observation>
内容:
人工智能正在改变世界的一切,从生活到工作。
</Observation>

五、第三轮:执行写入操作

模型继续:

xml 复制代码
<Thought>
我已经获得文件内容,
前10个字是"人工智能正在改变世界",
现在需要写入 brief.txt。
</Thought>

<Action>
write_file
</Action>

<Parameters>
<path>brief.txt</path>
<content>人工智能正在改变世界</content>
</Parameters>

程序执行:

复制代码
write_file("brief.txt","人工智能正在改变世界")

返回:

xml 复制代码
<Observation>
写入成功
</Observation>

六、最终回答

模型判断任务完成:

xml 复制代码
<Final_Answer>

任务完成:

已找到 info.txt
读取文件内容
并将前10个字写入 brief.txt

</Final_Answer>

程序看到 Final_Answer 后停止循环。


七、完整流程总结

整个 Agent 的运行流程其实就是:

复制代码
用户提问
↓
模型思考
↓
模型请求调用工具
↓
程序执行工具
↓
工具结果返回
↓
模型继续思考
↓
循环
↓
最终回答

八、程序视角的核心逻辑

程序只需要做三件事:

1 调用模型

2 解析模型返回:

复制代码
<Action>

3 执行对应工具

伪代码:

python 复制代码
while True:

    response = call_llm(messages)

    if "Action" in response:
        run_tool()

    if "Final_Answer" in response:
        break

九、一句话理解 Agent

Agent 本质就是:

复制代码
模型负责思考
程序负责执行
工具提供能力

通过 ReAct 循环

复制代码
Thought → Action → Observation → Thought

不断执行任务。

所以 Agent 看起来像:

复制代码
AI 拥有了"手"和"脚"。
相关推荐
難釋懷1 小时前
初识Lua
开发语言·junit·lua
佩奇大王1 小时前
P159 摆动序列
java·开发语言·算法
Fate_I_C1 小时前
Android现代开发:Kotlin&Jetpack
android·开发语言·kotlin·android jetpack
摸鱼的春哥2 小时前
Agent教程21:知识图谱🕸,让AI🤖学会联想
前端·javascript·后端
SuperEugene2 小时前
Vue3 组件拆分实战规范:页面 / 业务 / 基础组件边界清晰化,高内聚低耦合落地指南|Vue 组件与模板规范篇
前端·javascript·vue.js·前端框架
泯泷2 小时前
阶段二:为什么先设计指令集,编译器和运行时才能稳定对齐?
前端·javascript·架构
!停2 小时前
C++基础入门(缺省参数,函数重载,引用)
开发语言·c++·算法
Dxy12393102162 小时前
HTML常用布局详解:从基础到进阶的网页结构指南
前端·html
XiaoLeisj3 小时前
Android Kotlin 全链路系统化指南:从基础语法、类型系统与面向对象,到函数式编程、集合操作、协程并发与 Flow 响应式数据流实战
android·开发语言·kotlin·协程