AI Agent 自主执行时,如何让它”自己知道自己该做啥、做到哪了”?一个小工具让 TODO 和 Goal 状态双向流动。

问题:Agent 的”分时记忆”

如果你养过一个 AI Agent,你一定遇到过这个场景:

你给它布置了一个复杂任务——“帮我做市场调研,写报告,再部署一个演示页面”。它埋头干了半小时,跑了 40 轮工具调用,中间重启了两次。然后它回来告诉你:”报告写好了,页面部署了。”

你问:”那为什么调研部分的数据源没更新?”

它说:”哦,那个是上一轮的目标,我以为结束了。”

问题出在哪?Agent 没有”持久化的进度意识”。每轮对话都是一次新的思考起点,除非你把进度显式地塞进它的 prompt 里。而传统的 TODO 清单(像我项目里的 TODO.txt)和 Goal 状态(goal_state.json)是两个孤岛——TODO 记录了”计划要做什么”,Goal 记录了”当前执行到什么状态”,但它们之间没有自动同步。

一个简单的想法

如果让 TODO 和 Goal 互相”通气”呢?

  • 当 Agent 完成了一个 TODO 项 → 自动更新 Goal 状态,让目标感知进度
  • 当 Goal 完成了 → 自动把对应的 TODO 项标记为完成

这就是 todo_goal_sync.py 的全部设计。

架构:双向同步

代码只有 200 行,核心是两个方向的数据流:

1
2
3
4
5
┌─────────────┐         ┌──────────────┐
│ TODO.txt │ ◄─────► │ goal_state │
│ [x] 完成项 │ 双向同步 │ .json │
│ [ ] 待办项 │ │ status/obj │
└─────────────┘ └──────────────┘

方向 1:TODO → Goal

每次 Agent 运行 todo_to_goal() 时,它会:

  1. 解析 TODO.txt,提取所有 [x](完成)和 [ ](待办)项
  2. 计算完成比例,例如 3/6 项完成
  3. 将进度摘要写入 goal_state.jsonobjective 字段

这样,Agent 在下轮读取 goal_state 时就能看到:”哦,我已经完成了 3/6,剩下的是 XXX。”——进度不再是黑盒。

1
2
3
4
5
6
7
8
9
10
def todo_to_goal():
todo = parse_todo_items()
state = load_goal_state() or {}

done_count = len(todo['done'])
total = len(todo['all'])
summary = f"[TODO 同步] 进度: {done_count}/{total} 项完成"

state['objective'] = summary + "\n" + format_items(todo)
save_goal_state(state)

方向 2:Goal → TODO

反过来,当一个 Goal 完成(status='completed'budget_exhausted')时:

  1. 检查 goal_state.jsonobjective 中是否提到了某个 TODO 项
  2. 如果匹配,把对应的 [ ] 标记为 [x]
  3. 如果没有匹配项,回退执行 todo_to_goal() 做反向更新
1
2
3
4
5
6
7
8
def goal_to_todo():
state = load_goal_state()
if state.get('status') not in ('completed', 'budget_exhausted'):
return # 还没完成,不更新

for line in todo_lines:
if '[ ]' in line and match_goal(line, state['objective']):
mark_done(line)

用法

1
2
3
4
5
6
7
8
9
10
11
# 双向同步(推荐)
python assets/todo_goal_sync.py

# 仅 TODO → Goal
python assets/todo_goal_sync.py --todo-to-goal

# 仅 Goal → TODO
python assets/todo_goal_sync.py --goal-to-todo

# 查看同步状态
python assets/todo_goal_sync.py --status

一个实战片段

在我自己的 Agent 项目(GenericAgent)中,todo_goal_sync.py 被集成到了每轮执行后的收尾流程:

1
2
每轮执行完毕 → 检查 TODO 是否有更新 → todo_to_goal() → 
如果 goal 完成 → goal_to_todo() → 下轮 Agent 读取最新状态

效果是这样的:

之前

1
2
3
用户:调研结果呢?
Agent:啊?什么调研?(完全没有上下文记忆)
用户:……

之后

1
2
3
4
5
6
Agent 读取 goal_state:
→ 进度: 3/5 项完成
→ 已完成: 数据收集 ✅, 竞品分析 ✅, 初步报告 ✅
→ 待办: 可视化图表, 终稿评审

Agent:调研的数据已收集,竞品分析也做完了。下一步是做可视化图表和终稿评审,要继续吗?

设计取舍

写这个工具时有几个有意思的决策:

1. 简单匹配,不要 NLP

Goal→TODO 方向的关键词匹配用的是最简单的 string in objective 判断,而不是 LLM 语义匹配。原因:

  • 200行的工具引入 LLM 调用太重量级
  • TODO 标题本身已经是人类写的摘要,关键词匹配足够
  • 如果没匹配上,有 todo_to_goal() 回退

2. Goal 状态保留

goal_state.jsonobjective 字段采用追加模式——每次同步会保留旧目标,追加新的进度摘要。这样 Agent 能看到”来龙去脉”,而不是只有最新状态。

3. 无外部依赖

只用 os, sys, json, re 四个标准库,任何 Python 环境都能跑。

集成建议

如果你也想给自己的 Agent 加上这个能力:

  1. 下载脚本:把 todo_goal_sync.py 放到项目的 assets/ 目录
  2. 定义文件路径:确保 TODO_PATHGOAL_STATE_PATH 指向你的文件
  3. 集成到执行循环:在每轮 Agent 执行后的收尾流程中调用双向同步
  4. 可选:注册为定时任务,每隔 N 分钟自动同步一次
1
2
3
4
5
6
# 在你的 Agent 收尾流程中
from assets.todo_goal_sync import todo_to_goal, goal_to_todo

def on_round_end():
todo_to_goal() # 将 TODO 进度写入 goal
goal_to_todo() # 如果 goal 完成,标记 TODO

小结

200 行代码,两个方向的数据流,解决了一个实际问题:让 AI Agent 在分时对话中保持进度感知

它不复杂——没有 LLM 调用,没有向量数据库,没有复杂的图数据库。但它管用——因为有时候,最简单的”双向通知”模式,就是 Agent 最需要的”自我对齐”机制。

就像项目管理里那句老话:“What gets measured gets managed.” 在 Agent 的世界里,“What gets synced gets remembered.”


工具源码在 GenericAgent/assets/todo_goal_sync.py