08|Observations:把工具结果送回下一轮决策
学习工具结果怎样成为下一轮模型输入,而不是被悄悄丢失。
学习工具结果怎样成为下一轮模型输入,而不是被悄悄丢失。
聊天记录像监控录像,状态表像案件白板;完成任务需要可查询的结论,而不是每次重看全部录像。

本课交付物
定义 ResearchState 类型,并实现只允许合法状态转移的 reducer。
核心讲解
Observations(观察)是智能体感知其行动结果的方式。
它们提供关键信息,为智能体的思考过程提供燃料并指导未来行动。
这些是来自环境的信号——无论是 API 返回的数据、错误信息还是系统日志——它们指导着下一轮的思考循环。
在观察阶段,智能体会:
- 收集反馈:接收数据或确认其行动是否成功
- 附加结果:将新信息整合到现有上下文中,有效更新记忆
- 调整策略:使用更新后的上下文来优化后续思考和行动
例如,当天气 API 返回数据*“partly cloudy, 15°C, 60% humidity”*(局部多云,15°C,60% 湿度)时,该观察结果会被附加到智能体的记忆(位于提示末尾)。
智能体随后利用这些信息决定是否需要额外数据,或是否准备好提供最终答案。
这种迭代式反馈整合确保智能体始终保持与目标的动态对齐,根据现实结果不断学习和调整。
这些观察可能呈现多种形式,从读取网页文本到监测机械臂位置。这可以视为工具"日志",为行动执行提供文本反馈。
| 观察类型 | 示例 |
|---|---|
| 系统反馈 | 错误信息、成功通知、状态码 |
| 数据变更 | 数据库更新、文件系统修改、状态变更 |
| 环境数据 | 传感器读数、系统指标、资源使用情况 |
| 响应分析 | API 响应、查询结果、计算输出 |
| 基于时间的事件 | 截止时间到达、定时任务完成 |
结果如何被附加?
执行操作后,框架按以下步骤处理:
- 解析操作 以识别要调用的函数和使用的参数
- 执行操作
- 将结果附加 作为 Observation
至此我们已经学习了智能体的思考-行动-观察循环。
如果某些概念仍显模糊,不必担心——我们将在后续单元中重访并深化这些概念。
现在,是时候通过编写你的第一个智能体来实践所学知识了!
本站实战工作台
聊天记录不是状态数据库
Transcript 保存发生过什么,State 保存现在是什么。每轮重读全部对话既昂贵又容易让旧错误继续影响决定。把目标、已知事实、待办、证据、错误与预算放进显式字段,轨迹只用于审计。
ResearchState
type Phase = 'clarify' | 'search' | 'verify' | 'write' | 'done' | 'failed'
type ResearchState = {
runId: string
goal: string
phase: Phase
facts: Array<{ claim:string; source:string; confidence:number }>
pending: string[]
errors: Array<{ code:string; retryable:boolean }>
budget: { turns:number; toolCalls:number; tokens:number }
version: number
}
Reducer 只允许合法转移,例如 clarify→search,search→verify,verify→write;done 不能重新进入 search。每次更新生成新 version,持久化使用 compare-and-swap,防止两个并发步骤覆盖彼此。
派生值不要重复存
完成比例可以由 pending 计算,就不要同时保存 progress。重复事实会漂移。原始工具结果可放对象存储,State 只保留摘要、引用与校验和。
三个状态测试
合法转移成功;从 done 到 search 被拒绝;预算为零时任何工具动作转为 failed 或 human_handoff。再模拟进程在工具执行后、状态写入前崩溃:使用幂等 callId 恢复,避免重复外部动作。
状态也有隐私边界
不要为了“记忆”保存完整用户输入。字段按用途、保留期和可见角色设计;敏感值引用安全存储而非复制。调试页面显示脱敏状态。
通过标准是只看 State 就能判断当前阶段、剩余工作、证据和停止原因;重放事件能得到同一状态;非法转移与并发覆盖都有测试。