本期拆解金字塔尖:L3 如何从场景档案里提炼出"这个用户/团队是谁"的稳定画像,以及它为什么是四层里唯一"无条件注入"的一层。
官方仓库:
https://github.com/TencentCloud/TencentDB-Agent-Memory代码版本:2.0.0-beta.1
一、L3 的定位
官方定义:
L3 Core / Persona:长期画像、稳定模式与高层认知 —— 用于让 Agent 迅速进入用户和团队语境。
L3 是记忆金字塔的塔尖:它不落在某一次对话上,描述的是稳定特征——用户的工作风格、偏好、约束、团队规范、高层认知。它是四层里唯一每次新会话无条件注入的一层。
也正因为如此,它必须足够短、足够稳定——它占的是每一轮对话的固定成本。
核心实现文件是 persona-generator.ts,官方架构文档的描述是:
L3:
core/persona/persona-generator.ts—— 四层深扫模型(four-layer deep scan):以 scene_index + 场景内容为输入,CleanContextRunner 生成/更新画像。
二、生成流程(7 步)
① 读取现有画像(persona.md,剥离导航)
② 检测变化场景(updated > checkpoint.last_persona_time)
③ 读取变化场景全文(预加载进 Prompt)
④ 模式判定:existingPersona ? incremental : first
⑤ 备份 persona.md + LLM 沙箱生成(workspaceDir=dataDir,超时 180s)
⑥ 后处理:剥离 LLM 多加的导航 + escapeXmlTags(XML 转义,防注入)
⑦ 追加最新场景导航 + 推进 checkpoint(markPersonaGenerated)
变化检测(增量优先)
L3 不会每次全量重算,而是只处理自上次生成以来变化过的场景:
checkpoint.last_persona_time记录上次生成时间;scene_index里updated晚于该时间戳的场景视为"变化场景",全文预加载进 Prompt;- 没有变化场景且画像已存在 → 直接跳过本次生成(省一次 LLM 调用);
- 保守策略:日期解析失败视为变化。
首次 vs 增量
- first(首次):没有现有画像,从全部场景生成完整画像;
- incremental(增量):已有画像,重点分析自上次以来的新增 / 修改内容,刷新画像。
一个有趣的细节:
promptMode = "code"时,L3 的产物不是 “persona”(用户画像)而是 “team operating doctrine”(团队运营规约)——面向代码 Agent 团队时,它沉淀的是团队的工作方式与规范,而不只是个人偏好。
安全注入(后处理)
画像最终会被注入 system prompt,所以注入前必须消毒:
- 剥离 LLM 可能自行添加的场景导航块(导航由系统统一生成);
escapeXmlTags转义 XML 标签,防止画像内容里的<...>破坏提示词结构;- 空画像按失败处理(不写入,不污染导航)。
checkpoint 推进
成功生成后 markPersonaGenerated 推进 checkpoint,供下一轮变化检测使用——checkpoint 是 L3 增量的"水位线"。
三、persona.md 的形态
# 用户画像 / 团队规约
(LLM 生成的长期画像正文:
工作风格、偏好、约束、
稳定模式、高层认知…)
---
## 🗂 场景导航
- [鉴权模块重构](scene.md)
- [每日英语学习](english.md)
- 正文:LLM 生成;
- 导航:系统生成(
generateSceneNavigation),LLM 不参与——L2 抽取后也会更新这段导航(见第 4 期)。
四、触发方式与同步
触发
- 定时 / 事件:L2 完成后由服务层调度(如 L3 timer 到期);
- 信号驱动:L2 抽取时 LLM 发出
[PERSONA_UPDATE_REQUEST]信号(原因写入 checkpoint),触发 L3 生成——这是"场景维护 Agent"主动报告"有值得沉淀到画像的内容"。
存储
- 权威存储:
persona.md,全实例一份; - 同步副本:profiles 表,供 TCVDB 等远端后端拉取(ProfileRecord 同步,见
profile-sync.ts)。
召回注入
召回时 L3 被无条件读取并放入 appendSystemContext(system prompt 尾部)——它是稳定内容,配合 Anthropic / OpenAI 的提示词缓存,几乎零增量成本。
五、自定义 Prompt 与生成溯源(官方 v2.0 能力)
官方 MemoryCore README 介绍了两个配套能力:
自定义 Memory Prompt:支持 L1/L2/L3 Prompt CRUD 和 Agent、Team、Instance 绑定,按
Agent > Team > Instance > 系统内置解析生效策略;自定义内容只能调整记忆关注点和归纳策略,不能修改固定输出协议。
生成溯源:记录 L1/L2/L3 实际使用的 Prompt ID、版本、来源、内容哈希以及输入输出引用……不保存 Prompt 正文快照。
对 L3 的意义:
- 不同 Agent / 团队可以用不同关注点生成画像(例如"重点提取架构决策、兼容性约束");
- 每条画像生成记录都可溯源:用哪个 Prompt、哪个版本、基于哪些场景、哪个模型。
六、本期小结
- L3 是四层唯一无条件注入的层,内容必须稳定、精炼。
- 生成机制:四层深扫模型 + 增量优先(只处理变化场景)+ 首次 / 增量双模式。
- 安全:XML 转义防注入、导航系统生成、空画像拒绝写入。
- checkpoint 是增量水位线;profiles 表是同步副本、
persona.md是权威。 - 自定义 Prompt 可按 Agent / Team / Instance 生效,但固定输出协议不可改。
下一期看最关键的一环——这些记忆在每一轮对话里是如何被取回来、注入到 Agent 上下文的:召回与注入。
图示索引
- 图示:L3 长期画像:Persona 的生成与维护(在新窗口打开完整图示)
源码索引
| 内容 | 文件 |
|---|---|
| L3 生成主流程 | MemoryCore/src/core/persona/persona-generator.ts |
| L3 触发 | MemoryCore/src/core/persona/persona-trigger.ts |
| 生成 Prompt | MemoryCore/src/core/prompts/persona-generation.ts |
| 画像同步 | MemoryCore/src/core/profile/profile-sync.ts |
| 自定义 Prompt / 溯源 | MemoryCore/src/core/memory-prompt/、memory-generation-log/ |