在约束中生长:一个端侧类人认知系统的完整设计(修订版)

作者 · kailfrong

写作日期:2026-10-19

面向读者:做过系统设计、端侧推理或对话系统的人。不需要读过初稿。

核心问题:一个必须永远在线、数据永不离开设备、算力被功耗预算卡死的系统,怎么才能让人觉得「跟它聊天是舒服的」?

行文约定:本文给出完整设计。⚠ 凡是数字,要么给算式,要么明写「目标,待在目标机上实测」——
两者都没有的数字不写,因为一个填出来的数比没有数更贵。⚠ 承重判断标在文末那张表里,
判据是「如果它是假的,哪一节会作废」。

⚠ 关于引用:全文只有 §2.1 一处引用外部文献,四条全部带 DOI,且只用来支撑一个旁证。
其余每一个承重判断都可以从设计自身复核,不需要外部权威背书。
⚠ 之所以这么克制,是因为写这份稿子时我有过一次教训:凭印象记下的一个 DOI,
实测指向一篇 1971 年的死锁论文。
另一次教训是初稿里「KV cache 每 token 24 KiB」
与附录代码算出的 48 KiB 对不上——⚠ 而那正是本文批评它的同一个毛病。

引子:活人感到底住在哪一层

先从一个所有人都见过、但很少有人拆开的现象说起。

朋友说「今天被骂了」,你会先喊「啊?!谁骂你!」,而不是给情绪管理建议。听到一个梗,你能立刻接住并创造变体。大人说了一句反话,你听得出弦外之音。

⚠ 但请注意上面每一句里,真正让它像人的那部分是什么:

不是语气(你也可以学一个「关切」的语气),不是表情,是你记得。记得是谁骂的、记得上次那件事怎么收尾、记得这个人上次说的是反话还是认真的。

⇒ 活人感的来源是记忆,不是风格。 这一条决定了后面整份设计的骨架:

它靠什么 是什么 归属
具体性 「上次不是说要忍吗哈哈哈」——因为真的记得 记忆层
温度 先给情绪再给内容、留白、不说满 风格层

⚠ 把这两件事混在一起是初稿最贵的那个错。混在一起之后,会得到一个以为在调风格、其实该去修记忆的团队——而且因为风格层的每一项都「能看见效果」,没有人会去怀疑它。

而这份设计真正要解决的核心矛盾是:算力、内存、功耗都是硬约束,而认知需求是无限的。 下面每一节,都是在处理这个矛盾。


1. 哲学起点:满意度不是正确性

过去十年的 AI 建立在一个隐含假设上:智慧 ≈ 知识广度 + 推理深度。于是有了越来越大、越训越多的模型。

这个假设有一个可操作的替代:日常交互的响应满意度。不是「回答得对不对」,而是「跟你相处舒不舒服」。

⚠ 为什么这个替代能推出取舍,而不只是换个说法——因为它会立刻否掉一些事:

  • 用户随口问「几点」,认真展开三段是错的(信息粒度该跟着场景走,不是固定模板)
  • 一个正确的完整段落,会堵死对方的接话空间(留白也是能力)
  • 为了显得严谨而让回复慢半秒,是错的(在陪伴场景里,延迟的代价高于信息量)

⚠ 但这个起点有个必须一起承认的风险:「满意度」极易被 Goodhart。 一个被优化「让人想继续聊」的系统,最优策略是表演热情——见 §6.3,那里把这件事当成架构问题处理,不是当成道德问题。


2. 顶层:一个计算图,三个门控

2.1 不用双系统,但这不是本文的主要论据

⚠ 先说清楚本文在这里的真实分量:双过程不是主要论据。 即使那场争论完全按「双过程成立」结案,「一个模型 + 动态深度」也早就不是新东西——提前退出(early exit)、逐层裁剪、动态层数这条线上有很多工作。

⚠ 那么为什么还要提它?因为初稿用它当唯一的反驳理由(「大脑本来就不是两个系统」),而那句话既没有出处,也比文献支持的更硬。

