该不该回
看到一条消息以后,它先认这句话是不是冲着自己来的,再决定回不回。冲着它来的,它多半会回;群里没叫它的,多数时候只是看着。要不要开口,由一组看得见理由的规则先定,模型只在要想一想的时候参与。
先认是不是冲着它来的
私聊、@ 它、回复它说的话、叫它的名字或别名、它正和你聊着时你接着说的下一句,都算冲着它来的;聊着聊着你转头 @ 了别人,就不算了。细节见 2.5。
冲着它来的
「马上回」的分量最重。精力和想说话的劲头高一点,这个分量更重;压力大,就轻一点,但仍然排在「先看着」前面。
它睡着、出门、心情不好躲着的时候,冲着它来的话先存下,回来以后再看(2.22)。
群里没叫它的
「先看着」「不理」的分量更重。像在提问、它本来就在这段对话里,「回」才有机会胜出。
它还会记住在每个服务器里插话的下场:插了常冷场,就多看着;常被接住,就少看一会儿。
还有两道在调用模型之前就停下:心情低、不想说话的时候;这一轮它想接话的劲头很弱的时候。
一组规则先拿主意
每条消息进来,十六位「专家」各提一个做法:马上回、晚点回、只回表情、先看着、不理、拒绝、结束对话、查记忆……提出来的做法先过几道护栏(安全、隐私、权限、作息、插件授权),过了的按「有多想、有多有把握,再减去代价和风险」打分,挑最高的一个。十六位各看什么、分数怎么算,见 2.7。
这些理由在网页后台「认知观测台」「决策记录」里看得到。
要想一想的时候
大多数消息走快路:规则定了「回」,就直接写回复。话里牵扯到关系、两难、要查东西,出乎意料,或者有做法被护栏拦下来,才先让模型规划一步:回、再等等、拒绝、结束这段对话、先翻记忆或更早的聊天。
群里插话的打分
规则以外还有一套本地打分,给群里没叫它的消息用:
- 加分:像在问问题、在求助、在问大家的看法;问题悬着没人接;积了好几条没看;话题停了一会儿。
- 减分:一串「哈哈」「6」这种短反应;两个人正聊得顺;好几个人你一句我一句;有火气;它十秒内刚说过话;最近频道里它说的话占比已经偏高;话是冲着别的助手说的。
规则那一层出故障、超时的时候,才按这个分数和门槛决定;差一点够门槛的,先看一会儿,这期间别人已经回答了,就不插嘴。规则那一层正常的时候,这个分数和理由只记下来,交给规划那一步参考。网页后台「对话策略」里的回复阈值、基础回复频率,管的就是这套打分,所以平时调它们看不出变化(1.12)。
对应的代码
- 是不是冲着它来的:
cognition/addressing.py;bot.py的_addressed_directly。 - 专家:
cognition/experts/;护栏:cognition/guards.py;挑一个:cognition/arbitration.py的utility_score;规则策略的编号是r1-h-v1(cognition/policy/heuristic.py)。 - 走快路还是先规划:
cognition/router.py的MetacognitiveRouter;规划那一步的提示词:prompts/zh-CN/planner_system.prompt。 - 群里插话的打分:
attention.py的score_attention;门槛在人格配置的[conversation]:direct_reply_score、spontaneous_reply_score、continuation_reply_score、base_reply_frequency、max_self_ratio、minimum_reply_gap_seconds、observation_margin。 - 规则那一层管不管事:主配置
[nhcx]的authority_mode(默认HYBRID:规则说了算,出故障退回本地打分)。 - 测试:
tests/test_attention.py的test_short_reaction_batch_never_forces_a_spontaneous_reply;tests/test_nhcx_v2_authority.py的test_hybrid_is_the_configured_production_default;tests/test_semantic_deliberation.py的「明确发给它的消息永远不进语义复核」「本地说不发、模型说发,结果还是不发」。
没做到的
- 「像不像问题」「是不是在求助」「是不是短反应」现在靠中文词表认,英文、日文的群聊里认不出来;要改成交给模型判断。
- 规则策略是手写的。打算用真实对话训练一个学出来的策略来替它,标注数据还不够。
- 「本地拿不准时问一次模型」(语义复核)已经写好,但默认关着:每问一次要多一次模型调用,开它之前要先量清楚值不值。
- 「对话策略」里的回复阈值、基础回复频率,在规则那一层正常的时候不起作用;要么接进规则,要么在界面上说清楚,还没定。