每一轮都在送出的固定前缀

一次对上下文注入成本的逐段计量

工程调查 2026-09-22 真实会话记录 · 逐段量长

摘要 本文测量一个主动记忆插件在每一轮对话中送往模型的固定前缀的逐段成本。数据源不是估算,而是会话记录里真实发给模型的 messages:把其中的记忆块按标题行切开,逐段量长。

结果是:完整版 18,291 字符,为配置预算(8,000)的 228.6%;精简版 9,886 字符,为 123.6%。其中规则段一段就占 41.7%,且按设计每轮无条件注入、不参与裁剪。真正决定成本的不是「注入了多少条记忆」,而是「每轮都必须到场的那几段」。

上下文注入的成本,通常按「注入了多少条记忆」来估。这个口径在这套系统上不成立。

原因是结构性的:注入内容里有一半以上与「这一轮有没有值得记起的事」无关。它们是框架头、规则、索引——不管这一轮多安静,它们都会到齐。

一 账不是这么算的

要算清这件事,得先解决数据源问题。估算不可靠,因为它无法反映「预算被逐个分项切走」的真实过程。

可用的最强证据藏在会话记录里:session.v3.jsonl.zstd 保存的就是真实发给模型的 messages。把其中的记忆块取出、按段落标题行切开,量出的就是实际成本。

这份记录有一个技术细节需要先解决:它是多帧 zstd 追加流(一个 5.5 MB 文件含 1,049 帧)。用常规方式解压整个文件,只能得到第一帧——274 字节的会话头。必须逐帧解压。

token 口径采用仓内唯一的估算器:保守口径取「字符数除以二」与「字符数除以四加四」的较大者。比例分母为配置项 injectBudgetChars,本机为 8,000。

二 把每一段切开

完整版注入块 18,291 字符的逐段构成:规则段 7,634 字符占 41.7%,Tier-0 索引 1,249,项目笔记 1,706,用户级记忆 1,670,其余各段依次递减
图 1 完整版注入块的逐段成本。红线为配置预算 8,000 字符。
段完整版精简版每轮在场
规则段7,6347,414恒在,桶级豁免裁剪
Tier-0 索引1,2491,249恒在
项目笔记1,706—仅完整版
用户级记忆1,670—仅完整版
铭文1,137—仅完整版
白板1,112468恒在,额度不同
外部记忆817—仅完整版
账本782253恒在,额度不同
日志780—仅完整版
日历648—仅完整版
反思529—仅完整版
框架头 + 定位227227恒在
合计 18,291 / 9,886

三 四点一七成

规则段一段就是 7,634 字符,占完整版的 41.7%。它在精简版里是 7,414 字符,占精简版的 75.0%。

这一段有一个刻意的设计:它不参与裁剪。代码里的桶级豁免是显式的——limitOf('rules') 返回空,即使调用方显式传了上限也会被忽略并留痕。rules-section 的入队优先级是「普通」,但因为桶级豁免,优先级在此不生效。

把规则段与 Tier-0 索引相加——这两段是「每轮必须在场」的部分——合计 8,663 字符,正好是精简版的 87.6%。

换句话说:精简版里有近九成的内容,与「这一轮发生了什么」无关。无论这一轮是深夜的无人值守,还是刚刚打开的一段闲聊,这两段都会如数到场。

四 精简版省下了什么

两档之间的差额是 8,405 字符(约 4,203 token,保守口径)。

对比项值
完整块18,291 字符
精简块9,886 字符
差额8,405 字符
占预算228.6% → 123.6%
每五轮均值(一次完整 + 四次精简)11,567 字符/轮
 同上,占预算143.5%

即便按最省的节奏跑,每轮均值仍超出预算 43.5%。

这里需要对「预算」一词作一处澄清:injectBudgetChars 并不是硬性闸门。它只用于两件事——推导出分项上限,以及写入投递元数据作为「合计是否超预算」的可观测量。超预算不阻止投递。

五 不该动的四件事

既然规则段占去四成,最直觉的动作是「让整块稀疏一些」。这条路走不通,因为它会同时破掉四条已确立的纪律。

纪律现状若改「整块跳轮」的后果
规则段每轮无条件注入桶级豁免:limitOf('rules') 返回空,显式上限被忽略并留痕直接推翻该设计
白板与账本必须进精简版用户裁定:不进精简版,模型在两到五轮后就看不见自己该更新什么白板维护断链
水位提醒与收尾写账本两者都是完整版路径产生的段触发条件消失
Tier-0 的常驻指引目录层每轮在场是刻意设计:先读索引,再决定深入哪一页模型失去「有什么记忆」的常驻感知

收益也支撑不起这个代价:整块跳轮省下的不到一成。真正的成本大头是那两段必须在场的部分——它们不是可以优化的对象,而是这套系统的运行前提。

写在后面的话

「知止而后有定,定而后能静,静而后能安。」

这项测量始于一个很直觉的疑问:深夜无人值守时,这一轮明明什么也没发生,为什么还要送出将近两万字符?

量完之后,答案比预想的朴素:其中四成不是「这一轮的内容」,而是「这个系统的样子」。规则、索引、白板、账本——它们存在的前提就是每轮都在场。抽掉它们,省下的那点 token 远不足以弥补模型失去的方向感。

于是结论从「如何注得更少」变成了「哪些不能动」。文末那四条不值得动的,同时也是四条不能动的。这两者的重合不是巧合。

dsh-auto-memory 项目组 · 2026

相关报告