45 min · 精读 easel/persona.py(99 行,本模块最后一课,含动手作业)
🎒 预备知识:完成上一课「L04」(零基础入口:第 0 课)
画像(profile)= 一个账号的完整人设,Easel 里是 profiles/<名字>/ 下六个
markdown 文件:identity.md(定位)、style.md(风格)、audience.md
(受众)、platforms.md(平台)、preferences.md(偏好红线)、
memory.md(长期记忆)。它必须进入模型上下文,模型才知道"为谁创作"。
问题是怎么进。三个候选方案:
| 方案 | 做法 | 致命伤 |
|---|---|---|
| A. 写进 system prompt | 启动时把画像拼进 SOUL | 画像按会话不同,但 system 是共享常驻——并发会话互相覆盖 |
| B. 写全局 USER.md | 启动时把画像写进工作区全局文件 | 同上,且历史包袱:CLI 曾这么做过(docstring 自述) |
| C. 消息内联前缀 | 每条消息开头带画像声明 | 每轮多 ~50 token(唯一的代价) |
选择是 C。看竞态推演(下一节)再回头看这张表,你会明白那 50 token 是全工程最值的支出。
设两个并行会话:A 绑美食画像,B 绑科技画像。方案 B(全局文件)的时间线:
t1 A 开工:写 USER.md = "美食账号,受众爱探店"
t2 B 开工:写 USER.md = "科技账号,受众是开发者" ← 覆盖了 A 的
t3 A 的下一轮:读 USER.md → 读到"科技账号"
t4 A 给美食号写出面向开发者的文案 ← 串味,且无人报错
最恶毒的是 t4:没有任何报错。文件系统不觉得两个进程写同一文件有问题, 模型不知道自己读错了人设,用户只觉得"产出质量不稳定"。静默串味是共享可变状态 的经典事故(并发编程五十年老问题),Easel 的解法也经典:消灭共享可变状态—— 画像不进任何共享文件,改为每个请求自带声明(消息内联)。自包含请求 = 请求之间 没有隐藏耦合 = 并发天然安全。这是函数式编程"不可变数据"思想在 prompt 工程的应用。
load_profile_text(:38-55):按固定顺序拼六维文件——
_FILE_ORDER = [identity, style, audience, platforms, preferences, memory],
顺序有意义:定位先于细节,红线(preferences)压轴前,记忆最后。
目录里其余 .md 追加在后。注意制作层不读 platforms.md(AGENTS.md :57)——
各层只取所需维度,又一个"渐进披露"。
persona_prefix(:58-69):三句话前缀,原文:
f"我当前使用的画像是「{name}」。"
f"本会话的账号长期记忆仅使用 profiles/{name}/memory.md,"
"不要使用工作区全局 MEMORY.md 作为账号记忆。"
注意三句话的信息密度:句 1 声明身份;句 2 定记忆作用域(只认这个文件); 句 3 显式排除全局记忆。A6 说的"作用域声明"就是这个——不靠模型猜,每个请求都明说。
chat_turn_message(:91-99):完整拼装 = 画像前缀 + 用户原文 + TURN_REMINDER。 前端只显示用户原文——注入的部分对用户不可见。
模块顶部的注释块是全模块最值得背的段落(原文大意):"系统提示只在会话开头最新鲜;长对话里后续追问, 模型对系统提示的注意力会衰减 → 常见现象'开头会查 SKILL、后面就凭记忆裸做'。把最关键的反射 每轮在消息末尾重申一次(放末尾借近因效应),成本极低,显著提升后续轮次的 SKILL 命中率。"
三个知识点叠在这段注释里:① 现象命名(指令衰减)——知道症状才能对症; ② 机制解释(L4 位置效应:末尾近因最显眼);③ 工程化(固定模板 + 只加在对话入口)。看它重申什么:先查技能库、五层自己产出、先查已登录账号、对外不泄密—— 全是 AGENTS.md 的最高频规则。宪法每轮复读一遍最重要的三条,成本 100 token, 换规则存活率。
坑 1:画像写进全局文件图省事。单用户测试期没事,多会话/多账号必串味—— 而且没有报错,等发现时已经发了多少条错人设的内容。坑 2:前缀声明了记忆作用域 但 agent 还是去读全局。要配合 AGENTS.md 的"禁读全局 MEMORY.md"(L03 :95)双保险—— prompt 层和规则层都要说。坑 3:REMINDER 无限膨胀。重申清单越加越长, 最后占了半个窗口——只放"衰减后最痛"的三四条。
检验:给两个并行会话画时序图,展示全局 USER.md 方案在哪一步串味、内联方案为什么不会。
作业(M2 毕业物):为你自己的 agent 写 AGENTS.md + SOUL.md 各一份(各 ≤60 行), 要求包含:六条执行规则、一处"刻意不写"、记忆作用域声明。写完发我评审。