A·Agent Guide 从经典智能体到前沿工程 ← 返回主博客
AGENT GUIDE / READING NOTES

第 1 章 传统 Agent:从反射到规划

用两房间清扫案例理解反射、内部状态、搜索与效用

1.1 为什么先学不使用 LLM 的 Agent

本章目标:理解当前观察为什么不够、内部状态怎样更新、目标与效用怎样影响动作。后面的模型策略仍然需要解决这些问题;模型没有替系统消除状态与反馈。

用一个更容易画清的环境:机器人清扫两个房间 A、B。动作有 clean、move、stop;每次只能观察当前房间是否脏,无法直接看到另一间。假设清扫期间没有新污物、动作可靠,目标是两间都干净且停止。我们会逐步放开这些假设,看看简单策略为什么失效。

1.2 简单反射:只看眼前会出现什么问题

最直观的规则是“脏就清扫,干净就移动”。如果 A 脏、B 干净,机器人清扫 A 后会去 B,再回 A,然后继续往返。它没有记住两间已检查,无法判断可以停止。

# 机制示例:只使用当前观察。
def reflex(observation):
    return "clean" if observation["dirty"] else "move"

问题不是规则太短,而是决策输入没有包含足够信息。给“干净就停止”也不行:第一次站在干净的 B 时,A 可能仍然脏。相同的局部观察“B 干净”可能对应两个不同的全局状态,正确动作也可能不同。

对应到代码任务:看到当前测试输出为空,就直接说成功,是类似错误。它忽略了命令是否启动、退出码是什么、此前是否修改过代码以及其他测试是否运行。

1.3 基于模型:维护状态,而不是囤积历史

两种内部状态对应相同局部观察,却需要不同动作

给机器人增加一个表,记录每个房间最近一次确认的情况。此处的“模型”指对环境的内部描述和状态更新规则,不专指语言模型。

# 机制示例:每轮先用观察更新内部状态,再决策。
def decide(observation, known):
    room = observation["room"]
    known[room] = "dirty" if observation["dirty"] else "clean"
    if observation["dirty"]:
        return "clean"
    if known.get("A") == known.get("B") == "clean":
        return "stop"
    return "move"

在“不会新增污物”的假设下,表格足以判断停止。如果有人在已检查的 A 倒了垃圾,表格就过期了。解决办法取决于环境:定期重新观察、保存时间戳,或引入脏污变化的概率。内部状态是对环境的估计,不是环境本身。

运费实验中的 last_verified 也承担内部状态作用:记录哪个代码版本通过测试;写文件时使这条记录失效。只记“测试曾成功”而不记版本,会导致修改后引用旧证据。

1.4 从状态到目标:怎样把任务写成搜索问题

若环境足够明确,可以把状态表示为 (位置, A 是否脏, B 是否脏)。两种位置和两个布尔变量一共最多 8 个组合。目标状态是“两间干净”,合法动作及转移规则定义清楚后,就能搜索动作路径。

例如从 (A, 脏, 脏) 出发:clean → move → clean → stop。搜索算法回答“存在什么路径”,执行系统回答“这条路径在现实中是否按预期发生”。BFS 在等代价边上找最短步数路径;不同动作代价时,可以使用一致代价搜索。A* 在路径代价 g(n) 上加剩余代价估计 h(n),优先探索 f(n)=g(n)+h(n) 较小的节点;最优性还取决于启发式性质和实现条件。

陌生代码库很难列出全部状态与转移。模型生成候选计划是实用近似,但仍需用工具获取反馈。假设“改一个条件就够”后运行测试,发现会员规则仍失败,就要更新计划。先规划不是先证明计划正确。

1.5 效用:不止要完成,还要比较代价

如果机器人有两条路线,一条快但经过易碎物品,另一条慢但更安全,单纯的目标“到达 B”无法区分它们。效用函数把成功价值、时间、能耗和风险放到同一个决策标准中。

教学上可以写 U = 100 × 是否完成 − 2 × 动作数 − 50 × 是否碰撞。这些权重不是自然规律,而是人为表达偏好。权重不当,系统可能为了少走一步而接受不该接受的风险。某些约束适合直接定义为不可违反,而不是只给一个有限惩罚。

对于 Agent,常见决策是是否继续搜索、是否并行、是否换工具。继续一次调用可能提高完成概率,也消耗费用和时间。系统需要预算上限;策略可以在限额内选择,但不能凭自己的“预计收益”擅自扩张权限。

1.6 MDP、部分可观测与奖励的直觉

在马尔可夫决策过程(MDP)中,状态包含预测下一步所需的信息:给定当前状态与动作,下一状态分布不需要再依赖更早历史。P(s'|s,a) 描述环境转移,r 描述奖励,折扣因子 γ 控制远期回报的权重。最大化期望折扣回报是一个常见目标,并非所有 Agent 都必须按此训练。

部分可观测环境里,Agent 只收到状态的局部信号。理论上可维护信念分布 b_t(s),即当前可能处于各种状态的概率;实践中也可能用事实表、笔记和待确认清单近似表示。文字摘要不等于严格的贝叶斯信念更新,不能把两者的数学保证混为一谈。

这也区分奖励和验收:奖励是用于比较或学习行为的信号,验收是产品判断本次任务是否合格的规则。二者可以一致,也可能偏离。若只奖励“最终答案提到测试通过”,系统就可能学会写这句话而不执行测试。

1.7 练习:同一观察,为什么下一步不同

列出两个环境:①机器人已确认 A、B 都干净,目前在 B;②机器人只检查过 B,目前在 B。二者当前观察都为“B 干净”,但第一种可以停止,第二种需要去 A。用这个反例说明内部状态的必要性。

再解释代码任务中的对应情况:①测试通过后未改文件;②测试通过后又改了条件。当前聊天里都含“通过”,但只有第一种拥有当前版本的证据。参考处理是保存 source_hash,写入使验收记录失效,结束前核对哈希。

本章交付物:一个状态表、一个动作转移图,以及三条明确假设。能说出“假设改变后策略怎样失效”,才算理解策略的适用范围。


Agent Guide · 从反馈闭环走向可靠系统基于 Markdown 构建