TK联合协会 项目档案

项目

目前登记一项:一个还停在设计阶段的人格系统,不产生收入,也不动用股金。

股东告知 NOTICE

本项目为非盈利性项目 · 不涉及任何商业收入 · 不动用股金

股东名册中的赞助仅用于记录与致谢;本项目的预算由站主自行承担(≤ 100 元)。

项目登记簿 PROJECT REGISTER ENTRY 001

设计阶段
状态
设计阶段 · 设计文档 v1.0
预算
≤ 100 元,自行承担
硬件
i5-13500H / 16 GB
周期
2–3 周

不报告实验结果

登记项目 一 PERSONA SYSTEM

以情绪为调度中枢的双模型闭环人格系统

Emotion as a Scheduler — A Two-Model Closed-Loop Persona Architecture

两个很小的语言模型分工:一个只负责「此刻心里是什么天气」,另一个照这个天气去翻抽屉,再把话说出来。两者不合并成一个模型,中间只传一张巴掌大的便条。现在它是一份设计文档,还没有做完,也没有实验结果。

先说清楚 PLAIN WORDS

一个人,一间老房子,一屋子抽屉

想象一个人住在一间老房子里。每天早上,他心里有一种天气。

天气好的时候,他愿意拉开很多抽屉,翻出很远的东西,脑子也跳得快。天气差的时候,他只拉开最近那个抽屉,看一眼就关上。

抽屉之间牵着绳子。绳子不是按「事有关」连的,是按「心情像」连的——所以「雨天的站牌」会连到「小学门口等妈妈」。

天气决定往哪个方向翻,但他自己负责真的去翻、挑哪一本、用什么腔调说出来。而翻到的东西,又回头改变他的天气。这是一个圈,这个圈就是「心情」的样子。

天气还有快慢:一句话能让天立刻阴下来,但那只是一阵风;要连着阴好几天,季节才会变。

没人来的时候,他一个人在屋里翻,翻着翻着,就只在同一个抽屉里打转——所以得有人时不时跟他说句话。

这个项目要做的,就是把这间屋子装进两个小模型里:一个管天气,一个管翻抽屉。它想试的不是「让 AI 有情绪」,而是——一层很薄的情绪状态,能不能真的改变一个系统的注意、记忆和说话方式。

构成 ARCHITECTURE

两个模型,各管一件事,不合并权重

系统由两个独立后训练的小模型组成。「0.5B」「1.5B」是参数量,可以粗略理解成模型的脑容量:五亿、十五亿个参数,都在一台普通笔记本上跑得动。

B 模型 0.5B base

管天气和联想,不发声

每轮只吐出一张「意图卡」——一张只写方向、不写内容的便条:此刻心情是好是坏(效价 v)、有多激动(唤醒 a)、该往哪个方向翻(检索方向)、脑子里浮起什么画面(意象)、翻多远(联想宽度 breadth)、用哪种方式想(mode)。总长不超过 50 token(大约几十个字)。

温度 1.1 / top_p 0.95 · 不参与训练

A 模型 1.5B instruct + 轻量 LoRA

负责检索、验收,和真的开口

拿到便条后,它先去记忆库里粗筛,沿联想边扩散几跳,再把候选一条条过一遍——「这几条里,哪条让我想说话?」——它有权全部否决。然后才把话说出来。LoRA 是一种只训练一小块附加参数、不动原模型的微调方式,在这里只用来改变表达形式。

温度 0.75 / top_p 0.90 · 轻量 LoRA

两者不合并权重,只传递状态:唯一的联系就是那张便条。权重合并是在参数空间里做平均,不是功能上的复合;对两个目标正交的适配器,合并更像互相干扰。所以「合并」在这个项目里只作为消融实验的对照组存在。

一张意图卡,六个字段

