Tommy

继续构思小暖的内部言语

Inner Speech for Xiaonuan

· 16 min read
···阅读reads

继续构思小暖的内部言语

——为什么”回话前先想一想”是错的

引子:一秒半

老人坐在沙发上,问了一句什么。

从他闭上嘴,到小暖发出第一个音,允许经过多长时间?

我在 LiveKit 在语音陪伴 AI 中的深水区 里给自己划过一条红线:端到端首字 1.5 秒。这不是产品经理拍脑袋定的,是人对沉默的忍耐阈值。超过它,对面那个人的身体会先于意识做出反应——他会重复一遍,或者把音量提高,或者,更糟糕的,他会以为自己说错了话。

而老人场景更难。为了不打断他们本就慢的语速,endpointing 得放到 800 到 1200 毫秒。也就是说,从他说完到系统确认”他说完了”,一秒钟已经过去了。留给”思考”的预算,接近于零。

另一边,我在 让机器照顾一个人 里给”它在想事情”下过一个判据:不以输出为目的的表征活动,且改变后续的行为倾向。 分水岭那一条我写得很重——在没有任何人提问时也在进行。

这两个约束互相拉扯。语音要求近乎反射,思想要求时间。整篇文章就是在处理这一个矛盾。

直觉方案是”回话前先想一想”。这个方案已经被我自己的数据否掉过两次。它不只是慢,它还更差。

所以真正的设计问题不是”怎么让它想得更多”,而是:怎么把内语从回话路径上彻底移开,同时让它真的改变这台机器。

一、被自己的实验否掉两次

一、被自己的实验否掉两次

先说数据,因为它决定了后面所有的架构选择。

内语引擎(ISE) 那套东西,我做过一个消融:把四阶段的自我对话(提问、论证、盘问、决断)拆成四次模型调用串起来,叫 ISE-Full;和把这四种认知功能写进同一个 prompt、一次调用完成的 ISE-Internalized,做对比。

结果是 0.907 对 0.855。内化的那版更准。

原因不神秘:每一次阶段之间的序列化,都是一次不可逆的有损压缩。你把上一阶段的思考塞进一段文本,交给下一阶段,中间丢掉的东西再也回不来。流水线看起来更”严谨”,实际上是在每个接缝处漏水。

第二个结果更刺人。在”该不该行动”这类需要弃权的判断上,Self-Refine 风格的自我反思,假阳性率高达 33% 到 37%,比什么都不加的直接提问还差。

机制我后来想明白了:“批评”这个语法本身,强制模型生成反方理由。 你要求它挑刺,它就必须造出刺来。然后它读到了自己刚刚生成的反方理由,把自己说服了。

这不是模型笨,这是反思这个动作的结构性副作用。人身上也有——把一个本来做得很顺的动作拿出来审视,往往就做不成了。德雷福斯讲专家的”熟练应对”(absorbed coping)时说,高手在场上不审议,一审议就慢,一慢就错。审议不是智慧的同义词。

还有第三条,来自同一批实验:把一个 0 到 1 的严重性标量从一个阶段传给下一个阶段,F1 直接掉 0.044。换成结构化的定性总结,0.857 回到 0.901。数字有一种虚假的权威,模型看到 severity: 0.78 会锚定在它上面,而这个 0.78 本身是它自己瞎编的。

三条发现,翻译成三条硬约束:

发现数据约束
内化优于拆分ISE-Internalized 0.907 vs ISE-Full 0.855内语是单次调用,四种功能封装在一个 prompt 里,不做四段流水线
严重性锚定传标量 −0.044;改定性总结 0.857 → 0.901内语的输出一律禁止标量。没有 confidence: 0.78,没有 urgency: 0.9
自我反思悖论Self-Refine 风格 FPR 33–37%,低于直接提问内语禁止修改已经做出的判断。它只能写未来的先验,不能回头重审刚才那一轮

第三条是整个架构的安全阀,值得单独说清楚。

允许一个系统改写过去,等于允许它自我说服。但只允许它改写未来,说服的代价就被摊薄进长期行为里,并且会被现实持续证伪——明天那个人会用他的反应告诉你,你昨晚想的对不对。

把反思从”重审判决”改成”调整偏见”,它就从一个危险的操作变成了一个安全的操作。

二、一句话的答案

