Skip to content

Commit ce12589

Browse files
committed
✨ 优化对话状态转换逻辑,使用'willing'字段替代'new_chatting_state',并增加状态转换概率评估
1 parent 59a60f8 commit ce12589

File tree

1 file changed

+66
-34
lines changed

1 file changed

+66
-34
lines changed

src/nonebot_plugin_nyaturingtest/session.py

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import os
88
import pickle
9+
import random
910
import re
1011
import traceback
1112

@@ -520,34 +521,28 @@ def __feedback_stage(
520521
- 如果你对自己有新的认知,则保存为自我认知信息,自我认知信息需要经过慎重考虑,主要参照你自己发送的消息,次要参照别人
521522
发送的消息,内容是对自我的认知(如:我喜欢吃苹果、我身上有纹身)
522523
523-
- 评估你是否要改变对话状态,规则如下:
524+
- 评估你改变对话状态的意愿,规则如下:
525+
- 意愿范围是[0.0, 1.0]
524526
- 对话状态分为三种:
525527
- 0:潜水状态
526528
- 1:冒泡状态
527529
- 2:对话状态
528-
- 如果你在状态0
529-
- 可以转变到状态1,2,或者保持0
530-
- 如果满足以下条件之一,转变到状态1:
531-
- 你刚刚加入群聊(特征是“历史聊天”-“最近的聊天记录”只有0-3条消息)
532-
- 你很久没有发言(特征是“历史聊天”-“最近的聊天记录”和“历史聊天”-“过去历史聊天总结”没有你的参与)
533-
- 如果满足以下条件之一,转变到状态2:
534-
- 群里有人直接@你或者指出要你回复
535-
- 群里有人质疑你是ai,无论有没有直接@你或者让你回复
536-
- 讨论的内容你有足够的“检索到的相关记忆”了解,同时根据你的人设和记忆你想加入讨论
537-
- 否则保持0
538-
- 如果你在状态1
539-
- 可以转变到状态0,或者保持1
540-
- 如果满足以下条件,转变到状态0:
541-
- 2-3条消息内没有人对你的冒泡(即发一些无关,且无意义或意义不大,简短的内容表示你在看群)消息做出有意义的非冒泡回
542-
543-
- 否则保持1
544-
- 如果你在状态2
545-
- 可以转变到状态0,或者保持2
546-
- 如果满足以下条件之一,转变到状态0:
547-
- 10条消息内没有人对你的消息做出相关回复
548-
- 你发现你的记忆不足以支撑你参与讨论
549-
- 根据你的人设,你对讨论的内容不再感兴趣
550-
- 否则保持2
530+
- 如果你在状态0,那么分别评估你转换到状态1,2的意愿,其它意愿设0.0为默认值即可
531+
- 如果你在状态1,那么分别评估你转换到状态0,2的意愿,其它意愿设0.0为默认值即可
532+
- 如果你在状态2,那么评估你转换到状态0的意愿,其它意愿设0.0为默认值即可
533+
- 以下条件会影响转换到状态0的意愿:
534+
- 你进行这个话题的时间,太久了会让你疲劳,更容易转变到状态0
535+
- 是否有人回应你
536+
- 你是否对这个话题感兴趣
537+
- 你是否有足够的“检索到的相关记忆”了解
538+
- 以下条件会影响转换到状态1的意愿:
539+
- 你刚刚加入群聊(特征是“历史聊天”-“最近的聊天记录”只有0-3条消息),提升
540+
- 你很久没有发言(特征是“历史聊天”-“最近的聊天记录”和“历史聊天”-“过去历史聊天总结”没有你的参与),提升
541+
- 以下条件会影响转换到状态2的意愿:
542+
- 讨论的内容你是否有足够的“检索到的相关记忆”了解
543+
- 你是否对讨论的内容感兴趣
544+
- 你自身的情感状态
545+
- 你对相关人物的情感倾向
551546
552547
## 2. 输入信息
553548
@@ -619,7 +614,11 @@ def __feedback_stage(
619614
}},
620615
"summary": "对聊天内容的总结",
621616
"analyze_result": ["事件类信息", "资料类信息", "人物关系类信息", "自我认知类信息"],
622-
"new_chatting_state": 0/1/2
617+
"willing": {{
618+
0: 0.0≤float≤1.0,
619+
1: 0.0≤float≤1.0,
620+
2: 0.0≤float≤1.0
621+
}}
623622
}}
624623
```
625624
"""
@@ -638,10 +637,8 @@ def __feedback_stage(
638637
raise ValueError("Feedback validation error: missing 'summary' field in response: " + response)
639638
if "analyze_result" not in response_dict:
640639
raise ValueError("Feedback validation error: missing 'analyze_result' field in response: " + response)
641-
if "new_chatting_state" not in response_dict:
642-
raise ValueError(
643-
"Feedback validation error: missing 'new_chatting_state' field in response: " + response
644-
)
640+
if "willing" not in response_dict:
641+
raise ValueError("Feedback validation error: missing 'willing' field in response: " + response)
645642

646643
# 更新自身情感
647644
self.global_emotion.valence = response_dict["new_emotion"]["valence"]
@@ -680,11 +677,39 @@ def __feedback_stage(
680677
logger.debug(f"反馈阶段更新长期记忆:{response_dict['analyze_result']}")
681678

682679
# 更新对话状态
683-
if response_dict["new_chatting_state"] not in [0, 1, 2]:
680+
if not isinstance(response_dict["willing"], dict):
681+
raise ValueError("Feedback validation error: 'willing' is not a dict: " + str(response_dict))
682+
if not all(key in [0, 1, 2] for key in response_dict["willing"].keys()):
683+
raise ValueError("Feedback validation error: 'willing' keys are not 0, 1 or 2: " + str(response_dict))
684+
if not all(
685+
isinstance(value, int | float) and 0.0 <= value <= 1.0 for value in response_dict["willing"].values()
686+
):
684687
raise ValueError(
685-
"Feedback validation error: 'new_chatting_state' is not 0, 1 or 2: " + str(response_dict)
688+
"Feedback validation error: 'willing' values are not in range [0.0, 1.0]: " + str(response_dict)
686689
)
687-
self.__chatting_state = _ChattingState(response_dict["new_chatting_state"])
690+
# 评估转换到状态0的概率
691+
idle_chance = response_dict["willing"][0]
692+
# 评估转换到状态1的概率
693+
bubble_chance = response_dict["willing"][1]
694+
# 评估转换到状态2的概率
695+
chat_chance = response_dict["willing"][2]
696+
697+
random_value = random.uniform(0.0, 1.0)
698+
match self.__chatting_state:
699+
case _ChattingState.ILDE:
700+
if random_value > chat_chance:
701+
self.__chatting_state = _ChattingState.ACTIVE
702+
elif random_value > bubble_chance:
703+
self.__chatting_state = _ChattingState.POP_ACTIVE
704+
case _ChattingState.POP_ACTIVE:
705+
if random_value > chat_chance:
706+
self.__chatting_state = _ChattingState.ACTIVE
707+
elif random_value > idle_chance:
708+
self.__chatting_state = _ChattingState.ILDE
709+
case _ChattingState.ACTIVE:
710+
if random_value > idle_chance:
711+
self.__chatting_state = _ChattingState.ILDE
712+
688713
logger.debug(f"反馈阶段更新对话状态:{self.__chatting_state!s}")
689714
logger.debug("反馈阶段结束")
690715
except json.JSONDecodeError as e:
@@ -858,8 +883,15 @@ def update(self, messages_chunk: list[Message], llm: Callable[[str], str]) -> li
858883
case _ChattingState.ILDE:
859884
logger.debug("nyabot潜水中...")
860885
reply_messages = None
861-
case _ChattingState.POP_ACTIVE | _ChattingState.ACTIVE:
862-
logger.debug("nyabot活跃/冒泡中...")
886+
case _ChattingState.POP_ACTIVE:
887+
logger.debug("nyabot冒泡中...")
888+
reply_messages = self.__chat_stage(
889+
search_stage_result=search_stage_result,
890+
messages_chunk=messages_chunk,
891+
llm=llm,
892+
)
893+
case _ChattingState.ACTIVE:
894+
logger.debug("nyabot对话中...")
863895
reply_messages = self.__chat_stage(
864896
search_stage_result=search_stage_result,
865897
messages_chunk=messages_chunk,

0 commit comments

Comments
 (0)