<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://www.anwsome.com//index.php?action=history&amp;feed=atom&amp;title=%E8%AE%A9AI_Agent%E4%B8%8D%E5%86%8D%E8%BF%B7%E5%A4%B1%EF%BC%9A%E8%A7%84%E5%88%92%E7%9A%84%E8%89%BA%E6%9C%AF</id>
	<title>让AI Agent不再迷失：规划的艺术 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://www.anwsome.com//index.php?action=history&amp;feed=atom&amp;title=%E8%AE%A9AI_Agent%E4%B8%8D%E5%86%8D%E8%BF%B7%E5%A4%B1%EF%BC%9A%E8%A7%84%E5%88%92%E7%9A%84%E8%89%BA%E6%9C%AF"/>
	<link rel="alternate" type="text/html" href="http://www.anwsome.com//index.php?title=%E8%AE%A9AI_Agent%E4%B8%8D%E5%86%8D%E8%BF%B7%E5%A4%B1%EF%BC%9A%E8%A7%84%E5%88%92%E7%9A%84%E8%89%BA%E6%9C%AF&amp;action=history"/>
	<updated>2026-04-15T01:35:01Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>http://www.anwsome.com//index.php?title=%E8%AE%A9AI_Agent%E4%B8%8D%E5%86%8D%E8%BF%B7%E5%A4%B1%EF%BC%9A%E8%A7%84%E5%88%92%E7%9A%84%E8%89%BA%E6%9C%AF&amp;diff=112&amp;oldid=prev</id>
		<title>Admin：​创建页面，内容为“&lt;blockquote&gt;&quot;没有计划的 Agent 走哪算哪&quot; —— 先列步骤再动手，完成率翻倍。&lt;/blockquote&gt;在前面文章中，我们构建了最简单的 Agent 循环。今天我们来解决一个实际问题：&#039;&#039;&#039;多步任务中，Agent 会丢失进度&#039;&#039;&#039;。  重复做过的事、跳步、跑偏——对话越长越严重。一个 10 步重构可能做完 1-3 步就开始即兴发挥，因为 4-10 步已经被挤出注意力了。  == 一、问题：长…”</title>
		<link rel="alternate" type="text/html" href="http://www.anwsome.com//index.php?title=%E8%AE%A9AI_Agent%E4%B8%8D%E5%86%8D%E8%BF%B7%E5%A4%B1%EF%BC%9A%E8%A7%84%E5%88%92%E7%9A%84%E8%89%BA%E6%9C%AF&amp;diff=112&amp;oldid=prev"/>
		<updated>2026-03-23T04:58:23Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;blockquote&amp;gt;&amp;quot;没有计划的 Agent 走哪算哪&amp;quot; —— 先列步骤再动手，完成率翻倍。&amp;lt;/blockquote&amp;gt;在前面文章中，我们构建了最简单的 Agent 循环。今天我们来解决一个实际问题：&amp;#039;&amp;#039;&amp;#039;多步任务中，Agent 会丢失进度&amp;#039;&amp;#039;&amp;#039;。  重复做过的事、跳步、跑偏——对话越长越严重。一个 10 步重构可能做完 1-3 步就开始即兴发挥，因为 4-10 步已经被挤出注意力了。  == 一、问题：长…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;quot;没有计划的 Agent 走哪算哪&amp;quot; —— 先列步骤再动手，完成率翻倍。&amp;lt;/blockquote&amp;gt;在前面文章中，我们构建了最简单的 Agent 循环。今天我们来解决一个实际问题：&amp;#039;&amp;#039;&amp;#039;多步任务中，Agent 会丢失进度&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
