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 拥有了"手"和"脚"。
相关推荐
Rhi63710 分钟前
从零搭建项目:React 19 + Vite 8 + Tailwind CSS v4 实战配置
前端
竹林81817 分钟前
用Viem替代ethers.js:从一次签名失败到完整迁移的实战记录
前端·javascript
之歆22 分钟前
DAY08_CSS浮动与行内块布局实战指南(上)
前端·css
有一个好名字40 分钟前
工具即双手 —— 从 Bash 到 Tool Dispatch Map
开发语言·chrome·bash
Lyyaoo.40 分钟前
优惠券秒杀业务分析
java·开发语言
light blue bird43 分钟前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform
DevilSeagull1 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
不可能的是2 小时前
Claude Code 子 Agent 机制全解:怎么跑起来、怎么被管理、怎么互不干扰
javascript
MATLAB代码顾问2 小时前
改进遗传算法(IGA)求解作业车间调度问题(JSSP)——附MATLAB代码
开发语言·matlab
jeffwang2 小时前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端