在约束中生长:一个端侧类人认知系统的完整设计(修订版)
写作日期: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 | 输入 |
⚠⚠ 三个门控是全文最容易被低估的部分,因为它们每个都是一行代码,而它们决定了这套设计成不成立。 所以下面每条都必须给出:它学什么、用什么信号学、错了怎么办。
| 门控 | 学什么 | 训练信号 | 错的代价与兜底 |
|---|---|---|---|
| A 复杂度 | 这个输入需要多深 | 深度 d 的输出与最深深度的一致率 | ⚠ 浅了会答错。兜底:门控自己也输出置信度,低置信度时当场加深重算一次,而不是继续错下去 |
| B 情绪 | 先给情绪还是先给内容 | 用得上的信号只有两个:用户是否打断、是否继续说。⚠ 这两个都不是满意度 | 情绪搞错了很尴尬。兜底:情绪判断只调语气和长度,不调内容选择 |
| C 抽象 | 这条记忆值不值得长期留 | 「它后来有没有被再次用上」 | 抽象错了就丢了。兜底:默认不丢(见 §3.3) |
⚠ 门控 B 那一条是初稿里最含糊的地方:初稿写「奖励 = 准确率/计算成本」,而「准确率」除以「计算成本」是两个不同量纲相除;更麻烦的是这里的「计算成本」若按字面取,会惩罚投机机制本身——它在惩罚自己想做的事。
⇒ 所以这里改成一致性(可自监督、信号干净)和使用率(可观测),没有一个需要标注员。
2.3 自适应计算深度:留下提前退出,删掉投机并行
初稿里这一节有两套机制,被捆在一起了,而好处声明贴在了错的那一个上:
| 机制 | 判定 | 理由 |
|---|---|---|
| 简单输入走浅层(2-4 层) | ✅ 留下 | 提前退出直接减少要搬运的权重字节数,而端侧推理的瓶颈恰恰是内存带宽 |
| 复杂输入并行开深层,置信度高就丢弃 | ❌ 删掉 | 字节已经搬完了。深层电已经花了,剩下只有「多花一份」 |
⚠ 为什么删掉这一条在端侧尤其贵:同时跑两条路径把唯一稀缺的东西(带宽)花得翻倍,去缓解那个本来就空闲的算力。它优化的是延迟,而端侧的第一约束是能耗。
⚠⚠ 但保留下来的那个也不是白拿的。 提前退出必须在预训练阶段就烘进模型(靠层 dropout 之类的训练技巧,让模型知道「提前收尾不丢人」),不能在推理时临时决定。
⇒ 所以 §6.1 的预训练阶段里必须写明这一条。任何在推理期引入、却没在训练期建立的能力,都是悬空的。
3. 记忆系统:可寻址的那部分才是记忆
这是本文相对初稿改动最大的地方,也是全文最重要的一节。
3.1 六层存储,但只有一层能谈「淘汰」
计算机的存储层次(寄存器 → L1 → L2 → L3 → RAM → SSD)是最优雅的权衡之一。但它能成立,靠的是两个前提:
- 被逐出的项能从下层重新取回——淘汰是搬运,不是销毁
- 派生可有可无——丢了它,正确性不受影响
⚠⚠ 而初稿把 LoRA 参数和知识图谱并列进 L3,然后按缓存那样淘汰它们——两个前提全被违反:
- 权重矩阵里没有地址、没有索引、没有 provenance。你没法说「把『用户住北京』这一条挪出去」,因为从来没有一条对应它
- 提炼是有损的:语义知识和它来自的那些具体经历,不再一一对应
⇒ 修订版把这一层劈开。
| 层 | 装什么 | 可寻址? | 能单条删除? |
|---|---|---|---|
| 激活 | 当前 token 表示 | — | — |
| L1 工作记忆 | 最近若干轮(环形缓冲) | ✅ | ✅ |
| L2 情景记忆 | 近期交互的结构化条目 | ✅ | ✅ |
| L3 语义记忆 | 知识图谱里的节点与边 | ✅ | ✅ |
| L4 风格 | LoRA 参数 | ❌ | ⚠ 只能整体回滚,不能单条 |
| L5 归档 | 本地文件 | ✅ | ✅ |
⚠ 关键的一条:风格和知识分开之后,「删除一条记忆」才重新变成一次查询。 而这也是整个系统的可迁移性的前提(见 §3.5)。
3.2 记忆的七种类型:其中三种是关于「关系」的
初稿列了六类,这个分类本身是对的,⚠ 但它掩盖了一个事实——七类里有三类不是用户画像,是关系:
| 类型 | 例子 | 归属 |
|---|---|---|
| 事实记忆 | 「他住北京」 | 关于用户 |
| 偏好记忆 | 「他不喜欢说教式回答」 | 关于用户 |
| 节奏记忆 | 「他喜欢短回复」 | 关于用户 |
| 情绪记忆 | 「他今天语气很低落」 | 关于用户 |
| 经历记忆 | 「上次他吐槽同一个老板,一起笑了十分钟」 | 关于关系 |
| 梗记忆 | 「他说过『打工人的命也是命』」 | 关于关系 |
| 内部笑话记忆 | 「我们把周三叫『流程日』」 | 关于关系 |
⚠⚠ 这三种恰恰是唯一不能从基座模型复现的东西——它们只存在于「我们之间」。而它们也是最容易在抽象时被抹掉的:一条「梗」被提炼成语义知识之后,它就变成了一句普通的事实,它之所以好笑是因为它荒谬、具体、属于我们,而抽象恰好把这三样都去掉。
⇒ 所以提炼门控(门控 C)有一条硬规则:关系类记忆不参与抽象。
3.3 写入—提炼—遗忘,以及一条被漏掉的通路
初稿的三步循环方向是对的,但三步全部由系统发起。
⚠ 于是「用户说这条记错了」这个最基本的操作,在架构里没有通路。修订版补上第四条:
1 | 新交互 → L1(环形缓冲) |
⚠ 最后一条必须在任何提炼发生之前就写进 L2。如果一条错误记忆已经被抽象进 L3,它就再也删不掉了——按 §3.1,删除变成了重训。
⇒ 落成一条规则:先可寻址,后抽象;抽象之前必须已经可删除。
3.4 LoRA 只承载风格,不承载知识
由 §3.1 直接推出,这是修订版与初稿在训练目标上的分界:
| L3 语义记忆 | L4 风格 LoRA | |
|---|---|---|
| 装什么 | 事实、偏好、关系记忆 | 语气、节奏、留白习惯 |
| 训练信号 | 「后来有没有被用上」 | §6.3 的偏好数据 |
| 能单条删除吗 | ✅ | ❌ 只能整体回滚 |
| 丢了会怎样 | 记忆丢失(可恢复) | 语气变成默认语气(可接受) |
⚠ 右边那行的「丢了会怎样」是这一整节存在的理由:一个丢了只损失语气的东西,和一个丢了就永久损失用户记忆的东西,不该放在同一层。
⚠ 代价要写清楚:初稿追求的「不完美对话的质感」有一部分确实来自权重。把它挪到可寻址的记忆条目后,那部分会掉一截。两边都有代价,这是真实的取舍——但只有在这个分层下,那个代价才是可逆的。
3.5 可迁移性:一个没有写出来但必须有的性质
由 §3.1 推出两条硬约束,它们在初稿里不存在:
- 用户数据永不出设备 ⇒ 必须有一条「导出为可读文件」的通路,否则用户换手机等于数据蒸发
- 记忆全部可寻址 ⇒ 换架构时可以逐条迁移
⚠ 初稿把个性化做成「改权重」,那么第 2 条在物理上不成立:权重里的内容没有 provenance,导不出来,也无法保证留在别处的部分是完整的。
⇒ 代价不是「重训一次」,是「每一个已有用户从零开始」。 这是整套设计里唯一一个一次性门,其余决定出错都只值「重写一个模块」。
3.6 记忆必须是可见的、可编辑的
⚠ 这一节初稿里完全没有,而它是产品层最重要的一节。
初稿的 §「安全模型」写了三个词:记忆加密、沙箱隔离、审计日志。⚠ 三个都在防「泄露」,没有一个防「被误解」。
记忆类产品真正的风险不是「记不住」,是「用户觉得被监视」。而唯一有效的解法不是文案,是界面:
- 打开即见「它已经知道的 N 件事」,每条带来源与时间
- 每条可改、可删、可标「别记了」
- ⚠ 删除必须真的立刻删(§3.3),而不是「下次开始生效」
⇒ 这不是可选的 UX 细节,它是数据模型的一部分:一个用户无法纠正的记忆系统,等于一个用户无法审计的数据湖。
4. 风格层:只负责温度,不负责具体性
4.1 人格向量做什么、不做什么
人格向量(语言风格 / 情感温度 / 响应节奏 / 知识边界意识)通过条件调制注入各层。⚠ 但它的职责必须被限定:
| 风格层负责 | 风格层不负责 |
|---|---|
| 先给情绪还是先给内容 | 说出具体的事 |
| 回复长短、留白 | 决定说什么 |
| 语速、标点密度、词汇正式度 | 替代记忆 |
⚠ 「决定说什么」归记忆层。一旦风格层开始承担具体性,它就会用一个流畅的空话覆盖掉一条真实的记忆——而读者只会觉得「它今天说得挺好听」,然后再也不会提起那件事。
4.2 一个被三个方向同时写的向量
⚠ 初稿的同一个人格向量,同时被三处写:
- 它自己的定义里有「偏好与偏见(有立场、有态度)」
- 训练阶段 2 是「安全对齐」
- 奖励表里的「小缺点」是「偶尔犯傻、有偏见」
三个方向不同的目标写同一个向量,每层都注入,永远生效,全文没有一条优先级规则。
⇒ 修订版给出显式的三层,且顺序固定:
1 | 第 1 层(不可协商):事实准确与安全 —— 违反就是 bug,不是风格 |
⚠ 第 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 | 首屏不是空对话框,是「它已经知道的 5 件事」,每条带来源与时间: |
⚠ 为什么第一个动作是纠正而不是说话:空对话框的失败率极高,而「纠正」让用户一进来就处在说了算的位置上。
⚠ 为什么第一次引用必须命中刚纠正过的那条:那是用户唯一 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 | # KV cache:每 token 多少字节。3B 级:24 层 / 8 个 KV 头 / 64 维 / fp16 |
参考资源
- ⚠ 本文引用的外部文献只有 §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 的机制推理复核。
- 提前退出与自适应计算深度这条线有大量公开工作,本文只把它当作既有技术使用并说明端侧的最优策略不同,⚠ 未做具体引用——⚠ 因为本文不需要靠引用来证明它存在。