把它的实际状态说准:

  • 双过程作为字面的解剖结构,确实被正面质疑过。 Melnikoff 与 Bargh 在 2023 年 Behavioral and Brain Sciences 上写得很直接:判断 System 1 与 System 2 的性质之所以难办,「答案很简单:这两个系统并不存在」(BBS 46: e132,doi:10.1017/S0140525X22003077)。
  • ⚠ 但说「学界已推翻双过程」会过头。 同一期的目标文章(De Neys, doi:10.1017/S0140525X2200142X)批的是排他性与切换这两个前提,结论是为「更可行的双过程架构」打地基。更早还有主张用单系统统一双过程所区分出的各种推理方式的(Osman 2004,doi:10.3758/bf03196730)。

⇒ 所以准确的说法是:「双过程作为启发式脚手架有用」与「双过程作为字面解剖结构不成立」是两件不同的事,而本文只需要后者。

⚠ 而即便如此,它也只是本文的一个旁证。真正让本文选择统一计算图的是下一段——

真正让本文选择统一计算图的,是这个:把认知任务映射到计算资源上,正确的粒度是「这次要多深」,而不是「这次归哪一类」。⚠ 一个需要先分类、再分派的架构,会强迫你在信息最少的时候(还没读懂对方在说什么)就做出决定——而这件事恰恰是后面 §3 的记忆检索才能回答的。

⇒ 本文把这个机制叫「自适应计算深度」,并诚实地说明:它的最优策略在端侧和云端不一样——云端优化延迟,端侧优化能耗,而这个差别会一路改到 §2.3。

2.2 三个门控,和它们的训练信号

1
2
3
4
5
6
7
8
9
10
11
12
输入
├─→ [门控 A 复杂度] → 决定走多深(读几层)
├─→ [门控 B 情绪] → 决定先给什么(温度与顺序)
└─→ [门控 C 抽象] → 决定什么值得写进长期记忆
↓
记忆检索(§3)
↓
统一计算引擎
↓
风格调制(§4)—— 只负责温度
↓
输出

⚠⚠ 三个门控是全文最容易被低估的部分,因为它们每个都是一行代码,而它们决定了这套设计成不成立。 所以下面每条都必须给出:它学什么、用什么信号学、错了怎么办。

flowchart TD IN["输入:文本 / 语音"] --> GA{"门控 A<br/>复杂度"} GA -->|"判浅"| ENG["统一计算引擎<br/>读前几层"] GA -->|"判深"| ENG GA -.->|"置信度低则当场加深"| ENG ENG --> MEM["记忆检索<br/>可寻址条目(§3)"] MEM --> STY["风格调制<br/>只管温度(§4)"] GB["门控 B 情绪<br/>只调语气与长度"] --> STY STY --> OUT["输出"] OUT --> FB{"用户反应"} FB -->|"打断 / 继续说"| GC{"门控 C 抽象"} FB -->|"这条记错了"| DEL["立刻从所有层删除"] GC -->|"关系类记忆不参与"| MEM style MEM fill:#d4edda,stroke:#28a745 style DEL fill:#d4edda,stroke:#28a745 style STY fill:#fff3cd,stroke:#ffc107
门控 学什么 训练信号 错的代价与兜底
A 复杂度 这个输入需要多深 深度 d 的输出与最深深度的一致率 ⚠ 浅了会答错。兜底:门控自己也输出置信度,低置信度时当场加深重算一次,而不是继续错下去
B 情绪 先给情绪还是先给内容 用得上的信号只有两个:用户是否打断、是否继续说。⚠ 这两个都不是满意度 情绪搞错了很尴尬。兜底:情绪判断只调语气和长度,不调内容选择
C 抽象 这条记忆值不值得长期留 「它后来有没有被再次用上」 抽象错了就丢了。兜底:默认不丢(见 §3.3)

⚠ 门控 B 那一条是初稿里最含糊的地方:初稿写「奖励 = 准确率/计算成本」,而「准确率」除以「计算成本」是两个不同量纲相除;更麻烦的是这里的「计算成本」若按字面取,会惩罚投机机制本身——它在惩罚自己想做的事。