重复做过的事、跳步、跑偏——对话越长越严重。一个 10 步重构可能做完 1-3 步就开始即兴发挥，因为 4-10 步已经被挤出注意力了。&lt;br /&gt;
&lt;br /&gt;
== 一、问题：长对话中的迷失 ==&lt;br /&gt;
想象一下这个场景：&lt;br /&gt;
&lt;br /&gt;
你让 Agent 重构一个项目：&lt;br /&gt;
&lt;br /&gt;
# 添加类型注解&lt;br /&gt;
# 补充文档字符串&lt;br /&gt;
# 添加主函数保护&lt;br /&gt;
# 运行测试验证&lt;br /&gt;
# 提交更改&lt;br /&gt;
&lt;br /&gt;
Agent 开始工作，读取文件、修改代码、运行测试...但到第 4 步时，上下文已经被工具结果填满，系统提示的影响力逐渐被稀释。Agent &amp;quot;忘记&amp;quot;了还有第 5 步，或者以为第 2 步还没做，又做了一遍。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;这不是模型的错，是 Harness 的问题。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 二、解决方案：TodoManager ==&lt;br /&gt;
给 Agent 一个带状态的待办清单，并强制它定期更新进度。&lt;br /&gt;
 &amp;lt;code&amp;gt;+--------+      +-------+      +---------+&lt;br /&gt;
 |  User  | ---&amp;gt; |  LLM  | ---&amp;gt; | Tools   |&lt;br /&gt;
 | prompt |      |       |      | + todo  |&lt;br /&gt;
 +--------+      +---+---+      +----+----+&lt;br /&gt;
                     ^                |&lt;br /&gt;
                     |   tool_result  |&lt;br /&gt;
                     +----------------+&lt;br /&gt;
                           |&lt;br /&gt;
               +-----------+-----------+&lt;br /&gt;
               | TodoManager state     |&lt;br /&gt;
               | [ ] task A            |&lt;br /&gt;
               | [&amp;gt;] task B  &amp;lt;- doing  |&lt;br /&gt;
               | [x] task C            |&lt;br /&gt;
               +-----------------------+&lt;br /&gt;
                           |&lt;br /&gt;
               if rounds_since_todo &amp;gt;= 3:&lt;br /&gt;
                 inject &amp;lt;reminder&amp;gt; into tool_result&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 三、核心机制 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. 状态管理 ===&lt;br /&gt;
同一时间只允许一个 &amp;lt;code&amp;gt;in_progress&amp;lt;/code&amp;gt;：&lt;br /&gt;
 &amp;lt;code&amp;gt;class TodoManager:&lt;br /&gt;
     def update(self, items: list) -&amp;gt; str:&lt;br /&gt;
         validated, in_progress_count = [], 0&lt;br /&gt;
         for item in items:&lt;br /&gt;
             status = item.get(&amp;quot;status&amp;quot;, &amp;quot;pending&amp;quot;)&lt;br /&gt;
             if status == &amp;quot;in_progress&amp;quot;:&lt;br /&gt;
                 in_progress_count += 1&lt;br /&gt;
             validated.append({&lt;br /&gt;
                 &amp;quot;id&amp;quot;: item[&amp;quot;id&amp;quot;],&lt;br /&gt;
                 &amp;quot;text&amp;quot;: item[&amp;quot;text&amp;quot;],&lt;br /&gt;
                 &amp;quot;status&amp;quot;: status&lt;br /&gt;
             })&lt;br /&gt;
         if in_progress_count &amp;gt; 1:&lt;br /&gt;
             raise ValueError(&amp;quot;Only one task can be in_progress&amp;quot;)&lt;br /&gt;
         self.items = validated&lt;br /&gt;
         return self.render()&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;quot;同时只能有一个 in_progress&amp;quot;&amp;#039;&amp;#039;&amp;#039; 强制顺序聚焦。&lt;br /&gt;
