# 生成式 agent 与涌现式仿真

> Park 等人 2023 年（UIST '23，arXiv:2304.03442）用一个三部件架构填充了 **Smallville**——一个 25 个 agent 的沙盒：**记忆流（memory stream）**（自然语言日志）、**反思（reflection）**（agent 对自己记忆流生成的更高层综合）、**计划（plan）**（先是日级行为、再是子计划）。标志性结果是情人节派对的涌现：一个被植入「想办一场情人节派对」的 agent，在没有进一步脚本的情况下，让邀请在人群中传开、协调了时间、派对真的发生了——从 24 个一开始对此一无所知的 agent 里冒出来。消融实验表明这三个部件对可信度缺一不可。记录在案的失败是空间规范错误（走进打烊的商店、共用单人卫生间）。这是 2026 年 agent 仿真和多 agent 社会评估的参考架构。

**类型：** Learn + Build
**语言：** Python（标准库）
**前置要求：** Phase 16 · 04（原语模型）、Phase 16 · 13（共享内存）
**预计时间：** ~75 分钟

## 问题背景

大多数多 agent 系统是脚本紧凑的团队：planner 规划、coder 写码、reviewer 评审。这对定义良好的任务管用。它捕捉不到当 agent 有记忆、优先级和一个开放世界时产生的那种涌现、非脚本化的行为。研究、社会仿真、以及越来越多的游戏 AI 需要第二种。

Smallville 架构是它的基准。在 Park 2023 之前，最好的 agent 仿真也只是浅薄的脚本跟随者；在它之后，这个模式成了开放世界生成式 agent 的默认。如果你在 2026 年构建一个 agent 仿真，你要么在用 Smallville 的三个部件，要么得明确论证你为什么不用。

## 核心概念

### 三个部件

**记忆流（Memory stream）。** 一份只追加的日志，记录观察、行动、反思和计划。每条记录有时间戳、类型、描述（自然语言）、以及衍生元数据：**新近度（recency）**、**重要性（importance）**（agent 自评 1-10）、**相关性（relevance）**（与当前查询的余弦相似度）。

```
[2026-02-14 09:12:03] observation: Isabella Rodriguez asked me if I like jazz
[2026-02-14 09:14:22] reflection:   I enjoy long conversations about music
[2026-02-14 10:05:00] plan:         Attend Isabella's Valentine's Day party tonight
```

记忆检索把三个分数组合起来：`score = w_recency * e^(-decay * age) + w_importance * importance + w_relevance * cos_sim`。前 k 条记录进入当前 prompt。

**反思（Reflection）。** 周期性地（每 N 条记忆或在重要事件时），agent 从近期记忆生成更高阶的综合。反思条目回流进记忆流，像任何其他记忆一样可被检索。这就是 agent 如何构建「理解」——这套架构里相当于长期信念的东西。

**计划（Plan）。** 自顶向下拆解。先是粗线条的日级计划（「去上班，跟 Klaus 吃晚饭」）。然后是小时级计划。然后是动作级计划。计划可修订：当一个观察与计划矛盾时，agent 对受影响的片段重新规划。

### 为什么三个都重要（消融）

Park 等人做了分别去掉观察、反思、计划的消融实验。每个消融都损害可信度：

- 没有**观察**，agent 错过上下文、按过时信念行动。
- 没有**反思**，agent 形成不了更高阶信念；交互停留在浅层。
- 没有**计划**，行为变成反应式噪声；目标消散。

人类评分者给出的可信度分数在三个都有时最高；去掉任何一个都产生可测的退步。

### 情人节涌现

一个 agent，Isabella Rodriguez，被植入目标「想在 2 月 14 日下午 5 点在 Hobbs Cafe 办一场情人节派对」。其他 24 个 agent 不接收这种植入。在仿真的若干天里：

1. Isabella 的计划包含邀请人。
2. 每次邀请都成为某个邻居记忆流里的一条观察。
3. 那个邻居的反思生成信念：「Isabella 在办派对。」
4. 邻居的计划纳入「2 月 14 日参加派对」。
5. 邻居告诉其他邻居。邀请在没有中心协调的情况下传开。
6. 2 月 14 日下午 5 点，几个 agent 聚到了 Hobbs Cafe。

这是技术意义上的涌现：系统级行为（一场派对）从局部交互（双边邀请 + 个体规划）中产生，没有中心 orchestrator。

### 记录在案的故障模式

Park 等人明确记录了：

- **空间规范错误。** agent 走进打烊的商店。agent 试图用同一个单人卫生间。agent 在不该吃东西的房间里吃东西。模型无法仅凭环境推断社会-物理规范。
- **记忆溢出。** 深度仿真运行会让记忆检索成本增长。实用补救：周期性记忆压缩（summarize-and-prune）和对低重要性条目的衰减。
- **反思幻觉。** 反思可能编造记忆流里不存在的关系。缓解：在反思 prompt 里包含源记忆 id，并在检索时验证。

这些都是与生产相关的故障模式：任何 2026 年的 agent 仿真都继承它们。

### 三部件实现规则

1. **记忆只追加。** 永不改变一条记忆条目。修正是新条目。
2. **重要性分数很便宜。** 写入时调 LLM 给重要性打 1-10 分。缓存这个分数。
3. **检索是排序而非过滤。** 按组合分数取前 k；不要用硬过滤（会丢上下文）。
4. **反思周期性运行。** 当未处理记忆的重要性之和超过一个阈值（比如 150）时触发。
5. **计划可修订。** 当一个新观察与计划矛盾时，只重新生成受影响的片段，而非整个计划。