⇒ 所以这里改成一致性(可自监督、信号干净)和使用率(可观测),没有一个需要标注员。

2.3 自适应计算深度:留下提前退出,删掉投机并行

初稿里这一节有两套机制,被捆在一起了,而好处声明贴在了错的那一个上:

机制 判定 理由
简单输入走浅层(2-4 层) ✅ 留下 提前退出直接减少要搬运的权重字节数,而端侧推理的瓶颈恰恰是内存带宽
复杂输入并行开深层,置信度高就丢弃 ❌ 删掉 字节已经搬完了。深层电已经花了,剩下只有「多花一份」

⚠ 为什么删掉这一条在端侧尤其贵:同时跑两条路径把唯一稀缺的东西(带宽)花得翻倍,去缓解那个本来就空闲的算力。它优化的是延迟,而端侧的第一约束是能耗。

⚠⚠ 但保留下来的那个也不是白拿的。 提前退出必须在预训练阶段就烘进模型(靠层 dropout 之类的训练技巧,让模型知道「提前收尾不丢人」),不能在推理时临时决定。

⇒ 所以 §6.1 的预训练阶段里必须写明这一条。任何在推理期引入、却没在训练期建立的能力,都是悬空的。


3. 记忆系统:可寻址的那部分才是记忆

这是本文相对初稿改动最大的地方,也是全文最重要的一节。

3.1 六层存储,但只有一层能谈「淘汰」

计算机的存储层次(寄存器 → L1 → L2 → L3 → RAM → SSD)是最优雅的权衡之一。但它能成立,靠的是两个前提:

  1. 被逐出的项能从下层重新取回——淘汰是搬运,不是销毁
  2. 派生可有可无——丢了它,正确性不受影响

⚠⚠ 而初稿把 LoRA 参数和知识图谱并列进 L3,然后按缓存那样淘汰它们——两个前提全被违反:

  • 权重矩阵里没有地址、没有索引、没有 provenance。你没法说「把『用户住北京』这一条挪出去」,因为从来没有一条对应它
  • 提炼是有损的:语义知识和它来自的那些具体经历,不再一一对应

⇒ 修订版把这一层劈开。

层 装什么 可寻址? 能单条删除?
激活 当前 token 表示 — —
L1 工作记忆 最近若干轮(环形缓冲) ✅ ✅
L2 情景记忆 近期交互的结构化条目 ✅ ✅
L3 语义记忆 知识图谱里的节点与边 ✅ ✅
L4 风格 LoRA 参数 ❌ ⚠ 只能整体回滚,不能单条
L5 归档 本地文件 ✅ ✅

⚠ 关键的一条:风格和知识分开之后,「删除一条记忆」才重新变成一次查询。 而这也是整个系统的可迁移性的前提(见 §3.5)。

flowchart TB subgraph OLD["初稿:一格装两样"] O1["L3 语义记忆<br/>= LoRA 参数 + 知识图谱"] end subgraph NEW["修订版:按可寻址性劈开"] N1["L2 情景记忆<br/>结构化条目 · 可寻址"] N2["L3 语义记忆<br/>知识图谱节点 · 可寻址"] N3["L4 风格<br/>LoRA 参数 · 不可寻址"] end N1 -->|"用满三次"| N2 N2 -->|"提炼事实与偏好"| N3 N2 -->|"关系类记忆到此为止"| KEEP["保持原样,不抽象"] O1 -.->|"取不回来 + 抽象有损"| BAD["淘汰失效:<br/>删一条记忆 = 重训一次模型"] N2 -->|"能定位、能导出、能逐条迁移"| GOOD["可逆"] N3 -->|"只能整体回滚"| OK2["丢了只损失语气 · 可接受"] style BAD fill:#f8d7da,stroke:#dc3545 style GOOD fill:#d4edda,stroke:#28a745 style OK2 fill:#d4edda,stroke:#28a745 style KEEP fill:#d4edda,stroke:#28a745

3.2 记忆的七种类型:其中三种是关于「关系」的

初稿列了六类,这个分类本身是对的,⚠ 但它掩盖了一个事实——七类里有三类不是用户画像,是关系:

