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 拥有了"手"和"脚"。
相关推荐
小李子呢02111 分钟前
前端八股CSS(1)---响应式布局的方法
前端·css
李白你好3 分钟前
Java GUI-未授权漏洞检测工具
java·开发语言
leo__52018 分钟前
拉丁超立方抽样(Latin Hypercube Sampling, LHS)MATLAB实现
开发语言·matlab
sycmancia20 分钟前
Qt——Qt中的标准对话框
开发语言·qt
橙露37 分钟前
Python 对接 API:自动化拉取、清洗、入库一站式教程
开发语言·python·自动化
Omigeq43 分钟前
1.4 - 曲线生成轨迹优化算法(以BSpline和ReedsShepp为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·算法·机器人
2301_8084143844 分钟前
自动化测试的实施
开发语言·python
小李子呢02111 小时前
前端八股Vue(6)---v-if和v-for
前端·javascript·vue.js
程序员buddha1 小时前
ES6 迭代器与生成器
前端·javascript·es6
波波0071 小时前
写出稳定C#系统的关键:不可变性思想解析
开发语言·c#·wpf