### Smallville 之外的生成式 agent

2024-2026 年的后续文献扩展了这套架构：

- **用于政策 / 市场研究的多 agent 社会仿真。** 类 Smallville 的人群仿真用户对功能的反应行为。比 A/B 测试快；准确性有争议。
- **游戏的 NPC AI。** 带 Smallville agent 的 RPG 产出涌现式故事线，而非脚本化任务。
- **生成式 agent 评估基准。** 指标不再是任务准确率，而变成长跑中行为的可信度 + 连贯性。

这套架构是参考。各种扩展替换部件（用向量存储做记忆、检索增强的反思、神经符号计划），但保留三部件结构。

### 这对多 agent 工程为什么重要

Smallville 是一个概念验证：当部件对路时，多 agent 涌现是便宜的。这套架构如今已在开源模型上被复现（更小的 LLM 优雅地而非陡然地丢失可信度）。任何需要**涌现式社会行为**的生产系统都用这个形状。任何需要**紧凑任务执行**的系统则用本阶段前面的 supervisor / 角色 / 原语模式。

```figure
a5-memory-reflection
```

## 动手构建

`code/main.py` 用标准库 Python 和脚本化 agent 策略（无真实 LLM）实现这三个部件。演示在微缩尺度上复现情人节派对涌现：

- `MemoryStream` —— 带新近度/重要性/相关性检索的只追加日志。
- `reflect(stream)` —— 对近期高重要性记忆做脚本化反思。
- `plan(agent_state)` —— 基于当前信念的日级和小时级计划。
- 场景：5 个 agent。agent 1 以「下午 5 点办派对」起步。在仿真的若干 tick 里，邀请传开，agent 聚拢。

运行：

```
python3 code/main.py
```

预期输出：逐 tick 的追踪。到最后一个 tick，5 个 agent 里至少 3 个的计划里出现了派对，它们聚到了派对地点。单个种子在没有任何 orchestrator 的情况下产出了协调一致的到场。

## 实际使用

`outputs/skill-simulation-designer.md` 设计一个生成式 agent 仿真：agent 数量、记忆 schema、反思节奏、计划视野、以及评估指标。

## 拿去用

生产仿真的规则：

- **记忆就是数据库。** 规模化时选一个真实存储（向量数据库、Postgres）。内存标准库是给原型用的。
- **记录检索轨迹。** 每个动作都记录驱动它的前 k 条记忆。这是你的调试能力。
- **给每个 agent 的 token 设预算。** 每个 agent 每 tick 的「检索 + 反思 + 计划」是 O(k) 次 LLM 调用。N 个 agent × T 个 tick × 每 tick 调用数能把你的预算吃光。
- **周期性压缩记忆。** summarize-and-prune 掉低重要性条目。保留策略是一个设计决策，不是细节。
- **显式检测空间 / 社会规范违例。** 这套架构学不会它们。

## 练习

1. 跑 `code/main.py`。确认 3 个以上 agent 聚到派对。把 agent 增到 10 个——涌现还发生吗？
2. 去掉反思步骤。行为长什么样？对应到 Park 2023 的消融发现。
3. 引入一个竞争性的植入目标（「Klaus 想在下午 5 点做一场研究报告」）。agent 会分裂，还是某个目标主导？什么决定这点？
4. 加空间约束：Hobbs Cafe 最多容纳 4 个 agent。仿真是优雅处理溢出，还是撞上「单人卫生间」失败模式？
5. 读 Park 等人（arXiv:2304.03442）第 6 节（涌现行为实验）。指出一个你的微缩版里无法复现的行为。你需要增强架构的哪个部件？

## 关键术语

| 术语 | 大家嘴上怎么说 | 它实际是什么意思 |
|------|----------------|------------------------|
| Memory stream | 「agent 的日记」 | 观察、行动、反思、计划的只追加日志。 |
| Recency | 「记忆有多新」 | 按年龄的指数衰减分数。 |
| Importance | 「agent 有多在意」 | 写入时自评 1-10。已缓存。 |
| Relevance | 「与当前查询多相关」 | 余弦相似度（基于 embedding）。 |
| Reflection | 「更高阶信念」 | 从近期记忆生成的综合，作为新记忆重新摄入。 |
| Plan | 「日/小时/动作拆解」 | 自顶向下的计划树。观察矛盾时可修订。 |
| Smallville | 「Park 2023 的沙盒」 | 产出情人节涌现的 25 agent 仿真。 |
| Believability | 「质量指标」 | 人类评分者对「行为是否像个合理 agent」的打分。 |

## 延伸阅读

- [Park et al. — Generative Agents: Interactive Simulacra of Human Behavior](https://arxiv.org/abs/2304.03442) —— 参考架构
- [UIST '23 paper page](https://dl.acm.org/doi/10.1145/3586183.3606763) —— 发表场所
- [Smallville code release](https://github.com/joonspk-research/generative_agents) —— 参考 Python 实现
- [Hayes-Roth 1985 — A Blackboard Architecture for Control](https://www.sciencedirect.com/science/article/abs/pii/0004370285900639) —— 结构化记忆 agent 的先行工作