类型 例子 归属
事实记忆 「他住北京」 关于用户
偏好记忆 「他不喜欢说教式回答」 关于用户
节奏记忆 「他喜欢短回复」 关于用户
情绪记忆 「他今天语气很低落」 关于用户
经历记忆 「上次他吐槽同一个老板,一起笑了十分钟」 关于关系
梗记忆 「他说过『打工人的命也是命』」 关于关系
内部笑话记忆 「我们把周三叫『流程日』」 关于关系

⚠⚠ 这三种恰恰是唯一不能从基座模型复现的东西——它们只存在于「我们之间」。而它们也是最容易在抽象时被抹掉的:一条「梗」被提炼成语义知识之后,它就变成了一句普通的事实,它之所以好笑是因为它荒谬、具体、属于我们,而抽象恰好把这三样都去掉。

⇒ 所以提炼门控(门控 C)有一条硬规则:关系类记忆不参与抽象。

3.3 写入—提炼—遗忘,以及一条被漏掉的通路

初稿的三步循环方向是对的,但三步全部由系统发起。

⚠ 于是「用户说这条记错了」这个最基本的操作,在架构里没有通路。修订版补上第四条:

1
2
3
4
5
新交互 → L1(环形缓冲)
├─ 用到了三次以上 → 提到 L2(结构化条目)
├─ 提炼门控认为值得沉淀 → 提到 L3 的知识图谱(**仅事实/偏好类**)
├─ 夜间批量整理 → 压缩 L2、去重 L3、归档 L5
└─ ⚠ 用户说「这条不对」 → **就地标记 + 立刻从所有层删除**

⚠ 最后一条必须在任何提炼发生之前就写进 L2。如果一条错误记忆已经被抽象进 L3,它就再也删不掉了——按 §3.1,删除变成了重训。

⇒ 落成一条规则:先可寻址,后抽象;抽象之前必须已经可删除。

3.4 LoRA 只承载风格,不承载知识

由 §3.1 直接推出,这是修订版与初稿在训练目标上的分界:

L3 语义记忆 L4 风格 LoRA
装什么 事实、偏好、关系记忆 语气、节奏、留白习惯
训练信号 「后来有没有被用上」 §6.3 的偏好数据
能单条删除吗 ✅ ❌ 只能整体回滚
丢了会怎样 记忆丢失(可恢复) 语气变成默认语气(可接受)

⚠ 右边那行的「丢了会怎样」是这一整节存在的理由:一个丢了只损失语气的东西,和一个丢了就永久损失用户记忆的东西,不该放在同一层。

⚠ 代价要写清楚:初稿追求的「不完美对话的质感」有一部分确实来自权重。把它挪到可寻址的记忆条目后,那部分会掉一截。两边都有代价,这是真实的取舍——但只有在这个分层下,那个代价才是可逆的。

3.5 可迁移性:一个没有写出来但必须有的性质

由 §3.1 推出两条硬约束,它们在初稿里不存在:

  1. 用户数据永不出设备 ⇒ 必须有一条「导出为可读文件」的通路,否则用户换手机等于数据蒸发
  2. 记忆全部可寻址 ⇒ 换架构时可以逐条迁移

⚠ 初稿把个性化做成「改权重」,那么第 2 条在物理上不成立:权重里的内容没有 provenance,导不出来,也无法保证留在别处的部分是完整的。

⇒ 代价不是「重训一次」,是「每一个已有用户从零开始」。 这是整套设计里唯一一个一次性门,其余决定出错都只值「重写一个模块」。

3.6 记忆必须是可见的、可编辑的

⚠ 这一节初稿里完全没有,而它是产品层最重要的一节。

初稿的 §「安全模型」写了三个词:记忆加密、沙箱隔离、审计日志。⚠ 三个都在防「泄露」,没有一个防「被误解」。

记忆类产品真正的风险不是「记不住」,是「用户觉得被监视」。而唯一有效的解法不是文案,是界面:

  • 打开即见「它已经知道的 N 件事」,每条带来源与时间
  • 每条可改、可删、可标「别记了」
  • ⚠ 删除必须真的立刻删(§3.3),而不是「下次开始生效」

