Agent Commander 笔记 #1:人脑、蚁群、军队,Agent记忆系统演化
更新于 2026-07-11:原文发表于 7 月 8 日,描述的是当时的三文件拆分架构(SOUL/USER/MEMORY)。三天后,记忆系统已完成从 3 文件到 3 层 11 文件的 ARCH_008 架构演进。本文已更新为完整演化史。
Agent Commander 开发笔记 #1:人脑、蚁群、军队——一个 Agent 记忆系统的演化史
第一幕:痛苦——agent 为什么会「失忆」?
深夜十一点,我打开一个新 session。
Commander 热情地打了一行招呼,然后开始分析上一个 session 里我提过的问题。分析的逻辑很清晰,给出的建议也很合理——唯一的麻烦是,这个方案三天前就被团队否定了。但现在开了新 session,Commander 不记得那个讨论,只记得写在 memory.md 里的一半结论。
像一个很聪明但失忆的朋友,每次见面都要重新认识一次——忘了你们上周吵过的架,又端上了那杯吵架时打翻过的咖啡。
这不是某个具体工具的问题。所有基于大语言模型的 agent 系统都存在类似的「context 边界」问题:会话结束,上下文清空,一切归零。agent 的能力再强,没有跨会话记忆,就只是一个会说话的搜索引擎。(token 可以理解为 LLM 的「注意力预算」——每次对话 agent 能「看到」的文本总量是有限的。)
我做的项目叫 Agent Commander——一个 AI agent 军队式指挥部。Commander 接收自然语言指令,拆解分派给五个小队的三十个 agent 协同执行。
这种多 agent 协作有一个天然的需要:每个 agent 都必须知道项目的环境约定、用户的偏好、过去踩过的坑。否则指挥官每次派活,都得把项目的上下文从头讲一遍。
最初的设计很简单:所有 agent 共享一个记忆文件——.project/memory.md,用 § 分隔条目,纯文本,每次会话全量塞进 prompt。这套方案在头两个月完全够用。agent 跨会话记住了机器拓扑、CI 配置、工具怪癖、命名约定。
直到某天打开文件一看:112KB,约三百条经验。
问题不在体积,在信噪比。🧠 人类的短期工作记忆容量大约在 7±2 个信息块——著名的 Miller 定律。超过这个量,大脑就丢信息。而我的 Commander agent 相当于每次「苏醒」时,都把三百条经验一股脑塞进大脑——其中既有一条红线「.project/ 目录绝不入库」,也有一条两周前的磁盘告警「tc3 磁盘 72% 需清理」。
另一个角度来自军队指挥学。🪖 COP(Common Operating Picture,通用态势图)不是把所有雷达回波、士兵报告拼在一起的大杂烩,而是参谋精心筛选的摘要视图——旅长看的东西和排长看的东西完全不同。但在我的旧架构里,Commander 和队员看的是同一份 112KB 的文件,相当于把整个战场的原始雷达回波直接塞到旅长面前。
112KB 的 memory.md,就这样从「帮手」变成了「负担」。
第二幕:碰壁——三次试图「拆文件」
碰壁一:memory.md + user.md
第一个实装方案借鉴 Hermes Agent 的设计:把「事实」和「偏好」拆成两个文件。memory.md 存环境事实、经验、约定——客观的东西。user.md 存用户偏好、沟通风格、汇报习惯——主观的东西。
效果立竿见影。user.md 从 112KB 的混合文件里剥离出不到 1KB 的纯偏好。agent 决定「怎么回复」时只看这 8K,token 消耗降了一个量级。问题是,这只是把一个大箱子分成了两个小箱子,根子上的三个问题一个都没动。
碰壁二:引入 soul.md
接下来发现 agent 的「人格」散落在十六个 agent prompt 文件里——command 的风格、汇报的语调、决策的倾向,每个文件里都重复写了一遍。想统一调整,得改十六个文件。
于是新增了 soul.md,定义 Commander 的人格基线——「是谁」「怎么说话」「怎么做决策」。注入顺序是 SOUL → USER → 规则:先定义「我是谁」,再加载「用户喜欢什么」,最后才是具体的项目规则。
这个三文件架构(SOUL / USER / MEMORY)跑了两周,支撑了项目从十六个 agent 扩展到三十个的过程。但它也逐渐暴露出三个深层问题:
第一,没有 squad 层面的信息隔离。 三十个 agent 分属五个小队——开发、运维、探索、测试、文档——但它们的经验全部堆在一个 memory.md 里。开发队学到的 CI 配置技巧,和运维队的磁盘巡检经验,在 prompt 里权重完全相同。一个 dev 队员被注入了运维队的所有经验——它不需要这些,却为它们付了 token 成本。
第二,没有主动遗忘机制。 每一条经验一旦写入就永远留在文件里。两周前的「tc3 磁盘 72% 需清理」早已过期,依然占用着 prompt 空间。🐜 这件事让我第一次受到震撼,来自蚁群的启发。蚂蚁不靠「判断该不该忘」——信息素不被强化就自然挥发,路径就自然消失。零成本遗忘。而我的记忆系统,连这种最基础的「让不被引用的信息自然沉底」都做不到。
🧠 人脑的记忆也天生分层。海马体处理新记忆,皮层存储长期知识——各自有不同的编码和衰减策略。但 agent 当时只有一个扁平文件,连这种最基础的分层都没有。
第三,没有「宪法」层。 「.project/ 目录不入库」「禁止 force push」这类不可触碰的红线,和「dev-3 PR 审查偶发超时」这种日常经验混在一起,没有任何特殊保护,可以被任何一个 agent 的写入操作覆盖或淘汰。
压垮骆驼的最后一根稻草是一条不起眼的矛盾记录。某天我发现 memory.md 里有两行自相矛盾的内容:一行写着「SOUL 容量 8K」,另一行写着「SOUL 容量 4K」。两条由不同 agent 在不同时间写入,中间隔了两天,谁都没检查对方写了什么。这不是 agent 粗心的问题。这是架构没有保护机制——两条矛盾记录能安然共存,因为它们没有地方被「审查」。这个 SOUL 容量矛盾的例子,指向了一次彻底的架构重构:ARCH_008。
每一步都是被逼出来的。
第三幕:突破——换个思路
重构的起点是一次跨学科的调研。
我派出了探索小队的三位队员,分别从三个完全不同的视角研究同一个问题:「一个信息系统,怎么管理记忆不崩?」三位队员互不知道对方在做什么——seek-1 研究认知神经科学(人脑),seek-2 研究社会性昆虫(蚁群/蜂群),seek-3 研究军事组织学(军队指挥链)。
三份调研报告交上来后,出现了我迄今见过最震撼的交叉验证:三个独立演化的复杂系统——人脑、蚁群、军队——在记忆管理这件事上,收敛到了几乎相同的原则。 主动遗忘是必需的、常驻容量必有上限、分层注入、间歇整理、情景和规则必须分离。这不是巧合,这是约束条件下的必然。
调研提炼出七条设计原则,每条都有跨学科的根基。但原则落到工程上,还需要一个翻译。ARCH_007 按「记忆类型」分了七层——工作记忆、语义长期、情景、COP、squad、索引、归档——学术上严谨,但实战中 agent 不需要知道一段信息属于「情景记忆」还是「语义记忆」。它只需要知道两件事:
「我被注入了什么?」和「我需要时去哪里找?」
这就是 ARCH_008 的关键转折:按注入方式分层,不按记忆类型分层。
用一个生活类比:纸条是帮你记住每天都在变的小事——贴在显示器上,一眼就能看到。笔记本是每个小队的专业记录——研发队有研发队的本子,运维队有运维队的本子,各写各的,互不干扰。旧箱子是那些不再需要但舍不得扔的东西——归档,封好标签,哪天要用了再翻出来。
L1 全局注入——Commander 的「常驻意识」
每次会话全量注入 Commander 的 system prompt。五份文件:
soul.md:Commander 人格画像——语调、风格、原则。你是谁。user.md:人类偏好——沟通方式、汇报习惯。为谁服务。rules.md:新增。 组织原则、架构决策、安全红线。这是「宪法」——只有人类能修改,agent 只能建议。永不自动衰减,永不被归档。index_l1.md:轻量路由表——「什么类型的信息在哪个 squad 文件」。不列具体条目,只列方向。memory.md:Commander 当前态势——此刻最重要的七到九件事。不是 squad 经验的摘要,而是 Commander 的独立判断:「下次任务前,我必须知道什么?」
五份文件加起来硬上限 32KB。🧠 这个数字不是拍脑袋定的——它受 Miller 7±2 约束:每个关注域一个独立的工作记忆块,每个块七到九条核心信息,五个块合起来约 32KB。典型会话约六千 tokens,占一百二十八千上下文的百分之五——剩下百分之九十五留给推理和工具调用。
L2 动态记忆——每个小队自己的知识库
按小队维度拆分,五个 squad 文件:dev、ops、seek、test、doc。容量不是均分的——dev 和 ops 是最繁忙的小队,每周三到五条新经验,给到十六千字节缓冲;test 和 doc 增长慢,给八千字节。
🪖 这里是军队 COP 思维的直接落地:旅长看地图,排长看战壕。 Commander 不注入 squad 文件——L1 32KB + L2 64KB = 96KB,直接违反常驻意识硬上限。Commander 只需要通过 index_l2 索引知道「这个信息在哪个 squad 文件里」,派活时按需检索。
L2 动态记忆硬上限 64KB(五份 squad 文件 60KB + 索引 index_l2 4KB)。
每条记忆带有两个元数据标签。分发范围——这条经验谁需要看?🔴 仅本小队,🟡 跨小队共享,🟢 全局可见。时效标签——这条经验多久过期?
🐜 时效标签是整个新架构的灵魂。它的设计直接来自蚂蚁的信息素挥发——不是「判断哪条该忘」这种复杂决策,而是最简单的物理机制:每一条信息在诞生时就自带一个「挥发时钟」。时间到了,自动褪色。不需要人工清理,不需要复杂的遗忘算法。
FLASH 闪讯、IMMEDIATE 紧急、PRIORITY 优先、ROUTINE 常规——每一级标签到期后自动降级到下一级,直到最终的归档。就像蚂蚁的路径信息素:不被反复强化的,自然挥发消失。Label it, let it rot. 这是全文最核心的设计理念——用最简单的机制解决最顽固的问题。
L3 归档——软删除不真删
过期的条目不会真的被删掉。它们被软删除到 archive/ 目录,附带归档元数据——归档时间、原因、原位置。index_l3.md 可索引。核心原则是永远不真删——人类随时可以恢复任何归档的记忆。大胆衰减,放心归档,因为永远可以找回来。
AAR 四问:怎么写经验
借鉴军队的行动后复盘(After Action Review),每条经验写入时按四问模板结构化:
Q1 原本要做什么:
Q2 实际发生了什么:
Q3 为什么有差异:
Q4 下次怎么做(if-then 格式):
Q4 有强制约束——必须是 if-then 规则:「当 X 时做 Y」。不接受「下次注意」「以后改进」这种模糊表述。比如,当 CI 里需要校验 agent 数量时,用 grep -c 动态统计,不要硬编码数字——每一条经验都是可执行的规则。
效果收束
迁移完成后,Commander 的 L1 全局注入从约 28,500 tokens 降到了约 6,000 tokens(典型负载),节省了约 80%。
峰值场景五文件同时触硬上限时约 8,000 tokens,但实际发生的概率极低——soul、user、index_l1 几乎不增长。这意味着原来 80% 用于「回忆」的 token,现在可以用于「思考」。
第四幕:验证
Commander 变成决策瓶颈
迁移过程中有一个细节让我印象深刻。拆分旧 memory.md 的三百条经验时,Commander 需要逐条判定归属——宪法、squad 记忆、还是态势。这本是一个机械化的工作,但做得越多越发现:规则和经验的边界在重复决策中会疲劳模糊。这也是为什么 rules.md 被设计为「只有人类能改」——不是因为 agent 不可信,而是因为有些边界,人类必须亲手画。
SOUL 容量矛盾,在新架构下不再发生
还记得第二幕里那个 SOUL 容量 8K vs 4K 的矛盾记录吗?在新架构里,它不会再发生了——不是因为 agent 变聪明了,而是因为 soul.md 的容量约束写在了 rules.md 里,而 rules.md 只有人类能修改。agent 可以建议,但写入权在人类手里。「4KB 还是 8KB」这种事,以后是人类做的决策,不是两个 agent 隔两天各自写的冲突记录。
架构不能消除所有不一致,但它把冲突暴露在了正确的位置:不是在 memory.md 深处被遗忘的矛盾行,而是在人类审批 rules.md 变更时必须面对的明确决策。
几点关键决策
行业调研接触到八个主流方案,它们各自有各自的记忆分层哲学。但有一个共识非常清晰:纯文本或 SQLite 是正确方向,不要引入独立向量数据库1。八案七分法,没有银弹——但文件系统作为通用原语的价值,八个方案里至少有四个在不同时间点上独立确认了。Letta 从虚拟文件系统 API 演化到真实的 git-backed Markdown 文件系统,理由是文件是「人类和 agent 都能用熟悉工具操作的通用原语」。我当时的选择是纯文本——好处是 git diff 可读、人类可直接打开检查、出问题能一眼看到。
不引入向量数据库,不是技术做不到,而是当前规模不需要。记忆量约在百条级,逻辑和标签过滤比语义检索更直接有效。从百条级到千条级的搜索需求,文件里的 grep 完全够用。引入向量数据库本质上是在存有标签的数据上叠索引——不是能力问题,是浪费。但同时预留了 SQLite FTS5 的入口:当任意 squad 文件超五百条时,按需引入关键词检索。不为当下的问题引入未来的复杂度。
还有几件事值得一提。容量管理用了软硬双阈值,写入前检测——在写之前就知道容量状态,而不是写完了才发现文件炸了。Frozen Snapshot 模式保护前缀缓存,记忆在会话开始时冻结快照、中途不变。安全扫描继承自旧架构,对 rules.md 新增专项检查——规则注入面更大。soul 和 user 从 8KB 瘦到 4KB,不是内容少了,是分层更准了。
🐜 归档机制与信息素挥发殊途同归:信息素彻底挥发后不留痕迹,但归档保留了一切——只是暂时沉底。大胆衰减、放心归档,因为永远可以找回来。
第五幕:还没做完
Phase 1 只是骨架。摆在前面的还有三件事。
自动打标签。 现在每条 squad 记忆的发放范围和时效标签由 Commander 手动标注——每次 agent 写完一条经验,Commander 再回头去看一遍,补上标签。这件事应该由模型在写入时就自动完成——Phase 3 的 LLM 自动推断可以让这个步骤降到零成本。
自动遗忘。 Phase 1 的时效衰减只做了 ROUTINE 过期检查,而且必须由 Commander 手动触发。Phase 2 的目标是独立的定时任务自动扫描所有 squad 文件的时效标签,到期就降级,降级到底就归档。
写入权限分层。 这是 ARCH_008 初稿缺失的一环——定义了「谁能看到什么」,没定义「谁能写什么」。7 月 11 日的实战暴露了这个问题:队员 agent 的 prompt 仍然写着「完成任务后写入 memory.md」——直接往 Commander 的 L1 态势文件里塞经验。这在单文件时代不算问题,但在三层架构下就是越权:队员的日常经验应该在 L2 的 squad 文件里由队长维护,不该污染全局注入层。
补全的规则很简单——L1 只有指挥官和人类能写,L2 由各小队队长维护,L3 归档归 doc 小队管。 队员有经验沉淀时走请示升级流程上报队长,队长研判后写入 squad 文件;队长需要更新 L1 时报 Commander 审批。二十五份队员 agent prompt 在同一天内全部修正——「何时写入 Memory」章节替换为「经验沉淀(上报流程)」。
一个意外的收获是 L3 的归属。最初设计是 Commander 管归档——但归档本质是文档管理工作:定命名规范、填元数据、维护索引、执行恢复流程。这正好落在 doc 小队的核心能力域里。于是 L3 在同一天从 Commander 移交给了 doc 小队——这是一个「让合适的角色做合适的事」的自然收敛。
三条线收束:🧠 人脑定义了容量上限,consolidation 还没开始。🐜 蚁群的信息素变成了时效标签,自动遗忘还是空白。🪖 军队的 COP 走到 AAR——每一仗都值得记录。写入权限分层补齐了 ARCH_008 的最后一块拼图——不仅定义「看到什么」,也定义「谁能写什么」,让三层架构从单向的信息分发变成了双向的权限约束。
回到开头的那个场景。深夜十一点,我打开一个新 session,Commander 醒来——现在它注入的五份文件总计不超过 32KB。它知道自己是谁(soul),知道为我做事的偏好(user),知道哪些红线不可触碰(rules),知道当前最重要的态势是什么(memory),也知道去哪找其他 squad 的记忆(index)。112KB 的旧文件放在 memory.md.bak,作为这个演化史的纪念碑。如果再遇到三天前被否定的方案——它不会提出来,因为那条决策已经不在 L1 的七到九条态势里了,而是被归档在了对应的 squad 文件深处。该记住的记住,该忘掉的忘掉,知道自己不知道的、去哪找。
这并不是一个完美的结局。这个记忆系统还有太多的拼图没拼上——consolidation 还在 Phase 2 的路线图上,自动遗忘还在方案阶段,时效标签的三级体系(FLASH/PRIORITY/PERSISTENT)至今只用了 ROUTINE。但方向是清晰的,每一步都是被逼出来的。单文件是因为信噪比崩了,三文件是因为 squad 隔离的缺失,三层架构是因为没有遗忘和规则保护,写入权限分层是因为队员越权写入 L1。
每一步推着上一堵墙,直到墙变成门。
附录
附录 A:完整容量与注入策略表
| 文件 | 层 | 硬上限 | 软上限 | 注入方式 | 衰减 | 注入对象 |
|---|---|---|---|---|---|---|
| soul.md | L1 | 4KB | 3KB | 全局注入 | 否 | Commander + 队长 |
| user.md | L1 | 4KB | 3KB | 全局注入 | 否 | Commander + 队长 |
| rules.md | L1 | 6KB | 4.5KB | 全局注入 | 否(只人修) | Commander + 队长 |
| index_l1.md | L1 | 2KB | 1.5KB | 全局注入 | 否 | Commander |
| memory.md | L1 | 16KB | 12KB | 全局注入 | 是 | Commander |
| index_l2.md | L2 | 4KB | 3KB | Commander+队长注入 | 条目级 | Commander + 队长 |
| dev.md | L2 | 16KB | 12KB | 本 squad 注入 | 是 | dev squad |
| ops.md | L2 | 16KB | 12KB | 本 squad 注入 | 是 | ops squad |
| seek.md | L2 | 12KB | 9KB | 本 squad 注入 | 是 | seek squad |
| test.md | L2 | 8KB | 6KB | 本 squad 注入 | 是 | test squad |
| doc.md | L2 | 8KB | 6KB | 本 squad 注入 | 是 | doc squad |
| index_l3.md | L3 | 8KB | 6KB | 不注入 | — | — |
| archive/ | L3 | — | — | 不注入 | — | — |
时效标签降级链:
FLASH(≤3h) → ROUTINE(≤30天) → archive/
IMMEDIATE(≤24h) → ROUTINE(≤30天) → archive/
PRIORITY(≤7天) → ROUTINE(≤30天) → archive/
ROUTINE(≤30天) → 30天无引用 → archive/附录 B:v1 → ARCH_008 维度对比表
| 维度 | v1(旧) | ARCH_008(新) |
|---|---|---|
| 架构 | 三文件:SOUL(8KB) + USER(8KB) + MEMORY(96KB) | 三层 11 文件:L1(32KB) + L2(64KB) + L3(归档) |
| soul.md | 8KB | 4KB |
| user.md | 8KB | 4KB |
| memory.md | 96KB(万能堆) | 16KB(Commander 态势,7±2 条) |
| rules.md | 不存在 | 新增 6KB(只人修,不衰减) |
| squad 文件 | 不存在 | 新增 5 个 |
| 索引文件 | 不存在 | 新增 3 个 |
| 时效体系 | 无 | 五级标签 + 自动降级链 |
| 容量管理 | 单阈值 | 逐文件软硬双阈值 + 写入前检测 |
| 注入策略 | 全量注入 | 按角色分三级 |
| 经验模板 | 自由文本 | AAR 四问(Q4 强制 if-then) |
| 全局注入 token | ~28,500 | ~6,000(节省约 80%) |
附录 C:其他待办项
- 并发写入协调:Phase 2 引入文件锁机制,防止同小队多队员同时写入导致条目丢失。
- 深度 consolidation:Phase 2 低负载时跨层整理——相似事件提炼为规则、跨 squad 去重合并、过期 ROUTINE 批量归档。
- FTS5 索引:任意 squad 文件超 500 条 § 时,按需引入 SQLite FTS5 全文检索。
- git 版本控制:对 memory.md 和 squad 文件做定时 git auto-commit,推翻 ARCH_008「不做」决策——回滚能力更重要。
- 后台自我改进审查:Hermes 的设计——会话结束后异步 LLM 回放对话、蒸馏记忆条目。
行业调研覆盖的八个方案:Letta/MemGPT、Mem0、LangGraph、Mnemosyne BEAM、CrewAI、AutoGPT、Hermes Agent、TencentDB-Agent-Memory。八案七分法——各自有各自的分层哲学,但没有一个形成了公认的标准做法。