项目地址 :Learn Claude Code
Learn Claude Code的作者认为,现在很多的Agent都是伪Agent,都是使用代码编排好了流程。
真的Agent应该将决策权交给大模型,而不是在代码中写死。模型就是Agent,代码只是起到Harness的作用。
Learn Claude Code就是教你怎么搭建Harness代码,由s01-s12来演示。

Learn Claude Code给出Agent就是一个Loop。用户发来请求,由大模型判断是否要调用外部工具,如果需要则调用工具,然后返回结果给大模型,最后由大模型判断下一步要做什么。
所有复杂的机制都叠加在这个永远不变的Loop上,代码作为Harness只做三件事:跑循环,执行工具,像大模型返回结果。

Loop痛点
这个Loop也不是没有问题的,主要有下面四个痛点:
1.Context Fade 失忆
大模型在执行多步任务的时候,很可能会丢失进度,造成重复执行已经执行过的任务,跳步,跑偏等等。这个时候上下文会越来越长,系统提示的能力被稀释。(s03、s07)
解决方式:TodoWrite约束
强迫大模型写下计划,同时也要设定约束规则:最多20项,仅1个in_process,连续3轮未更新系统自动提醒。
大模型生成的任务列表要有结构,包括当前任务的状态,依赖哪些前置文件。要想执行一个任务,这个任务必须是pending状态,并且blockedBy为空。
python
class TaskManager:
def __init__(self, tasks_dir: Path):
self.dir = tasks_dir
self.dir.mkdir(exist_ok=True)
self._next_id = self._max_id() + 1
def create(self, subject, description=""):
task = {"id": self._next_id, "subject": subject,
"status": "pending", "blockedBy": [],
"owner": ""}
self._save(task)
self._next_id += 1
return json.dumps(task, indent=2)
2.Context Pollution 探索垃圾
比如一个用户问了一个问题:这个项目的架构是什么。此时父agent上下文已经有一部分了,如果此时再去分析这个问题,可能会导致上下文不纯净,上下文过长。(s04)
解决方式:Subagent隔离
主进程写代码,子进程读文件探索。完全隔离,保护主进程认知清晰度。
关于这个子task,其实也是一个工具,大模型判断是否需要调用这个工具。
3.知识瓶颈
比如我们想要大模型按照某个特定的工作流来执行某个任务,但是其本身其实不知道怎么执行,因此我们就会给他一个提示,这个提示其实就是skill。(s05)
但是如果我们的skill比较多怎么办,比如有100个,难道要全部加载进去吗?其实不用。
解决方式:Skills渐进式加载
100个预置Skill,按需加载。我们可以写一个总的skill预览表,像目录一样,需要哪个再按需加载即可。
4.上下文爆表
上下文窗口是有限的,因为我们的上下文是不能无限增长的,需要进行压缩提炼。(s06)
解决方式:三层压缩防御
Micro(旧工具结果变占位符)-> Auto(超50K自动摘要)->Manual(主动调用 compact)。
完整的历史上下文保存至硬盘中,信息没有消失,只是移出了活跃上下文。
第一层:Micro(旧工具结果变占位符)
每次调用大模型前默认执行,只保留近三条工具结果,将更早的工具结果替换成工具的名称。
第二层:Auto(超50K自动摘要)
到达条件自动触发摘要,先将所有信息以JSON的格式写入硬盘中。再使用大模型进行摘要,要包括:已完成的工作、当前状态、关键决策。最后用一条message替代messages列表。
第三层:Manual(主动调用 compact)
由模型自行判断是否需要主动调用compact工具,之后执行的过程与第二层一样。
团队协作
真正的团队协作需要三样东西: (1) 能跨多轮对话存活的持久 Agent, (2) 身份和生命周期管理, (3) Agent 之间的通信通道。
Agent之间通过JSONL 收件箱来通信,每个agent都有一个自己的邮箱(一个json文件),每次调用大模型前都要去邮箱中查看是否邮件,如果有就加入上下文中。
只有收发功能是不行的,必须要有双方怎么响应,怎么协调。因此引入了通信协议。
此时的子Agent,你不给他分配工作他不干,属于是踢一脚走一步。因此我们要让子Agent自己扫描任务面板,没人干的活自己领一个。
但是这个也有一个问题,如果两个agent同时改同一个文件,未提交的改动相互污染,根本就回滚不了了。
因此我们使用git worktree创建不同的目录,每个agent都在自己的目录下执行,互不影响。
流程展示
1.用户与Agent对话执行过程

2.Agent_Loop的具体过程