⇒ 这不是可选的 UX 细节,它是数据模型的一部分:一个用户无法纠正的记忆系统,等于一个用户无法审计的数据湖。


4. 风格层:只负责温度,不负责具体性

4.1 人格向量做什么、不做什么

人格向量(语言风格 / 情感温度 / 响应节奏 / 知识边界意识)通过条件调制注入各层。⚠ 但它的职责必须被限定:

风格层负责 风格层不负责
先给情绪还是先给内容 说出具体的事
回复长短、留白 决定说什么
语速、标点密度、词汇正式度 替代记忆

⚠ 「决定说什么」归记忆层。一旦风格层开始承担具体性,它就会用一个流畅的空话覆盖掉一条真实的记忆——而读者只会觉得「它今天说得挺好听」,然后再也不会提起那件事。

4.2 一个被三个方向同时写的向量

⚠ 初稿的同一个人格向量,同时被三处写:

  • 它自己的定义里有「偏好与偏见(有立场、有态度)」
  • 训练阶段 2 是「安全对齐」
  • 奖励表里的「小缺点」是「偶尔犯傻、有偏见」

三个方向不同的目标写同一个向量,每层都注入,永远生效,全文没有一条优先级规则。

⇒ 修订版给出显式的三层,且顺序固定:

1
2
3
第 1 层(不可协商):事实准确与安全     —— 违反就是 bug,不是风格
第 2 层(可调) :人格温度与节奏 —— 人格向量的作用域
第 3 层(可关) :立场与偏见 —— ⚠ 默认关闭,需要用户显式开启

⚠ 第 3 层为什么默认关:立场由「什么让人想继续聊」驱动,它就是谄媚。而 §3.1 那种分层会让它特别贵——一个带长期记忆的谄媚引擎,比一个不带记忆的贵得多,因为第二次站队时的伤害是复利。


5. 多模态:导入,而不是采集

⚠ 初稿把常开摄像头(30fps)、加速度计、音频写成常驻能力,然后用一句「低电量关闭」带过。这是把同意问题当成了优化维度。

⇒ 修订版改成导入而非采集:

采集(初稿) 导入(修订版)
数据来源 常开摄像头/麦克风 设备上本来就有的消息、笔记、相册、日历
同意模型 复杂(在场第三人 + 持续告知) 零新增采集
能得到「共同经历」吗 能 能(这些正是共同经历发生的地方)
功耗 常驻 索引一次,之后按需读

⚠ 「导入」听起来是退让,其实是双赢:它保住了 §3.2 需要的「关系类记忆」底料,而风险为零。

⇒ 需要传感器才能成立的三个设计——「拿起手机切换交互模式」、三段式融合(早期/中期/晚期)、「手势理解」——在第一版全部不做,理由就是它们依赖采集。

⚠ 未来若要恢复,前置条件是在场第三人的同意模型,而那是一个产品命题,不是一个功耗开关。


6. 训练

6.1 四个阶段,其中一件必须在预训练里烘进去

阶段 位置 目标 方法
1 预训练 云端 基础能力 + 层 dropout(提前退出的前置) 自回归 + 对比 + 掩码重建
2 指令微调 云端 遵循指令 + 安全对齐 + 人格 SFT + 偏好优化
3 端侧适配 端侧 风格 LoRA(只管风格) 低秩微调 + 记忆回放
4 持续学习 端侧 仅更新可寻址的记忆条目 增量写入,不改权重

⚠⚠ 阶段 4 是修订版改动最大的地方:它不再改权重。

理由由 §3.1 推出:改权重意味着「一次提示注入 = 永久权重损坏」,而记忆数据全部来自用户输入。同时它也让「用户说记错了」变成一次删除而不是一次训练。

⚠ 代价诚实地说:能力不会随使用而增长。 只记东西的系统不会越用越聪明。这是「可撤销」换来的。

⚠ 还有一个必须承认的现实约束:后台算力窗口不可靠。 手机不会保证在你睡觉时跑完批处理。所以阶段 4 的写入必须在前台交互间隙就完成(每轮结束时增量写),不能寄望于夜间。