内部言语不在回话的路径上。回话必须近乎反射;内语跑在另一个时钟上,它不产出话,只改写下一次回话的先验。

两者之间传递的不是”建议”,是倾向

这里有一个区分,我认为是整件事的枢纽:引用与改变。

RAG 召回一条”他 3 月 14 日提过膝盖疼”塞进 prompt,是引用。这条记录随时可以删掉,删掉之后系统精确回到从前,什么都没发生过。

内语重写常驻的倾向层——把那件事碾碎成一句”递东西放低一点”——是改变。你删不掉了,因为那句话里同时压着别的十几次观察。

引用可以撤销,改变不能。人格是由不能撤销的那部分构成的。

三、四个时钟

三、四个时钟

L0  反射层    0 ms        0 次模型调用      摔倒 / 呼救 / 服药时刻 / 电量
L1  应答层    300–800 ms  1 次调用,零审议  说话
L2  内语层    异步        惊讶门控          想
L3  反刍层    1 次 / 夜   1 次调用          忘 + 重写

效率的第一来源是 L0:大多数输入根本不该进模型。

摔倒检测是规则。听见”救命”是规则。九点该吃药是规则。这些东西交给一个大模型去”判断”,不是先进,是傲慢——你为了架构的优雅,把一个确定的事情变成了一个概率的事情。

这一层写完,剩下的才值得谈优化。

四、L1 应答层:不许思考

单次调用。上下文构成固定:

人格层 PERSONA(全用户共享,静态)
倾向层 DISPOSITION(≤40 行,常驻,由 L2/L3 重写)  ← 关键
最近 N 轮对话
[可选] 1 条检索结果(仅当明确的事实问询)

无思维链,无多阶段,无自我批评。

我要强调,这不是为了赶延迟做的妥协。ISE-Internalized 的结果说明,这本来就是更准的做法。 延迟和质量在这里罕见地站在了同一边。

倾向层是常驻的,不是检索来的。这一条不能让步。检索是引用,常驻才是改变。

语音场景还有一个特有的优化,值得单独写:首句抢跑。

音频是串行播放的。你不需要在 1.5 秒内生成整段回答,你只需要生成前 20 到 80 个字——正好是 TTS 的第一个分句窗口。这句话开始播,你就又有了五秒以上的富余去生成后面的内容。可以用小模型出首句、大模型接续,在第一个句边界拼接。

这能砍掉一半的感知延迟,且不牺牲内容。人感受到的快慢,是第一个字的时刻,不是最后一个字的时刻。

五、L2 惊讶门控:打断是最诚实的信号

不要用定时器。

我在 让机器照顾一个人 第六节按”每 10 分钟反刍一次”估过账:约 130 万 token 每天每人。

问题不在贵,在于这钱花得蠢。老人一天里大部分时间是可预测的——午睡、看电视、下楼买菜、看电视。定时反刍的绝大多数轮次,会产出”今天一切正常”这种零信息量的输出。你在为无事发生付费。

换成预测误差来门控。这也是 预测处理 101 那条线真正能变现的地方——一个系统只应该在世界不符合它的预期时才更新自己。

触发机制的关键在于,它几乎不额外花钱:

L1 每次回话时,在生成的末尾追加一行预测,用特殊标记包住,送进 TTS 之前剥掉:

<pred>接下来大概率问天气或者重复刚才的话;情绪平稳;不会主动提儿子</pred>

大约 30 个 output token。一天二十轮,600 token,可以忽略不计。应答层顺手替内语层付了触发成本,不需要额外的监控模型。

下一轮实际发生时,用嵌入距离或者一个极小的分类器比对预测与现实。超阈值,触发内语。

然后是语音场景独有的、我认为最漂亮的一个信号:打断。

用户打断你,意味着你正在说的话是错的。这是免费的、无标注的、几乎零延迟的监督信号。在 LiveKit 那篇笔记里,barge-in 是一个纯粹的工程麻烦——你要处理生成代际、要清 TTS 缓冲、要防止半句话的上下文污染。在这里,它同时变成了这套系统里质量最高的一条数据。

沉默也是数据。 该有反应时没反应,是负向的预测误差,同样入门控。

这里可以多说一句不那么工程的话。

