我平时会用到一些代理框架,比如LangGraph和OpenAI的Agents SDK。它们功能不错,但学习时总感觉像变魔术——你连接几个模块,一个代理就出现了,中间发生了什么却不甚明了。这种“魔法感”不是我想要的,我需要看到机器内部如何运转。

于是,我做了件曾经在学习神经网络时很管用的事。如果你看过Andrej Karpathy构建micrograd,就会明白那种感受。他用大约150行代码重建了PyTorch的核心思想,目的不是替代它,而是让你无法误解它。之后,PyTorch不再是魔法。我想在代理身上复刻这个过程,于是构建了microagent。

理解代理最快的方法是想象一间小办公室。一个新助理第一天上岗,他有一个笔记本、几位可以求助的同事,以及一个简单习惯:持续工作直到任务完成。这就是全部思路。下面的一切,不过是把那个办公室用代码写出来,归结为五个小概念。

消息,即单张便条
办公室里最小的物件是一张便条。有人提了个问题,助理写下一个决定,某位同事返回答案——每一条都是一张便条。便条只需要三样东西:谁写的(role)、写了什么(content),以及可选标签注明来自哪位同事(name)。它是冻结的,好比用钢笔书写,一旦产生就永不更改。这一点稍后会很重要。

上下文,即笔记本
单独的便条没有意义,助理需要整个运行历史,那就是上下文,想象成办公室的公用笔记本。这里的规则让一切变得简单:永远不擦除旧页,只在末尾追加新便条。当你添加新便条时,系统返回的是带有新增内容的崭新笔记本,旧笔记本原封不动。查看最近一条消息,只需瞥一眼最后那页。笔记本只增不减,发生的完整故事始终保留其中,你能回溯、回放和调试。记忆不是稍后添加的特性,它就是那本从不擦除的笔记本。

工具,即可以呼叫的同事
助理无法独自搞定所有事。需要算个数?叫那位拿计算器的人来。需要取份文件?叫那位熟悉文件柜的人来处理。工具就是这样的存在,你向它发出请求,它返回结果。

提示,即任务清单
助理需要知道当前要解决什么。提示就是那张任务清单,上面写着当前目标和可用资源——哪些工具能调用、应该遵循什么格式。它不被硬编码进系统,而是每次运行时传递进去,这样同一个助理转身就能处理不同任务。

运行循环,即工作日常
最后是助理的日常工作模式,也就是运行循环。它不断做三件事:查看笔记本最新状态、决定下一步动作(是回应还是调用工具)、将新决定追加入笔记本。这个过程一直循环,直到任务完成。

整个代理的奥秘就在这五个部分之内。消息作为不可变记录,上下文作为只增不减的历史,工具作为可调用的功能单元,提示作为每次运行注入的任务方向,以及那个持续运转、直到目标达成的运行循环。当它们被压缩进约200行代码、不依赖任何外部库时,那些原本笼罩在框架之下的魔法就消失了。