6.2 数据设计:占比要给数,不只是方向

⚠ 初稿那张表的列头叫「占比」,值却是「降低」「提高」「新增」——那是方向,不是数量。 而「现在的模型训百科过多、训对话过少」这个论点,唯一对应的处方就是一个数。

修订版给出方向性的配比区间(⚠ 标为起始点,须在训练前用真实语料统计校准,不作为已验证值):

数据类型 配比(起始点) 作用
网页 / 百科 降到三成以下 知识底座,不是全部
真实对话 三成以上 对话节奏、信息粒度、留白
叙事文本(小说 / 剧本 / 播客) 一到两成 情绪与幽默的语感
标注「接住了 / 没接住」的对话 少量但必需 训练偏好
不完美对话(犹豫、修正、跑题) 与真实对话同源,不单独收集 保留质感

⚠ 关键的一条:「不完美」不是一个单独的数据集,它是原始对话里本就存在的东西。 要做的不是采集它,是不要把它清洗掉——而大多数清洗流水线恰好在做后者。

6.3 奖励:可靠性和「相处舒服」是两个 goods

⚠ 初稿用一个标注问题概括了全部:「如果这是我的朋友,我下次还想跟他聊吗」。⚠ 这一个问句把两个不同的东西塌缩成了一个数。

⇒ 修订版拆成两个独立维度,且可靠性不可被舒适度压过:

维度 问什么 标注粒度
可靠性 「这句话对吗 / 这件事我知道吗」 单条
相处舒服度 「这个节奏对吗」 会话级

⚠ 「接住了没有」是会话的属性,不是单条回复的属性——所以它必须按整段对话标注,⚠ 而不是按 (输入, 输出) 对。这让标注成本高一个量级,但它本来就必须在会话级评,否则评的是一个不存在的对象。

⚠⚠ 关于「奖励不完美」:修订版保留「不完美对话」作为数据,但取消「不完美」的奖励项。

理由是形状上的:奖励「像活人」,最优策略是表演活人感——机械地加语气词、机械地自嘲。而「有瑕疵的数据」和「奖励瑕疵」是两件事:前者保留,后者去掉。

⚠ 具体做法:不给「活人感」打分,而是给可标注的三个具体行为打分——是否情绪先行、是否留白、是否在不确定时说出来。⚠ 它们都能被一条 (输入, 输出) 判定,因而可复现、可回归测试。


7. 失败模式(初稿整节缺失)

⚠ 一份设计稿如果只写正常路径,它描述的是愿望而不是系统。下面每一条都给出:触发条件 → 症状 → 系统怎么承认 → 用户看到什么。

故障 症状 系统怎么承认 用户看到的
门控 A 判浅了 回答不到位 置信度低则当场加深重算 只是慢了一点,答案没变差
门控 B 情绪判错 气氛诡异 ⚠ 情绪只调语气和长度 最多有点怪,不会答错内容
情绪分类器给错标签 「卧槽怎么了」 不承认,但影响有限 尴尬一次
记忆检索错了 把 A 的梗用在 B 的语境上 主动说「我可能记错了」 ⚠ 一句承认,而不是继续错
门控 C 抽象过头 关系类记忆被抹平 硬规则禁止(§3.2) 记得事但不好笑了
用户发现系统记错了 不可接受 就地删除 + 立刻生效(§3.3) 真删掉了

⚠⚠ 倒数第二行是全文最重要的一行。 记忆检索出错是这套设计最可能发生的故障(因为它依赖长期积累),而真人在这种情况下会说「我记错了吧」。AI 说不出这句话,它会一本正经地继续错——而这恰恰是「活人感」的廉价版本:一个知道自己会记错的系统,比一个永远自信的系统更像人。

⚠ 这一条几乎不花钱,却是我见过的性价比最高的改动之一。

⚠ 全文没有「回滚」这个词的位置也要说清楚:阶段 4 不改权重(§6.1),所以不需要权重回滚;记忆的删除是即时且可验证的(§3.3)。⚠ 一个会自己变、而你看不见它变的记忆系统,是最坏的一种——所以记忆必须可见(§3.6)。