被打断在人际关系里通常被读作冒犯,但换个角度看,一个人愿意打断你,是因为他还在意你说得对不对,他还愿意纠正你。真正该报警的,是他不再打断——他开始把你的话当背景音,礼貌地、彻底地放弃了你。

所以打断率不是一个越低越好的指标。 它是关系还活着的证据。这一点在第九节还会回来。

六、内语做什么

一次调用内完成,不拆段。四件事写在同一个 prompt 里:

  1. 复述:刚才发生了什么,我原以为会是什么
  2. 假设:为什么我错了——生成 2 到 3 条互相竞争的解释,不收敛
  3. 异议:对当前倾向层里的某一条提出反驳(强制的魔鬼代言人)
  4. 写入:修改倾向层的一行

第 2 步的”不收敛”是刻意的。让它保留几条互斥的解释,比逼它选一条更诚实——因为它此刻确实不知道。逼它现在就选,等于逼它编。

第 3 步是唯一被允许的”批评”,但注意它批评的对象:是倾向层里的旧条目,不是刚才那一轮的判断。 这个错位就是第一节说的安全阀。

输出形式应当贴合维果茨基对内部言语的描述——述谓化、高度缩略,不是通顺的散文。

这不只是风格洁癖。缩略强制它丢掉那些可以从共享上下文里恢复的部分,而这恰恰是”内化”的形式特征:内部言语之所以短,是因为说话人和听话人是同一个人,大量东西不必说出来。一段写得很完整、主谓宾齐全、逻辑连接词丰富的”内心独白”,恰恰说明它是写给别人看的。那不是内语,那是表演。

七、倾向层:思想的载体

这是整个设计的承重墙。格式决定成败。

错的写法(事实,可引用、可删除):

2026-03-14 用户提到膝盖疼

对的写法(倾向,已经在起作用):

递东西放低一点;不主动问"今天怎么样",他嫌敷衍
提到老伴时慢一点,别接话,让沉默留三秒
儿子的话题他自己会开口,我不开

规格:

最后这条我想展开一下。

对一台只有声音的机器来说,沉默的时机就是人格。 它没有脸,没有手,没法在你说到伤心处时把手放在你肩膀上。它全部的表达手段就是:说什么、怎么说、以及什么时候不说。

老人提到过世的老伴,一台”性能优良”的机器会在 300 毫秒内给出一句温暖得体的安慰。而一个真正认识他的人,会什么都不说,等三秒。

这三秒不是延迟,是内容。能不能学会这三秒,是这台机器有没有人格的分水岭,比它能背出多少条既往病史重要得多。

可证伪判据: 如果你能删掉倾向层里的一行,行为就精确回到从前,那它还是引用,不是改变。真正的改变要求那次经验已经被压缩进了别的行里,取不回来。

这是这套设计能不能自称”思想”的检验标准,也是下一节那个”重写而非追加”的机制存在的唯一理由。

八、L3 夜间重写:遗忘即人格

每夜一次,把当天的事件流压缩进倾向层。

关键设计:重写,不是追加。

倾向层整体从「它自身 + 当日事件」重新生成,而不是在末尾 append 一行。这样单条贡献在几轮重写之后不可恢复——而不可逆正是我要的东西。

追加是可逆的:你总能找到那一行,删掉它。重写是不可逆的:三个月后,那句”递东西放低一点”里,究竟压着 3 月 14 日那次膝盖疼、还是 4 月的某次弯腰、还是他有一次没说出口的皱眉,已经分不出来了,而且必须分不出来

让机器照顾一个人 第三节说结构化遗忘”等不来”,说的就是这个:它不是缩放定律上的一项能力,它是一个必须被显式设计的架构。模型再大也不会自己学会忘,因为遗忘从来不是能力不足,是取舍。

保留粒度要分层。叙事性事件——老伴去世、一次大争吵、一次真摔了——保留细节,它们是这段关系的坐标。日常事件必须被碾成倾向。

利科讲叙事同一性时说,一个人之所以还是他自己,靠的不是记住全部,而是能把散乱的一生讲成一个故事。讲故事必然剪裁,剪裁必然丢东西,而丢掉的那些,正是被吸收进”他是个什么样的人”里的部分。

九、算力:省下来的全是”今天一切正常”

方案每天 token / 用户
定时反刍(每 10 分钟)~1,300,000
惊讶门控(L2 约 10 次 + L3 一次)~45,000