&lt;br /&gt;
=== 2. 工具集成 ===&lt;br /&gt;
&amp;lt;code&amp;gt;todo&amp;lt;/code&amp;gt; 工具和其他工具一样加入调度映射：&lt;br /&gt;
 &amp;lt;code&amp;gt;TOOL_HANDLERS = {&lt;br /&gt;
     &amp;#039;&amp;#039;# ...基础工具...&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;quot;todo&amp;quot;: lambda **kw: TODO.update(kw[&amp;quot;items&amp;quot;]),&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 提醒机制（Nag Reminder） ===&lt;br /&gt;
模型连续 3 轮以上不调用 &amp;lt;code&amp;gt;todo&amp;lt;/code&amp;gt; 时，系统主动注入提醒：&lt;br /&gt;
 &amp;lt;code&amp;gt;if rounds_since_todo &amp;gt;= 3 and messages:&lt;br /&gt;
     last = messages[-1]&lt;br /&gt;
     if last[&amp;quot;role&amp;quot;] == &amp;quot;user&amp;quot; and isinstance(last.get(&amp;quot;content&amp;quot;), list):&lt;br /&gt;
         last[&amp;quot;content&amp;quot;].insert(0, {&lt;br /&gt;
             &amp;quot;type&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
             &amp;quot;text&amp;quot;: &amp;quot;&amp;lt;reminder&amp;gt;Update your todos.&amp;lt;/reminder&amp;gt;&amp;quot;,&lt;br /&gt;
         })&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;问责压力&amp;#039;&amp;#039;&amp;#039;——你不更新计划，系统就追着你问。&lt;br /&gt;
&lt;br /&gt;
== 四、实际效果 ==&lt;br /&gt;
对比无规划 vs 有规划的 Agent：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!场景&lt;br /&gt;
!无规划&lt;br /&gt;
!有规划&lt;br /&gt;
|-&lt;br /&gt;
|10步重构&lt;br /&gt;
|经常重复或遗漏步骤&lt;br /&gt;
|按顺序完成，状态清晰&lt;br /&gt;
|-&lt;br /&gt;
|多文件编辑&lt;br /&gt;
|上下文混乱&lt;br /&gt;
|每一步聚焦单一目标&lt;br /&gt;
|-&lt;br /&gt;
|长对话&lt;br /&gt;
|后期偏离主题&lt;br /&gt;
|始终围绕待办清单&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 五、完整示例 ==&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;#039;&amp;#039;# Agent 首先创建计划&amp;#039;&amp;#039;&lt;br /&gt;
 todo.update([&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 1, &amp;quot;text&amp;quot;: &amp;quot;读取并分析当前代码&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;in_progress&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 2, &amp;quot;text&amp;quot;: &amp;quot;添加类型注解&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;pending&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 3, &amp;quot;text&amp;quot;: &amp;quot;补充文档字符串&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;pending&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 4, &amp;quot;text&amp;quot;: &amp;quot;添加主函数保护&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;pending&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 5, &amp;quot;text&amp;quot;: &amp;quot;运行测试验证&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;pending&amp;quot;},&lt;br /&gt;
 ])&lt;br /&gt;
 &lt;br /&gt;
 &amp;#039;&amp;#039;# 完成第一步后更新&amp;#039;&amp;#039;&lt;br /&gt;
 todo.update([&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 1, &amp;quot;text&amp;quot;: &amp;quot;读取并分析当前代码&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;completed&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: 2, &amp;quot;text&amp;quot;: &amp;quot;添加类型注解&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;in_progress&amp;quot;},&lt;br /&gt;
     &amp;#039;&amp;#039;# ...其他不变&amp;#039;&amp;#039;&lt;br /&gt;
 ])&lt;br /&gt;
 &lt;br /&gt;
 &amp;#039;&amp;#039;# 如此继续，直到全部完成&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 六、试一试 ==&lt;br /&gt;
 &amp;lt;code&amp;gt;cd learn-claude-code&lt;br /&gt;
 python agents/s03_todo_write.py&amp;lt;/code&amp;gt;&lt;br /&gt;
试试这些 prompt：&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;Refactor the file hello.py: add type hints, docstrings, and a main guard&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;Create a Python package with __init__.py, utils.py, and tests/test_utils.py&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;Review all Python files and fix any style issues&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
观察 Agent 如何先创建待办清单，然后一步步执行，定期更新进度。&lt;br /&gt;
&lt;br /&gt;
== 七、设计哲学 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Harness 层应该提供规划结构，但不替模型画航线。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Harness 提供 Todo 工具和管理器&lt;br /&gt;
* 模型自己决定任务是什么、如何排序&lt;br /&gt;
* Harness 强制&amp;quot;一次只做一件事&amp;quot;和&amp;quot;定期更新&amp;quot;&lt;br /&gt;
* 但不规定具体怎么做&lt;br /&gt;
&lt;br /&gt;
这种&amp;#039;&amp;#039;&amp;#039;约束与自由&amp;#039;&amp;#039;&amp;#039;的平衡是关键：&lt;br /&gt;
&lt;br /&gt;
* 太松：模型迷失在细节中&lt;br /&gt;
* 太紧：模型变成脚本执行器&lt;br /&gt;
&lt;br /&gt;
== 八、进阶思考 ==&lt;br /&gt;
TodoManager 是内存中的扁平清单，适合单次会话。对于更复杂的场景，我们需要：&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;依赖关系&amp;#039;&amp;#039;&amp;#039;：任务 B 依赖任务 A&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;并行执行&amp;#039;&amp;#039;&amp;#039;：任务 C 和 D 可以同时进行&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;持久化&amp;#039;&amp;#039;&amp;#039;：跨会话保存任务状态&lt;br /&gt;
&lt;br /&gt;
这将在后续文章中介绍，进化成完整的&amp;#039;&amp;#039;&amp;#039;任务系统（Task System）&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
但即使在那之前，简单的 Todo 已经能大幅提升 Agent 的可靠性。&amp;#039;&amp;#039;&amp;#039;先列步骤再动手，完成率翻倍&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
----&amp;#039;&amp;#039;Bash 就够了。真正的 Agent 是宇宙所需要的全部。&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>