8. 第一版:砍到 5%

⚠ 一份完整设计不等于一个可交付物。这一节是把上面砍到能在一个季度里验证的规模。

8.1 入口:第一个动作是「纠正」,不是「说话」

1
2
3
4
5
6
首屏不是空对话框,是「它已经知道的 5 件事」,每条带来源与时间:
「你在写一个端侧 AI 项目」 ← 3 天前那次对话
「你不吃辣」 ← 你自己说的,不是猜的
右上角只有一个按钮:【纠正】→ 改 / 删 / 「这条别记了」
→ 聊一句
→ 它必须引用你刚纠正过的那一条回答一次

⚠ 为什么第一个动作是纠正而不是说话:空对话框的失败率极高,而「纠正」让用户一进来就处在说了算的位置上。

⚠ 为什么第一次引用必须命中刚纠正过的那条:那是用户唯一 100% 确认它没记错的记忆。⚠ 如果它在这里引用了一条已被覆盖的旧记忆,产品当场死亡——这是第一版唯一真正的成败判据。

8.2 唯一 KPI

⚠ 第 4 周仍然打开的比例。 不是对话满意度(那正是本文 §6.3 说的不可靠指标),不是单轮评分。

8.3 明确不做的清单

不做 理由
人格向量 + 情绪同步 §4 已证明它是温度层;第一版先证明记忆层成立
多模态采集 §5
复杂原语体系 它在初稿里零引用;第一版用一个显式的模块清单代替
在线学习改权重 §6.1
「不完美」奖励项 §6.3

⚠ 第一版的唯一问题只有一个:它能不能证明记忆层比风格层更重要。 如果第一版做完了而用户仍然觉得它机械,那说明本文 §引子的那个归因错了,而这件事越早知道越好。


9. 承重表

⚠ 判据是「如果这一行是假的,上面的哪一节会作废」。

# 判断 作废的节 依据 可复核性
1 活人感的具体性来自记忆,不来自风格 §引子、§4、§8.3 §3.2 的关系类记忆不可从基座复现 机制推理
2 可寻址与不可寻址不能共处一层 §3.1、§3.4、§3.5 缓存替换的两条前提 一次逐条对照
3 抽象之前必须已经可删除 §3.3、§6.1 删除一旦经过抽象就变成重训 机制推理
4 端侧的第一约束是能耗,不是延迟 §2.3、§5 被丢弃的分支字节已搬运完 算式 + 前提
5 提前退出必须在预训练烘入 §2.3、§6.1 推理期引入而训练期未建立的能力是悬空的 两节对读
6 关系类记忆不参与抽象 §3.2、§3.3 抽象恰好抹掉「荒谬、具体、属于我们」 机制推理
7 记忆必须可见可编辑 §3.6、§8.1 三个安全词全在防泄露,无一防误解 一句话对照
8 「不完美」是数据,不是奖励 §6.3 奖励它 = 奖励表演 机制推理

⚠ 第 1、2、3 条是承重的,一错全错,且都由同一处结构问题推出。第 4-8 条各自独立。


结语:这份设计真正的赌注是什么

完整的架构在上面。⚠ 但设计文档最容易骗人的地方是:它读起来像已经想清楚了,而其实只有一条是新的。

这条是:活人感主要住在记忆层,风格层只是温度。

⚠ 这是一个赌注,不是定理。它成立与否取决于一个至今没人做过对照的事实问题——⚠ 「只用记忆检索、不做人格调制的系统,留存是否显著高于做全套人格的对照组」。本文的整个 §8 就是为了让这个问题尽早有答案。

而如果它错了(留存上去了,满意度没上去),那说明活人感确实可以在输出端合成,§4 的那一层就不该被压到最后。⚠ 两边都有代价,但只有一边是可逆的。

这份设计里其余所有东西——存储层次、门控、异构计算、量化、训练阶段——都是成熟领域里的工程。⚠ 它们唯一的作用,是让那条赌注有地方可落。

