Previous
Day 03 · Task Decomposition and Planning
Next
Day 05 · Weekly Review 1: Minimal Agent Design
基础认知
Day 0460 minutesAI Agent 动手实践

Day 04 - Agent State and Feedback

今日目标

能把 Agent 理解为多轮状态机,说清状态、历史、阶段结果与工具反馈的关系。

学习安排

时间模块做什么
0-10 分钟核心概念通读当天术语表,圈出 3 个你最想在工作里用上的概念。
10-25 分钟阅读输入精读第 1 章执行循环、上下文、工具反馈部分,只抓问题、思路、结论。
25-45 分钟实践任务设计四列状态表,必须产出一份可复用产物。
45-55 分钟追问与反思回答追问练习,标记卡住的概念。
55-60 分钟复盘与作业整理自检清单,定下明天要复习的一点。

核心概念

术语中文解释应用场景
state状态:Agent 当前所处阶段及已积累的关键信息。当前处于「查询数据」阶段,已拿到时间范围
state machine状态机:Agent 在预定义状态间迁移的执行模型。收集需求 → 查询数据 → 分析 → 输出
conversation history对话历史:与用户的所有轮次消息记录,是上下文的组成部分。用户补充了 WAF 开关时间,写入历史
intermediate result中间结果:某步骤产生、供后续步骤使用的数据。查询工具返回的原始日志片段
tool feedback工具反馈:工具执行后的返回结果或错误信息。query_metrics 返回「无数据」
context window上下文窗口:模型一次能容纳的 token 上限,决定放多少历史。长日志需要截断或摘要后才能放入
retry重试:工具失败后按策略重新执行,常设次数上限。数据库连接超时后间隔重试 2 次
error recovery错误恢复:从失败状态回到可继续执行的路径。日志工具失败时降级为读取摘要文件
human intervention人工介入:高风险或不确定场景交给人工决策。报告含高风险结论时人工确认
audit trail审计轨迹:记录每步动作、输入输出,可追溯。记录每次工具调用的参数与返回摘要
state transition状态迁移:从当前状态进入下一状态的触发条件。拿到明确任务描述后从「收集需求」进入「查询数据」
fallback降级路径:主路径失败时启用的替代方案。实时指标查询失败时改用昨日缓存数据

阅读重点

  • 对应章节:第 1 章中执行循环、上下文、工具反馈部分。
  • 关注点:
  • Agent 是多轮状态机,不是单次请求:每一步都改变状态。
  • 状态与上下文的区别:状态是结构化的关键信息,上下文是模型视角的全部文本。
  • 工具反馈如何回流:不是全量塞回上下文,要有选择地摘要和截断。
  • 失败处理与人工介入的触发条件:什么时候重试、什么时候降级、什么时候叫人。
  • 补充材料:
  • Anthropic 官方文档多轮 Tool Use 说明,看反馈如何进入下一轮模型调用。
  • LangGraph 官方文档的 State 概念页,看工程上状态如何存储与更新。

理解检查

  • Agent 为什么需要保存中间状态?如果每轮都从零开始会怎样?
  • 状态和上下文有什么区别?各自保存什么信息?
  • 工具返回结果应该全部塞回上下文吗?为什么?
  • 失败重试需要记录哪些信息?重试和错误恢复有什么不同?

实践任务

背景:把 Day 03 的「Nginx CPU 排查」5 步计划升级为状态机。Agent 不能只是按顺序跑一遍,还要能回答「我现在在哪一步、手上有什么、下一步做什么」,并且能在失败后回到可继续的状态。

步骤:

  • 复用 Day 03 的 5 步计划,归纳出 4 个状态:收集需求、查询数据、分析、输出。
  • 给每个状态填四列:状态、输入、动作、输出。
  • 明确状态迁移条件:什么情况下从 A 状态进入 B 状态。
  • 标出异常迁移:分析时发现数据不足,允许回退到查询数据。
  • 给最可能失败的状态补一条失败处理规则。
  • 产出:状态表,保存下来,Day 05 设计文档直接使用。

输出模板

Agent:[xxx]
状态集合:[状态 1] -> [状态 2] -> [状态 3]

| 状态 | 输入 | 动作 | 输出 |
|---|---|---|---|
| [状态名] | [进入该状态需要的信息] | [执行的动作] | [产出并传递到下一状态的数据] |
| [状态名] | [进入该状态需要的信息] | [执行的动作] | [产出并传递到下一状态的数据] |
| [状态名] | [进入该状态需要的信息] | [执行的动作] | [产出并传递到下一状态的数据] |

失败处理:
- [状态名] 失败时:[重试/降级策略]
- [状态名] 数据不足时:[回退或补充查询]
- 重试上限:[次数],超过后:[动作]
- 人工介入点:[触发条件]
- 审计记录:[需要记录什么]

示范输出

Agent:Nginx CPU 排查 Agent
状态集合:收集需求 -> 查询数据 -> 分析 -> 输出
异常迁移:分析时数据不足,回退到查询数据

| 状态 | 输入 | 动作 | 输出 |
|---|---|---|---|
| 收集需求 | 用户原始问题 | 追问时间窗口,或按默认值解析 | 明确的任务描述(目标 + 时间范围) |
| 查询数据 | 时间范围/指标名 | 调用 query_logs、query_metrics | 原始日志摘要与指标序列 |
| 分析 | 查询结果 | LLM 对比、归因、形成假设 | 带证据的假设列表 |
| 输出 | 分析结果 | 生成 Markdown 报告 | 含证据、假设、待验证项的报告 |

失败处理:
- 查询数据失败:重试 2 次,仍失败则询问用户是否继续
- 分析时数据不足:回退到查询数据,扩大时间窗口重查
- 人工介入点:报告含高风险结论,或需要修改配置时
- 审计记录:每次工具调用的参数、返回摘要、重试次数

追问练习

  • 工具返回结果应该全部塞回上下文吗?你会按什么规则取舍?
  • 失败重试需要记录哪些信息?重试 3 次都失败后,Agent 应该做什么?
  • 什么时候应该让人介入?「没人看」和「看不过来」哪个风险更大?
  • 你的状态表里,哪两个状态之间最可能来回跳转?这说明了什么?

常见误区

  • 把状态和上下文混为一谈:状态是精简的结构化信息,上下文是模型看到的全部文本,两者分开管理。
  • 把工具结果全量塞回上下文:噪声增加、成本上升,应该摘要或只保留关键部分。
  • 失败就无限重试:要设置重试上限与降级路径,避免空转浪费。
  • 全程无人确认:涉及发送、删除、写库等高风险动作必须 human-in-the-loop。

进阶扩展

  • 生产系统里状态要可持久化(如数据库或 Redis),进程重启后能恢复,长任务不怕中断。
  • audit trail 是排查「哪一步引入错误」的依据:每一步动作留痕,问题可回溯。
  • 状态设计影响可测试性:状态越清晰,越容易构造单元测试和故障演练。

今日作业

  • 保存状态表,Day 05 设计文档直接复用。
  • 用一句话写出「状态和上下文的区别」,明天开始前复述。
  • 给状态表补一行失败处理,写清最可能失败的一步怎么恢复。
  • 想清楚你的 Agent 哪些动作必须人工确认,明天写进设计文档。

自检清单

Previous
Day 03 · Task Decomposition and Planning
Next
Day 05 · Weekly Review 1: Minimal Agent Design