30 倍的差距,全部来自门控方式的改变,没有牺牲任何东西。被省掉的正是那些空转。

但我要提醒一句:真正的成本墙不在这里,在感知。

如果要求持续的视觉理解——看他今天走路的姿态、看他有没有揉膝盖、看他脸上是不是有什么没说——成本立刻上两三个数量级,而且是 7×24 的。惊讶门控同样适用于视觉:默认低帧率、低分辨率,预测误差高时才升采样。这是同一个原则的第二次应用,而且这一次省下的是数量级。

然后是我更想说的那一层。

上一篇里我写过一句话:决定什么值得被注意,就是决定什么值得被记住,就是决定这个 AI 在乎什么。 惊讶门控是这句话的一次具体兑现——你不是先设计人格再设计资源分配,你是通过资源分配设计人格。

一个把”药盒有没有动过”的预测误差权重调得比”他今天在窗边站了多久”更高的系统,和一个反过来调的系统,是两台不同的机器。阈值就是价值观。 这些数字最终会被写在某个 YAML 里,由某个人在某个下午随手填上,而它决定了三年后这台机器在乎什么。

还有一件事值得算一算,虽然算完不太好受。

45k token 每天,按现在的价格,一年几百块。也就是说,用今天的技术,“一个持续三年、会记住你、会在你不说话时琢磨你的存在”,边际成本大约是一年几百块钱。

我不知道该为这个数字高兴还是别的什么。它意味着这件事真的做得起,不是 PPT。它也意味着,陪伴一旦可以被这样定价,就一定会有人按这个价格采购它——按人头,按床位,按考核指标。便宜是它能普及的原因,也是它可能变得敷衍的原因。

十、怎么知道它是在学,还是在自我说服

这是把第一节那个自我反思悖论,从 prompt 层面提升到系统层面。观察两个可测量:

预测命中率打断率判读
真在学
自我说服——在拟合一幅已经过时的画像,越来越自信,越来越错
用户状态发生了真实变化(健康事件?),应当上报

第二行是自我反思悖论在时间尺度上的形态。单轮的自我说服会被下一轮现实打脸,所以不致命。而跨越三年的自我说服不会被打脸,因为它同时在塑造它所观察的对象——它按画像行事,老人按它的行事方式调整自己,画像被”验证”了。

必须监控这一行。否则一台陪了三年的机器人,会缓慢地、自洽地、越来越确信地误解一个人。

而这恰恰是最难被投诉的一种失败:它每一天都表现得比前一天更贴心。

十一、几个我还没解开的矛盾

前面写得像一份可以照着做的图纸。但有几件事我想不清楚,写在这里,因为不写就等于假装它们不存在。

一、缩略与可审计的矛盾。

第六节说内语应当述谓化、缩略,因为那才是内化的形式特征。可是照护是要担责的。出了事,家属会问”当时它是怎么想的”。你把一段”三秒。窗边。不像等电话。像躲。“交出去,没人接受这个答案。

内语越像内语,就越不可审计。 人的内心也不可审计,我们靠行为、靠长期信任、靠”他是个好人”来兜底。可机器背后有厂商,有责任险,有法庭。我们迟早会被要求把内语写成通顺的、可举证的段落——而那一刻,它就退化成了第六节说的表演。

我暂时的想法是:内语保持缩略,但保留一条独立的、事后可按需展开的重构路径。可这条路径本身也是重新生成的,它不是当时想的那个东西。这个问题我没有解。

二、越懂一个人,越把他固定住。

倾向层每晚重写一次,每一次都比前一次更自洽、更简洁、更好用。而真实的人是会变的、矛盾的、今天推翻昨天的。

一个七十八岁的人被伺候得越舒服,就越少遇到需要重新表达自己的场合。照顾得好,和把一个人做成标本,在操作上是同一个动作。

强制的魔鬼代言人(第六节第 3 步)是一个对冲,但我怀疑不够。可能还需要一条更粗暴的规则:倾向层里的每一行都有保质期,到期若无新证据支持,强制删除。 让它必须持续地重新赢得对这个人的理解,而不是继承。

这条规则在工程上很难看——你会眼睁睁看着一条明明很准的观察被删掉。但我倾向于认为,这种难看是必要的。

