记忆怎么存、怎么想起来
记忆核心管三件事:什么值得记、想起来的时候想起哪些、睡着的时候怎么整理。它不调用模型决定记不记,想起来之前先过隐私的门。
什么值得记
每段聊天里的事先过一道「值不值得记」的门。这道门按显著程度打分,不调用模型。
过了门的,先看库里有没有说的是同一件事的:一模一样或几乎一样的,合并成一条、证据多一份;对不上的,判断是哪种:
- 更正:原来记错了;
- 状态变了:以前是那样,现在不是了;
- 矛盾:两条打架,一时分不清;
- 来源不够硬:听别人转述的,推翻不了他自己说的。
旧的那条不删,换个标记、连一条「被谁更正 / 被谁取代」的线。同一件事前后几条串成一段经历。
记得牢不牢、此刻想不想得起来
每条记忆有三个数,分开算:
- 重要:这件事本身有多重要(生日很重要);
- 想起来的容易程度:此刻多容易被想起(吃饭的时候不会想到生日);
- 牢不牢:说过十次的偏好,比说过一次的牢。
所以它可以「很重要,但此刻想不起来」,也可以「不重要,但刚提过,还在嘴边」。
想起来
要回话时,它先从几路各捞一批:和说话的人有关的、提到的东西有关的、这个频道最近的、正在进行的那段经历、意思相近的。然后一起重新排:意思多近、字面对不对得上、是不是在说同一个人同一件事、时间、记得多牢,还有两条规矩:最近刚提过的往后放(不老提同一件事),太相似的几条只留一条。
最后不是拿前几名,而是按配额凑一包:几条往事、几条稳定的认知、一件共同经历、一件没聊完的事。问「现在」,同一段经历只给最新的那一条。
睡着的时候整理
它睡着的时候整理一遍记忆(醒着也隔一阵整理一次),每一步都能中断、能重来:
- 带时效的状态过了时效(「这周在考试」),标成过期。
- 一模一样的合并到最早那条。
- 几乎一样的也合并。
- 互相打架的、按信号初判「状态变了」的,交给模型复核谁对;你明说过「记错了」的更正不复核。没有模型、没有额度时原样留着,不猜。
- 同一个人、同一个话题反复出现的几件事(两个月里三件以上),让模型归纳成一条稳定的认知。
- 不重要、很久没想起、也没人提的,归档:不删,只是以后不再翻它。
- 很久以前、关系很弱的「一起被想起过」的连线删掉。
- 一个月没动的经历收尾。
- 补上还没算好的检索数据。
换过来的时候
记忆核心先在旁边「影子」跑:回话用旧的记忆,同一个问题它也检索一遍,逐条对比;证据够了(样本够多、零隐私失败、输给旧的次数够少)才接手;接手以后旧的照样写着一份,随时能退回去。只要出现一次隐私失败,立刻退回影子。网页后台「记忆管理 → 记忆核心」里看得到它现在在哪一档。
对应的代码
- 值不值得记:
src/aeria/hmc/encoding.py;编码、关系判断、检索:src/aeria/hmc/engine.py(encode、recall)。 - 想起来:
src/aeria/hmc/retrieval.py(隐私门在排序之前、按配额编排);三个数:src/aeria/hmc/strength.py。 - 整理:
src/aeria/hmc/consolidation.py(九步,每次记进hmc_runs);矛盾和更正:src/aeria/hmc/conflict.py。 - 换过来:
src/aeria/hmc/service.py(LEGACY→SHADOW→PRIMARY→AUTHORITATIVE,evaluate_cutover)。 - 测试:
tests/test_4_0_hmc.py、tests/test_4_0_r1_hmc.py。
没做到的
- 「想不起来」只是排得靠后了,记忆不会像人一样真的慢慢消失;归档的也还在库里。
- 第 4、5 步要调用模型;没有模型、没有额度的时候,矛盾就一直挂着,也归纳不出稳定的认知。
- 值不值得记的打分是手写的规则,没有拿真实的「后来用上了没有」去校准过。