你看到的世界,就是 Context
模型本身没有记忆,每一次调用都是「从零开始」。它之所以「记得」之前发生的事、知道有哪些工具、了解项目规则,全靠每轮都重新拼好的一份Context 喂给它。换句话说:你的世界,就是这次请求里携带的那堆字节。
┌──────────── Context ────────────┐
system ─▶ │ 角色设定 / CLAUDE.md / 项目规则 │
tools ─▶ │ 可用工具的 schema │
history ─▶ │ user / assistant / toolResult … │
current ─▶ │ 这一轮用户说的话 │
└──────────────────────────────────┘
▼
stream(model, ctx)Context 的几个组成
- system prompt:角色、风格、安全边界,以及拼进来的
CLAUDE.md/ 项目说明。 - tools:每个工具的名字、描述、参数 schema——模型据此决定调谁、怎么调。
- messages:历史对话 + 工具结果,按时间顺序排列,是「真相之源」。
Context 是有「预算」的——它必须塞得进
model.contextWindow。这正是后面三件大事的起点:压缩(Compaction)、资源加载(Resource Loader)、技能按需注入(Skills)。
每轮都重拼,而不是「追加」
关键直觉:Context 不是一个一直变大的全局对象,而是每一轮按需重新组装的快照。哪些历史保留、哪些被摘要、临时塞进哪些文件内容——都在组装那一刻决定。理解了这一点,后面的压缩与资源注入就都顺理成章了。