66import json
77import os
88import pickle
9+ import random
910import re
1011import 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