群里怎么知道在叫它
群里一句话是不是在跟它说,决定了它是「该回」还是「可以看着」。@ 它只是最明显的一种;叫它名字、回复它、接着它的话往下说,也都算。
算在叫它的
- 私聊。 私聊里的每一句都是对它说的。
- @ 它,或者回复它说过的话。
- 叫它的名字或别名(「配置管理 → 身份与人格」里的「名称」「别名」)。
- 接着它的话往下说。 它刚问了你一句、你们的话还没说完、上一句是它说的,你这一句多半是接着它说的。
「接着说」不是一个固定的几分钟:越久越淡,但光是时间久淡得有限,一刻钟后还剩八成多,再久也有七成左右;淡得快的是中间插进来别人说话、隔了好几条消息。话里带着「你觉得呢」「那你呢」「回我」这类明显在等它开口的说法,会更像在跟它说。
不算的
- 聊着聊着转头 @ 了别人。 这一句是对那个人说的,不算接着跟它说。
- 一句话开头在叫别的助手(比如开头是另一个机器人的名字)。
- 只有一个字的别名,没像在叫人。 一个字的别名,前后要是标点、空格,或者在句首,或者紧跟着「你」「在」「帮」这类字,才算在叫它。别名是「满」的话,「满意」不算叫它。
几个人格在同一个群里
同一句话最多只归一个人格:谁被 @、被回复,就归谁;没点名的普通聊天,按「人格管理 → 会话绑定」归一个人格(1.8)。不会出现两个人格同时抢着回同一句话。
认出来以后
认出是在叫它,这句话就是「冲着它来的」:「马上回」的分量最重(2.6)。没认出来的,按群里插话的规矩走:多数时候先看着。
后台「认知观测台」里每一条消息都写着它是怎么认的:@、叫名字、回复、接着说,还是只是旁听。
对应的代码
- 认是不是在叫它:
src/aeria/cognition/addressing.py的resolve_addressing(几种依据:EXPLICIT_MENTION、DIRECT_NAME_ADDRESS、REPLY_REFERENCE、THREAD_CONTINUATION、SEMANTIC_DIRECT_EXPECTATION);接着说的打分:_thread_evidence(门槛 0.62;时间那一项约 900 秒减半,整个分数乘 0.68 + 0.32 × 它,所以最多淡到 0.68 倍;每插进一个人扣 0.18、最多扣 0.42,每隔一条消息扣 0.06、最多扣 0.24)。 - 一个字的别名:
src/aeria/attention.py的mentions_alias;bot.py的_addressed_directly。 - 几个人格时归谁:
bot.py的_assigned_persona_for_message,src/aeria/personas.py的PersonaRegistry.resolve。 - 测试:
tests/test_attention.py的test_single_character_alias_requires_a_vocative_boundary;tests/test_3_5_1_addressing.py的「聊着天转头 @ 别人,不算接着跟它说」。
没做到的
- 「你觉得呢」这类在等它开口的说法是一张中文短语表;别的说法、别的语言认不出来。
- 它看不到 Discord、QQ 上的「谁在对谁说话」以外的东西:两个人用语音聊着、文字里接了一句,它不知道上下文。