CoALA - Cognitive Architectures for Language Agents · essay
18. CoALA:用认知架构统一理解 Language Agent
论文:Cognitive Architectures for Language Agents
本地原文:
![[papers/18-CoALA-2309.02427.pdf]]
论文定位与阅读路径
核心定位
CoALA 不是专门讲某个记忆算法,而是提出一个认知架构框架,用工作记忆、情景记忆、语义记忆、程序性记忆和动作空间来组织语言智能体。
如果你觉得 Agent 论文术语很乱,这篇就是一张架构蓝图。
原文结构导读
| 章节 | 内容 | 读法 |
|---|---|---|
| Abstract | Language Agent 缺少统一组织框架 | 看 CoALA 的目标 |
| 1 Introduction | 为什么需要认知架构 | 理解背景 |
| 2 Background | 从字符串到符号 AGI | 可略读,但能帮助理解 |
| 3 LM 与 production system | 语言模型和规则系统的连接 | 抓住“推理循环” |
| 4 CoALA Framework | 核心框架 | 重点 |
| 5 Case Studies | 用框架分析现有 Agent | 重点 |
| 6 Actionable Insights | 可执行设计建议 | 工程重点 |
| 7 Discussion | 讨论和限制 | 了解边界 |
| 8 Conclusion | 总结 | 回看架构 |
证据链阅读
| 证据点 | 读什么 | 工程判断 |
|---|---|---|
| Framework 定义 | 工作记忆、长期记忆、动作空间如何分层 | 用来统一 Agent 模块名,减少术语混乱 |
| Case Studies | 现有 Agent 能否被 CoALA 解释 | 框架是否有解释力,而不是空分类 |
| Actionable Insights | 作者给出哪些可执行设计建议 | 哪些能直接变成工程 checklist |
| Discussion | 框架的边界和未解决问题 | 不要把认知架构当成完整实现方案 |
方法框架与核心机制
CoALA 的核心图景
flowchart TD
A["Environment"] --> B["Perception"]
B --> C["Working Memory"]
C --> D["Decision / Reasoning"]
D --> E["Action"]
E --> A
C --> M["Long-term Memory"]
M --> F["Episodic"]
M --> G["Semantic"]
M --> H["Procedural"]
这个框架的重点是:
- Agent 不只是 LLM 调 API。
- Agent 有记忆结构。
- Agent 有动作空间。
- Agent 在环境中循环感知、思考、行动。
四类记忆
CoALA 对你最重要的是这四类记忆:
| 记忆 | 中文 | 存什么 | Agent 例子 |
|---|---|---|---|
| Working Memory | 工作记忆 | 当前任务上下文 | 当前计划、当前用户问题 |
| Episodic Memory | 情景记忆 | 过去发生的事件 | 上次修 bug 的过程 |
| Semantic Memory | 语义记忆 | 稳定事实和概念 | Java、MCP、项目架构 |
| Procedural Memory | 程序性记忆 | 怎么做事 | 运行测试、发 PR、排错步骤 |
这个分类非常实用。你以后设计 Agent Memory 时,不要只建一个 memory 表,要先问:
代码块收起展开
这条记忆属于哪一类?Working Memory:当前脑子里正在想什么
工作记忆就是当前任务的临时状态。
例子:
代码块收起展开
用户现在要我拆解 Agent Memory 论文。
已经完成 1-10。
当前正在补 11-21。
需要更新 history 和 CodexRules。工作记忆一般不一定永久保存,但它决定当前行动是否连贯。
Episodic Memory:发生过什么
情景记忆是“过去事件”。
例子:
代码块收起展开
2026-07-05,用户 A 要求把 Agent Memory 论文 PDF 下载到 essay/papers,并逐篇精读。它带时间、地点、参与者、过程,适合用于:
- 回忆历史任务。
- 复盘失败原因。
- 保持跨会话连续性。
Semantic Memory:稳定知识
语义记忆是“世界事实和概念”。
例子:
代码块收起展开
MCP 是一种让模型接入工具、资源和上下文的协议。
RAG 包括索引、检索、重排、上下文构造。它不像情景记忆那样强调“什么时候发生”,更强调概念关系。
Procedural Memory:怎么做
程序性记忆是技能。
例子:
代码块收起展开
如何在 PowerShell 里检查 git 状态。
如何给 Obsidian 笔记生成 Mermaid 图。
如何跑 Java Maven 测试。Voyager 的 skill library 就是程序性记忆的典型例子。
Action Space:Agent 能做什么
CoALA 不只讲 memory,还讲 action。
| 动作类型 | 例子 |
|---|---|
| 外部动作 | 调 API、读文件、运行命令 |
| 内部动作 | 思考、规划、检索记忆 |
| 语言动作 | 向用户提问、解释 |
| 工具动作 | 调用 MCP 工具、搜索、编辑 |
一个 Agent 强不强,不只取决于 LLM,还取决于:
代码块收起展开
它能看到什么 + 它记得什么 + 它能做什么 + 它如何选择动作。Case Studies 怎么看
论文用 CoALA 去分析已有 Agent。你读这里时不用记所有案例,只要学会一招:
代码块收起展开
看到一个 Agent 系统,就把它拆成:
Memory 是什么?
Action 是什么?
Decision 是什么?
Environment 是什么?比如 MemGPT:
| CoALA 维度 | MemGPT |
|---|---|
| Working Memory | 当前上下文 |
| Episodic/Semantic | 外部记忆 |
| Action | memory tool call |
| Decision | LLM 决定何时读写 |
比如 Voyager:
| CoALA 维度 | Voyager |
|---|---|
| Working Memory | 当前 Minecraft 状态 |
| Episodic | 任务尝试历史 |
| Procedural | 技能库 |
| Action | 执行代码控制游戏 |
工程映射与实践启发
对工程设计的启发
如果你要做 Personal Knowledge Agent,可以按 CoALA 分模块:
代码块收起展开
agent/
working-memory/ 当前任务状态
episodic-memory/ 历史任务和对话
semantic-memory/ Obsidian 知识概念
procedural-memory/ 可复用技能和流程
action/ 工具调用
policy/ 决策与路由这比一个大而全的 AgentService 更清楚。
概念校准
你自己学习时也有四类记忆:
- 工作记忆:现在这道题做到哪一步。
- 情景记忆:上次考试哪里错了。
- 语义记忆:操作系统里进程和线程的定义。
- 程序性记忆:怎么用公式解题,怎么写代码。
CoALA 只是把这个人类认知结构迁移到语言 Agent。
局限、对比与阅读检查
局限与边界
- 它是概念框架,不是直接可运行系统。
- 分类很清楚,但真实系统里记忆可能交叉。
- 没有解决具体检索、更新、遗忘算法。
- 工程实现还要处理权限、成本、失败恢复。
阅读检查清单
- CoALA 为什么是架构框架,不是单个算法。
- 四类记忆:working、episodic、semantic、procedural。
- Agent = memory + action + decision + environment。
- 如何用 CoALA 拆解 MemGPT、Voyager、Reflexion。
- 如何用它设计自己的 Agent 后端模块。
深度精读:CoALA 是 Agent 架构的“解剖图”
1. 为什么认知架构重要
没有架构时,Agent 很容易变成:
代码块收起展开
一个大 prompt + 一堆工具 + 一些 if elseCoALA 的价值是把 Agent 拆成稳定概念:
代码块收起展开
Memory + Action + Decision + Environment这让你能分析任何 Agent,而不是被框架名字牵着走。
2. Working memory 是运行时状态,不是长期记忆
工作记忆保存当前任务状态:
代码块收起展开
当前正在处理第几篇论文?
用户刚才的反馈是什么?
哪些文件已经写过?
下一步要做什么?它类似程序里的 runtime state。丢了它,Agent 会“断片”。
3. Episodic memory 是历史事件
情景记忆关注“发生过什么”:
代码块收起展开
2026-07-05 用户反馈论文笔记太浅。
之前已经下载了 21 篇论文 PDF。
A-MEM 的源链接曾经修正过。它应该带时间、来源和上下文。没有这些,历史事件会变成模糊事实。
4. Semantic memory 是稳定知识
语义记忆关注“什么是什么”:
代码块收起展开
MemGPT 把上下文管理类比操作系统。
Zep 使用时序知识图谱。
Reflexion 使用语言反思作为经验记忆。它更像知识卡片,适合结构化和双链。
5. Procedural memory 是最容易被忽略的
程序性记忆关注“怎么做”:
代码块收起展开
如何下载论文。
如何检查嵌入文件是否存在。
如何扩写论文精读笔记。
如何更新 history/CodexRules。编程 Agent 想越用越顺手,procedural memory 非常关键。
6. Action 也要分类
CoALA 不只讲记忆。动作也要拆:
| 动作 | 例子 |
|---|---|
| External action | 读写文件、运行命令、调用 API |
| Internal action | 检索记忆、规划、反思 |
| Communicative action | 向用户解释、提问 |
工具调用只是 external action 的一部分。规划和反思也是动作。
7. 用 CoALA 设计你的 Agent
代码块收起展开
WorkingMemoryService:当前任务状态
EpisodicMemoryService:历史事件
SemanticMemoryService:概念知识
ProceduralMemoryService:技能流程
ActionExecutor:工具执行
PolicyEngine:决定下一步动作
TraceService:记录每次行动这套拆分比一个 AgentService 清晰得多。
8. 判断一个 Agent 框架是否成熟
用 CoALA 问它:
- 工作记忆在哪里?
- 长期记忆有哪些类型?
- 技能如何保存?
- 工具调用如何审计?
- 失败后如何反思?
- 当前状态如何跨回合延续?
答不上来,就是 demo 级 Agent。
精读补强:CoALA 的证据链与工程判断
CoALA 的价值是架构分层。读它时不要纠结某个模块名字,而要看它怎样把 Agent 拆成可替换部件。
| 判断点 | 原文证据 | 工程含义 |
|---|---|---|
| 工作记忆 | 当前任务临时信息如何组织 | 对应运行时 context builder |
| 长期记忆 | episodic、semantic、procedural 如何区分 | 对应不同存储表和检索策略 |
| 行动空间 | 工具、环境动作如何暴露 | 对应 tool registry 和 permission gate |
| 决策循环 | 观察、推理、行动、更新如何闭环 | 对应 Agent runtime 状态机 |
把 CoALA 用到工程里,最重要的是边界清楚:记忆模块不直接执行动作,工具模块不负责总结经验,规划模块不绕过权限。边界清楚,后续才能替换模型、检索器或工具实现。
论文精读主线:问题-方法-验证-局限-启发
1. 核心结论
CoALA 用认知架构把语言 Agent 拆成 working、episodic、semantic、procedural memory 和 action space,提供一张 Agent 系统解剖图。
本篇的阅读重心是:用认知架构区分 working、episodic、semantic、procedural memory 和 action space。读完后要能说清它改变的是 runtime、存储、检索、更新还是评测层;否则只是记住了论文名。
2. 问题背景
Agent 框架常把 prompt、工具、记忆、规划混在一起讲,导致系统边界不清。没有认知层分类,很难判断一个信息应该放在当前上下文、历史事件、稳定知识还是技能流程里。
把问题具体化为失败样例:所有状态都塞进一个 memory 模块,导致当前任务状态、历史事件、稳定知识和技能流程互相污染。用这个样例反推论文动机,比泛泛说“上下文不够”或“记忆不准”更有判断力。
3. 核心方法
CoALA 借认知科学分类,将 Agent 状态分为 working memory、episodic memory、semantic memory、procedural memory,并把 action space 作为 Agent 能做什么的边界。
flowchart TD
I[当前输入] --> W[Working Memory]
W --> E[Episodic Memory]
W --> S[Semantic Memory]
W --> P[Procedural Memory]
W --> A[Action Space]
A --> O[外部工具/环境]
方法部分按数据流读:运行时状态进入 working memory,事件进入 episodic,概念进入 semantic,技能进入 procedural,工具由 action space 约束。每一步都要能标出输入、输出、控制点和失败后该记录的日志。
4. 技术细节
Working memory 是运行时正在想的内容,不是长期记忆;episodic 是发生过什么;semantic 是稳定知识;procedural 是怎么做;action space 是能调用什么工具。这些边界直接对应工程模块。
代码块收起展开
final class CoalaAgentArchitecture {
private final WorkingMemory workingMemory; // 保存当前任务状态、临时目标和本轮上下文
private final EpisodicMemory episodicMemory; // 保存历史事件、任务过程和对话片段
private final SemanticMemory semanticMemory; // 保存稳定知识、概念和文档事实
private final ProceduralMemory proceduralMemory; // 保存可复用技能、流程和工具使用方法
MemoryResult handle(MemoryInput input) {
// 1. 保存当前任务状态、临时目标和本轮上下文
// 2. 保存历史事件、任务过程和对话片段
// 3. 保存稳定知识、概念和文档事实
// 4. 保存可复用技能、流程和工具使用方法
// 输出中保留 traceId、sourceIds、decisionReason,方便复盘和回滚。
return MemoryResult.withTrace(input.traceId());
}
}字段检查重点是 workingState、episode、concept、procedure、actionSchema 分别对应不同存取规则。这些字段不是装饰,它们决定后续能否检索、审计、回滚、限权和做离线评测。
5. 实验验证
CoALA 更像架构框架,验证方式是看它能否解释多个 Agent case,并指导系统拆分。工程上可用它审查:一次失败是 working memory 丢状态,还是 episodic 没召回,还是 procedural 没技能。
实验阅读重点:用 CoALA 审查失败归因:是丢了当前状态,没召回历史,缺稳定知识,还是没有可执行技能。如果论文没有直接给出这层证据,复现时就要自己补机制级指标。
6. 局限与启发
分类清楚不等于实现自动可靠。启发是你的 Agent 目录和服务层可以按这四类记忆拆,而不是只建一个 memory 包。
迁移到你的项目时,结论是:你的代码包可以按这四类拆接口;不必一开始四套存储,但边界必须先清楚。先把边界做对,再追求更复杂的模型或更大的记忆规模。
7. 关键术语表
| 术语 | 在论文里的意思 | 工程落地时要看什么 |
|---|---|---|
| Working memory | 当前工作上下文 | 本轮 prompt、任务状态、临时变量 |
| Episodic memory | 经历记忆 | 历史事件和执行轨迹 |
| Semantic memory | 语义知识 | 笔记、文档、概念事实 |
| Procedural memory | 程序性记忆 | 技能、流程、工具使用方式 |
8. 复现难点
最常见错误是把所有长期内容叫 semantic memory,或者把技能也存成普通文本。procedural memory 必须能指导行动,最好可执行或可验证。working memory 必须有预算和清理策略。
复现入口应从失败集开始:把一个学习任务拆成四类记忆输入,检查回答失败时能定位到缺哪一类。只有先证明旧方案会坏,才知道新机制是否真的解决了问题。
9. 代码框架建议
包结构可按 memory/working、memory/episodic、memory/semantic、memory/procedural 拆。每类都有自己的 write/read/update/eval,不共用一套模糊接口。
代码验收门槛:新增 memory 字段时必须标注属于哪类认知记忆;混不清的字段先不入库。这条门槛应写进测试或 trace 字段里,避免实现只停留在 demo。
10. 相关论文对比
CoALA 和 MIRIX 都强调分工;CoALA 是认知分类,MIRIX 是多模块系统实现。Voyager 属于 procedural memory,Generative Agents 偏 episodic + reflection,RAG 笔记库偏 semantic。
横向比较时抓这个角度:CoALA 是系统解剖图,MIRIX 是模块实现,Voyager 是 procedural memory 的典型例子。比较对象不是谁“更先进”,而是谁负责哪一层失败。
11. 批判性思考
CoALA 的价值是边界,不是算法。不要因为有四类记忆就机械实现四个复杂系统;应从任务失败出发,缺哪类补哪类。
批判边界:分类不是实现目标;如果任务只需要 semantic RAG,就不要为了完整性硬做四套复杂系统。这不是否定论文,而是把论文结论放回真实系统的成本、权限和恢复约束里。