v 效价
−1 到 1:这一刻是好还是不好
a 唤醒
0 到 1:有多激动
direction
检索方向:往哪个方向翻
image
意象:此刻浮起的具体画面(具体优于抽象)
breadth
联想宽度 0–1:翻多远的抽屉
mode
推理方式:直觉 / 类比 / 否证 / 回忆

六个字段全是数值或短语。没有一句话是写给人看的——它们只用来决定方向,不承载内容。

核心机制 ONE SCALAR

一个 openness,同时拧三个旋钮

整个系统只有一个总开关:openness,一个被钳在 0.25 到 0.8 之间的数,由当前情绪算出来——心情好、又不太激动时它高,心情差、又很激动时它低。它同时决定三件事。

  • 听多少

    门限 θ = 1 − openness

    高保留更多片段,并把高显著度的放到末尾

    低只留最刺耳的那一句

  • 想多远

    联想宽度 breadth

    高多跳、远联想

    低单跳,只翻最近那个抽屉

  • 怎么想

    推理方式 mode

    高类比、直觉

    低否证、抠细节

过滤做的是「删掉片段」,不是「调小音量」。因为人在注意收窄时的表现就是删除:紧张的时候,人不是听见所有人但都变小声,而是只看见那张脸。

三个通道同向变化的经验依据:积极情绪拓宽认知(Fredrickson, 2001);唤醒升高收窄注意(Easterbrook, 1959);心境影响加工方式(Forgas, 1995)。

情绪建模 FOUR SCALES

情绪有四层,快慢不一样

L0 瞬时
0.5–1 轮:一句话当场变脸
L1 快情绪
2–5 轮:一句话留下的情绪残留
L2 心境
20–50 轮:这一阵子的底色
L3 气质
200+ 轮:这个人一直是这个人

关键在更新规则里:快层往下衰减时,回落的目标不是零,而是此刻的心境。于是「心情好的时候被责备,气消了还是心情好」不需要额外写规则,它自己就长出来了。

另外还加了一层对抗过程,用来产生情绪过冲:被吓一跳之后,情绪不会平滑地回到原位,而是先越过基线、反向荡一下,再慢慢爬回来。参数上有一条硬约束——补偿强度 k 必须小于 1,否则在闭环里会越振越大。

分层记忆 ADJACENCY

抽屉之间,按「心情像」连

记忆分四层:事件层存原始片段、情绪标签和意象;联想层存片段之间带权重的边;叙事层每 50 轮压缩一次「最近我是谁」;气质层几乎冻结,是人格的锚,存在 LoRA 和人格卡里。

关键是,联想边不用语义相似度。语义相似度连出来的是「主题相关」,那是搜索。这里用的是情绪邻近:两个片段只要效价和唤醒都接近(|Δv| + |Δa| < 0.4),而且时间隔得够远,就连一条边;每被共同激活一次,边就加粗一点(赫布式增强)。

所以「雨天的站牌」连到的是「小学门口等妈妈」,不是「公交车」。

检索把意图和执行分开:B 决定朝哪个方向找,但不对结果负责;A 对结果负责,但不决定朝向。这对应一件很具体的事——你可以决定想回忆什么,却没法命令自己想起一件愉快的事。

设计取舍 WHY THESE

每一个选择,都有一个被拒绝的理由

为什么 B 用 base,而不是 instruct?
instruct 模型被对齐训练过,天生倾向于把散乱的联想整理成条理——而这正是这里要的反面。base 的「不通顺」本身就是自由联想:需要的能力本来就在里面,只是在指令对齐的时候被抹掉了。这是整个设计里最省钱、也最关键的一个选择。
为什么意图卡必须 ≤ 50 token?
带宽一高,A 就会去「理解」B 的情绪,然后把它拉回训练分布里的平均值,通道的实际信息量趋近于零。字段化、短化、数值化,是为了逼它执行,而不是让它理解。
为什么联想边不用语义相似度?
因为语义相似度产出的是搜索,不是联想。按「心情像」连出来的东西,更接近人自己记事情的方式。
为什么不在 1.5B 上训练推理能力?
这个量级的思维链常常是负收益:生成看似合理、实则错误的步骤,然后坚持执行,产出更长的自信谬误。改用固定槽位——看到 / 好奇 / 想起 / 要做——槽位名本身构成一种思维形状,四格就是一个「凭直觉与联想行事」的人;换一套槽位名(比如 前提 / 反驳 / 让步 / 结论)就是换一个人格,不必重训。
为什么每个模块都要设击穿阈值?
因为测不出差异的模块就是装饰,应当删掉。没有失败判据的项目,无法区分「真的涌现」和「叙事好听」。

