Agent 的工作模式:Thought-Action-Observation - 教程
Thought-Action-Observation
通过 Thought-Action-Observation 理解 Agent 的工作流程。
Agent 的工作是一个循环往复的过程:思考(Thought)→行动(Act)→观察(Observe)
Thought: Agent 的 LLM 部分决定了下一步应该做什么
Action: Agent 通过调用工具来执行操作
Observation: 观察工具的响应结果,作为下一步思考的输入
过程就像动图展示的这样:
这个循环的定义可以在系统提示词中进行定义,明确 Agent 应该遵循的规则。
简单的系统提示例如:
系统消息=
"""你是一个旨在高效、准确帮助用户的AI助手。你的主要目标是提供有用、精确且清晰的回答。
你可以使用以下工具:
工具名称:calculator,描述:对两个整数进行乘法运算。,参数:a: 整数, b: 整数,输出:整数
你需要通过逐步思考来实现目标,将推理过程分为“思考/行动/观察”步骤,如有需要可以重复多次。
你应当首先通过思考:{你的思考内容}来反思当前情况,然后(如有必要)使用正确的JSON格式调用工具行动:{JSON数据块},或者以最终答案:为前缀输出最终回答。
"""
在这个系统提示词中,我们定义了 Agent 的行为,Agent 可以使用的工具,以及关于工具的描述,还将上文中说的 思考(Thought)→行动(Act)→观察(Observe)融入了提示词中。
Thought :内部推理与 ReAct
这一节了解 Agent 的内部运作机制,即其推理和规划能力。
此外 ReAct 作为一种提示技术,让模型在行动之前一步步的思考
Thoughts 代表了 Agent 在解决任务时的内部推理和计划过程,这是 Agent 内部的 LLM 赋予的能力,利用 LLM 对提示的分析,让 Agent 看起来有了思考。
Agent 的思考有助于它评估当前的观察结果,并决定下一步要采取的行动。通过这个过程,Agent 可以将复杂的任务分解成一个个更小的、更容易解决的子任务,观察上一个子任务的结果,不断调整其计划。
Chain-of-Thought (CoT)
思维链(CoT) 是一种引导模型逐步思考问题,最终得出最终答案的技巧。
通常以下面的内容来引导模型一步步思考:
让我们一步步来考虑
这种方法有助于模型内部推理,特别是对于逻辑或数学任务,无需与外部工具交互。
COT的示例:
Query:200 的 15% 是多少?
Thought:让我们一步步的思考,200 的 10% 是 20,200 的 5% 是 10,因此 15% 是 30
Answer:30
ReAct:Reasoning + Acting
ReAct 方法将推理与行动结合起来,它是一种提示技术,鼓励模型逐步思考,并在推理步骤之间穿插一些行为(例如使用工具)。这使得Agent 能够通过交替使用以下方法来解决复杂的任务:
- Thought:内在推理
- Action:使用工具
- Observation:接受工具的输出
ReAct 示例:
Thought:我需要找到杭州最新的天气
Action:查询【杭州的天气】
Observation:杭州今天多云,18℃
Thought:现在我知道天气了…
Action:输出【杭州现在多云,18℃】
对比:ReAct 与 CoT
| 特征 | CoT | ReAct |
|---|---|---|
| 逐步逻辑 | ✅ | ✅ |
| 外部工具 | ❌ | ✅ |
| 使用场景 | 逻辑推理,数学运算,内部任务 | 信息检索,动态多步骤任务 |
最近比较知名的推理模型,例如DeepSeek R1 和OpenAI 的 o1,以及各个大模型都推出了带 think 能力的模型,他们都是经过了微调,能在回答问题之前进行思考。通过标记,例如和,来区分推理阶段和答案生成阶段。这是一种通过训练技术让模型通过示例来学习这种思考模式,这与之前提到的 ReAct 与 CoT 是不同的,他们是一种提示或者引导技术
Action
这一节将介绍 Agent 与环境交互的具体实现方式
Action 是 Agent 与环境交互时执行的具体步骤,无论是浏览网页查找信息或者是控制物理设备,这都是 Agent 规划执行的行为。
Action 的类型:
- JSON Agent
将要执行的操作以 JSON 的格式指定,例如查询天气。这种方式简单,不易出错,适合简单的任务{ "action": "查询天气", "action_input": {"城市": "杭州"} } - Code Agent
智能体直接写出一段代码(通常是Python),这段代码可以包含复杂的逻辑,比如循环、判断、调用各种外部工具等。可以完成非常复杂的操作链。 - Function-calling Agent
函数调用代理是 JSON 代理的一个子类,也是通过 JSON 执行操作,不过执行的是工具的调用而已。
Actions 可以用于多种目的:{ "name": "get_weather", // 要调用的函数名 "arguments": { // 调用函数所需的参数 "location": "New York" } }- 信息收集:执行网络搜索,查询数据库或检索文档。
- 工具调用:进行 API 调用,运行计算和执行代码。
- 环境互动:操作数字界面或者控制物理设备。
- 沟通:通过聊天与用户互动或与其他客服人员协作。
停止和解析方法
为什么要强制停止 LLM 输出
LLM 只处理文本,并用它来描述其要执行的操作以及要提供给工具的参数。为了使代理正常工作,LLM生成完一个完整的行动描述后,必须立即终止输出,将控制权交还给代理,让代理解析LLM输出的行动描述。
如果LLM不停止继续生成,可能出现的问题:
{
"action": "get_weather",
"action_input": {"location": "New York"}
}
哦对了,用户可能还需要湿度信息,让我想想是不是应该再加一个参数...
这样的后续输出会:
- 破坏JSON格式,导致解析失败
- 引入歧义,干扰工具的正确调用
- 使整个智能体系统变得不可靠
具体实现步骤
- 生成结构化指令
LLM输出必须是机器可读的格式:
{
"action": "search_web",
"parameters": {
"query": "今日股市行情",
"count": 5
}
}
- 检测停止信号
系统在检测到以下情况时立即停止LLM:
- 遇到预设的结束标记(如 [STOP])
- JSON格式完整闭合
- 代码块完整生成
- 解析执行
外部解析器读取格式化的操作,确定要调用哪个工具,并提取所需的参数。
# 系统自动执行
result = search_web(query="今日股市行情", count=5)
上面说的是JSON 代理的类型,还有一种就是代码代理。LLM分析任务后,生成完整的可执行代码块,然后执行代码获取代码执行的结果。
Observer
智能体在观察阶段需要做的就是感知,感知的方式就是接受 Action 执行之后的结果,这个结果可以是 API 调用的结果、错误消息、日志消息等,观察这些结果来指导下一个思考周期。
在观察阶段,智能体具体会做的:
- 收集反馈:接收数据或确认操作是否成功
- 追加结果:将新信息整合到现有的上下文中
- 调整策略:利用更新后的上下文信息来完善后续的思考和行动
接受的消息类型:
- 系统的反馈消息
- 错误消息
- 成功通知
- 状态代码
- 数据变更
- 数据库更新
- 文件系统修改
- 状态变更
- 环境数据
- 传感器的读数
- 系统指标
- 资源使用情况
- 响应分析
- API 响应
- 查询结果
- 计算输出
- 基于时间的事件
- 截止日期移到,计划任务已完成
理解一下基于时间的事件,例如,设置一个七点的闹钟叫你起床,当七点钟到的时候,这个任务就会触发,但是这个任务并不是agent执行的,不属于它的 action ,但是这个结果也可以被 agent 感知,从而影响后续的判断
获取观察结果的步骤?
执行 action 之后,智能体会按下面的步骤执行:
- 解析 action 以确定需要调用的函数和要是用的参数
- 执行该 action 操作
- 将结果作为观察的结果追加到上下文中

浙公网安备 33010602011771号