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 拥有了"手"和"脚"。
相关推荐
Csvn几秒前
⚡ Vite 依赖预构建(optimizeDeps)的 3 个经典坑:改了源码不生效、新增依赖 404、缓存怎么清都不行
前端
A242073493011 分钟前
Vue3 + TypeScript:后端数据在表格内渲染后进行增删改的完整实现步骤
前端·javascript·typescript
并不喜欢吃鱼12 分钟前
从零开始 C++------ 十六.深度拆解 C++ 智能指针:unique_ptr/shared_ptr/weak_ptr 底层模拟、内存泄漏根治
开发语言·c++
他们叫我 悦儿遥遥雨14 分钟前
.NET 8 Web开发入门(六):Blazor 全栈开发——告别 JavaScript 焦虑
前端·javascript·.net
不相心 -w-20 分钟前
Cmake的基础用法
linux·开发语言·c++
用户21816970493021 分钟前
Flutter(九)StatelessWidget StatefullWidget
前端
paopaokaka_luck22 分钟前
基于springboot3+vue3的乡村医生诊疗管理系统(AI助手、协同过滤算法、webSocket实时聊天、Echarts图形化分析)
前端·网络·人工智能·spring boot·websocket·网络协议·echarts
编程风暴23 分钟前
3类人群的数据分析实习类型选择+4条选错红线
java·前端·数据分析
其美杰布-富贵-李23 分钟前
Vue 3 模块导入教程:import、export 与文件组织
前端·javascript·vue.js
撑伞的鱼993733 分钟前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor