一起经历过的事
关系往前走一步,不只是心里那几个数变一变,也会留下一件记得住的事:第一次聊到深夜、隔了很久又聊上、第一次跟它说心事、吵过以后和好。这几件事只从真的聊过的对话里算出来,不编。
四件事
| 叫法 | 什么时候算 |
|---|---|
| 第一次聊到深夜 | 一段对话在当地晚上 11 点到凌晨 4 点之间开始,两边各说了至少三轮。私聊、每个服务器各算一次。 |
| 隔了很久又聊上了 | 和上一段对话隔了至少 14 天,而且之前至少聊过两段(刚认识不算)。 |
| 第一次跟它说心事 | 私聊里的一段对话,被判断成认真的场合,而且它在安慰、支持对方。只算第一次。 |
| 吵过以后和好了 | 一段对话里吵过架,之后 7 天之内又好好聊了一段:没吵,两边都开了口。 |
「认真的场合」「吵架」「在安慰他」是每一轮回复前,模型判断这一轮是什么场合、要做什么时记下的;不是按聊天里出现了什么词去认。
每一种按自己的规矩只记一次:「第一次」那两种,每个人、每个地方只有一次;「又聊上了」「和好了」按那一段对话记,以后再有也会再记。
记下以后
从那段对话开始算的三天里:
- 它想起他的时候,想找他的劲头会多一点。
- 它主动找他时,「你们之间刚发生的事」会是一个可以聊的话题(2.20)。
- 头一天半,这件事在它「最近经历过的事」里(2.15):聊天时它知道有这件事,也知道是不是和眼前这个人。
三天以后,这件事还在时间线上,只是不再推它去找人。
在哪看
网页后台「人物画像」里点开一个人,「关系时间线」里有这几种,写着是哪一种;「生活连续性」页的时间线里也有。只有叫法和时间,没有聊天原话。
对应的代码
- 判定:
src/aeria/cognition/milestones.py的detect(LATE_NIGHT_HOURS= 23–3 点、LATE_NIGHT_TURNS= 3、REUNION_GAP= 14 天、REUNION_MIN_PRIOR= 2、MADE_UP_WITHIN= 7 天)。纯函数,不读时钟、不碰存储。 - 什么时候算:
src/aeria/bot.py的_commitment_milestone_tick(十分钟一次,只看最近两天聊过的人:MILESTONE_LOOKBACK)。场合和言语动作来自对话那一条上记下的detail.scenes、detail.intents。 - 之后三天:同一个文件里的
AFTERGLOW= 3 天、AFTERGLOW_DESIRE= 0.05(在src/aeria/cognition/impulse_sense.py里加到想找他的劲头上);当话题:bot.py的_recent_milestone_topic和src/aeria/cognition/topic_candidates.py的RELATIONSHIP_EVENT;进「最近经历」:src/aeria/cognition/timeline.py的facts_for_prompt。 - 后台怎么印:
webui_frontend/src/lib/timeline.ts的MILESTONE_CN。 - 测试:
tests/test_commitments_milestones.py(「里程碑_深夜_重新联系_说心事_和好_各记一次」「里程碑_门槛不够就不算」「里程碑之后三天更想找他」)、tests/test_commitment_ledger.py。
没做到的
- 只有这四种。生日、纪念日这类日子不算:它可能记得对方说过生日是哪天(那是一条记忆,2.11),但到了那一天,不会因此想起他。
- 「深夜」按运行时的时区算,默认北京时间;对方在别的时区,他的白天可能被算成深夜。
- 判断「吵架」「说心事」靠的是回复前那一步模型的判断:它判错了,这里就跟着错。