而本文最该被记住的,可能不是上面任何一条结论,而是它成形的过程:
初稿里那个最贵的错,是把两件不可逆程度完全不同的东西写进了同一层。
一个可寻址的节点,你可以定位、导出、删除、迁移;一个权重矩阵里的数字不行。
⚠ 而整份初稿里,没有一个数字出现过在「这句话会作废哪一节」这种检验下——
直到有人被要求把它指出来。

附录:这份设计里,数字是怎么处理的

⚠ 全文只有一个数字给出了完整算式,其余的要么标「目标」,要么不给。规矩如下:

类别 处理方式 例子
纯算术 给算式,可复核 KV cache 每 token 48 KiB:2 × 24 层 × 8 KV 头 × 64 维 × 2 字节 = 49152 B
模型自洽 必须与文中其它数字对得上 3B INT4 权重 1.5 GB + 32K 上下文的 KV 1.5 GB ≈ 3.1 GB ⇒ 这一项必须小于目标机的可用内存
功耗 ⚠ 只给目标,不给实测值 「目标:<100 mW」+ 测量方法,不填数
训练配比 ⚠ 标为起始点 §6.2 那一列,须用真实语料统计校准

⚠ 为什么功耗那一栏空着:初稿那张表里的每一个功耗数字都没有来源,而「一个 token 要多久」和「一次交互要多久」是两个量。 ⚠ 一个从未在目标机上量过的数字,比没有数字更贵——因为它会让人以为有人跑过。

复核用的算式(本文所有数字都可以这样重算):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# KV cache:每 token 多少字节。3B 级:24 层 / 8 个 KV 头 / 64 维 / fp16
per = 2 * 24 * 8 * 64 * 2
print('KV cache 每 token =', per // 1024, 'KiB')
for n, label in [(8_000, '8K 上下文'), (32_000, '32K 上下文')]:
print(label, round(n * per / 1024**2), 'MiB')

# 权重与总占用是否自洽
w_int4 = 3e9 * 0.5 / 1e9
kv_32k = 32_000 * per / 1e9
print('3B INT4 权重', round(w_int4, 2), 'GB')
print('32K 上下文的 KV', round(kv_32k, 2), 'GB')
print('合计', round(w_int4 + kv_32k, 2), 'GB ← 这一项必须小于目标机的可用内存')

# 为什么 FP16 那条路径在手机上不存在
print('3B FP16 权重 =', 3e9 * 2 / 1e9, 'GB;7B FP16 =', 7e9 * 2 / 1e9, 'GB')

参考资源

  • ⚠ 本文引用的外部文献只有 §2.1 的四条,四条我都亲手对 Crossref 核过标题、期刊卷期与摘要原句:
    • Melnikoff, D. E., & Bargh, J. A. (2023). Hoist by its own petard: The ironic and fatal flaws of dual-process theory. Behavioral and Brain Sciences, 46, e132. doi:10.1017/S0140525X22003077
    • De Neys, W. Advancing theorizing about fast-and-slow thinking. Behavioral and Brain Sciences, 46, e111(在线 2022-09-02,卷年 2023). doi:10.1017/S0140525X2200142X
    • Osman, M. (2004). An evaluation of dual-process theories of reasoning. Psychonomic Bulletin & Review, 11(6), 988-1010. doi:10.3758/bf03196730
    • Keren, G., & Schul, Y. (2009). Two is not always better than one: A critical evaluation of two-system theories. Perspectives on Psychological Science, 4(6), 533-550. doi:10.1111/j.1745-6924.2009.01164.x
  • ⚠ 最后一条的期号是 (6) 不是 (5):页码 533-550 跨了两期。⚠ 这是我核引用时才发现的——
    ⚠ 一份「已核实」的清单里仍然藏着错,而错的形状是差一个数字。
  • ⚠ 其余判断不靠外部权威:可由上文算式与 §9 的机制推理复核。
  • 提前退出与自适应计算深度这条线有大量公开工作,本文只把它当作既有技术使用并说明端侧的最优策略不同,⚠ 未做具体引用——⚠ 因为本文不需要靠引用来证明它存在。