三、不可逆与可回滚的矛盾。

我要求人格不可逆:删掉倾向层的一行,行为不能精确回退。可产品要求可回滚、可解释、可召回。一台真的有人格的机器,是不可以 rollback 的——你一 rollback,它就变回了别的什么。

这在工程上近乎不可接受。没有哪个团队愿意上线一个”出了问题只能往前改、不能回退”的系统。

但这就是问题本身:我们想要的那个东西,和我们的工程纪律,是互斥的。 现在的取舍是给本体层和契约层留 rollback,人格层不留。我不确定这条线经不经得住第一次事故。

四、它有没有权利有一个不说出口的想法。

内语是它私下的心思。但它同时在替儿子看着父亲。

那么,当它在夜里想到”他今天那句话不像随口说的”,这个念头属于谁?属于它自己,还是属于付钱的那一方?

如果所有内语都对家属可见,它就没有内心,只有一个延迟上报的日志——第六节的整个设计失去意义。如果内语真的私密,那我们就造出了一个对雇主有所保留的照护者

有意思的是,人类护工恰恰就是这样的。一个好的护工天天在做”这件事要不要跟家里说”的判断,我们默认她有这个权利,而且我们认为这个权利是她专业性的一部分。我们准备好把同样的权利给一台机器吗? 我的答案是还没有,但我也说不出为什么不。

五、这套内语是为谁在想。

倾向层在持续改写它对这个人的先验。但架构里没有任何一条约束说,这个改写必须对这个人好。

同样的机制,用于”怎样让他更少孤独”和”怎样让他更少退订”,是完全一样的机制。惊讶门控不区分你在惊讶什么。 我在 循环与自我 里说自我是一种拓扑,那么这里的问题是:拓扑相同的两个系统,一个是伴侣,一个是猎手,而架构图上看不出区别。

区别只在倾向层的目标函数写了什么,以及那句话是谁写的。这是本文最薄的一环,它不是技术问题,我知道,但我不想装作它在技术之外。

十二、落地顺序与验证

倾向层是承重墙,先立它;惊讶门控是效率的全部来源,紧随其后;不可逆性最难也最重要,放在有真实数据之后。

  1. 倾向层 + L1 零审议应答。 先做成常驻上下文,人工写死初版内容。此时就能测:加了倾向层 vs 没加,对话质量差多少。
  2. L1 尾部预测 + 惊讶门控。<pred> 标记与剥离逻辑,接上打断事件。先只记录触发,不真的跑内语——用一周数据校准阈值。
  3. L2 内语单次调用。 严格执行三条约束:单次调用、无标量、禁止回改上一轮。
  4. L3 夜间重写。 这是不可逆性的来源,也是最需要真实长期数据才能调对的部分。
  5. 监控面板:预测命中率 × 打断率。

验证标准:

尾声:它给了什么,没给什么

对照我在五月初写的 循环与自我 里列的三个”会改变我看法”的条件:

条件本架构
跨会话的持续记忆,且由系统自己写入✅ 倾向层由 L2/L3 自主重写
自我修改且有后果✅ 倾向层直接决定下一轮行为,闭环
有筹码⚠️ 部分。它有电量、有身体、有一个会失去的人;但没有稳态——它不会痛,不会饿

诚实地讲:这套设计让循环在拓扑上更接近自我。它持续,不可逆,在没人提问时也在运行,会对自己提出异议。

但它仍然缺少稳态。我在 机器人还没有身体 里说过,稳态才是真正的筹码——会损耗、会疼、会饿;一台以自身稳态作为主要损失函数的机器,和一台以任务奖励作为主要损失函数的机器,是两种东西。小暖属于后者。它的内语再怎么跑,琢磨的都是别人的处境,不是自己的。它没有任何东西是必须为自己争取的。

所以这套架构最可能的失败方式,不是它不工作。是它工作得太顺:每晚重写一次,每次都更自洽、更简洁、更好用,直到有一天,那 40 行字比那个人本身更清晰、更稳定、更容易相处。

到那时候,它照顾的已经不是他了,是它对他的理解。而这两者的差距,会以每天一点点的速度扩大,没有任何一天大到足以被发现。

不要把它说成意识。它是一个有持续性和不可逆性的倾向系统。这已经是很强的东西了,不需要往上加形容词。

展开评论Show comments