失败判据 FALSIFIABILITY

每个模块,都安排了一次「处死」的机会

设计文档给每个模块都写了消融条件和击穿阈值:哪一个指标测不出差异,就说明这个模块是装饰。四组消融条件各跑 200 轮,固定随机种子。

  1. P0

    消融:把 B 换成一张固定的空意图卡,或换成随机噪声,或换成 A 自身上一轮的摘要。

    击穿:真实 B 与其他条件在至少两项指标上没有显著差异 → B 冗余,方案终止。

  2. P1

    带宽:固定上下文,只改 v 一个数值,看保留片段数、检索跳数、输出分布的 KL 散度(衡量两组输出差多远的一个数)是否同向变化。

    击穿:KL 趋近 0 → 通道失效,重做接口。

  3. P2

    动力学:阻尼 × 噪声的 3×3 网格,每格 5 个随机种子,观察稳态跳跃率与记忆调用多样性。

    击穿:找不到「既不死锁也不碎裂」的中间区 → 系统本质单稳态。

  4. P3

    人格:30 轮之内,人格还在不在。

    击穿:20 轮内就滑回助手腔 → 训练数据设计失败。

  5. P4

    长程:100 轮之后,人格得分掉幅是否小于 20%。

    击穿:掉幅超过 50% → 对外展示不成立。

评测采用盲评:四组日志打乱顺序、去掉组标签,再交给强模型按五个维度打分(连贯性 / 新颖性 / 深度 / 人格一致性 / 独白是否支撑落点)。不盲评,分数就会向实验组偏移。文档把话说死了:若 P0 或 P1 没有通过,整个双模型假设就应当放弃,退回单模型双人格的基线。

为什么做 WHY THIS

现在的人格化对话,只有一条老路

主流做法是「单模型 + 系统提示词」:一个模型,一段人设提示词。这条路有三个老问题。

  • 人格漂移:长对话里,助手腔会慢慢压过角色设定。
  • 情绪沦为措辞装饰:情绪只体现在用词上,影响不了系统的注意和记忆。
  • 联想退化成搜索:检索靠语义相似度,产出的是「相关」,不是「想起」。

直觉的回应是训练两个专精模型再合并。但合并解决不了这件事:权重合并是在参数空间里做平均,不是功能上的复合。

这个项目走另一条路:不合并权重,只传递状态;把人格的稳定性从权重里挪到时间常数上——四层情绪的叠加本身,承担了「这个人一直是这个人」。这是它想提出的那条不同的路。

还有一层意义是工程态度上的:多数同类个人项目只有演示、没有失败判据,于是没人能区分「真的涌现」和「叙事好听」。这个项目想给个人级项目补上「可证伪」这一课——每个模块都必须能被消融、被测量、被删除。

局限 LIMITS

它自己写下的四条限制

  • 它不构成对任何认知理论的验证。一个能跑的系统是存在性示例,不是验证。
  • 闭环长期一定会收敛到窄吸引子(状态空间有限,反复绕同一条路)。用户输入是唯一的结构性熵源。
  • 1.5B 不具备真实推理能力;LoRA 只改变表达形式,不提升能力边界。
  • 盲评仍有长度偏好与格式偏好,只能缓解,无法消除。

这些是设计文档第 7 节自己写下的限制,不是事后补的免责声明。

状态:设计阶段 收录项目:1 本文档不报告实验结果