فهرست منبع

Update dialogue_manager: optimize coze messages

StrayWarrior 1 هفته پیش
والد
کامیت
d29e80c679
1فایلهای تغییر یافته به همراه41 افزوده شده و 13 حذف شده
  1. 41 13
      dialogue_manager.py

+ 41 - 13
dialogue_manager.py

@@ -486,6 +486,20 @@ class DialogueManager:
             messages.append({'role': 'assistant', 'content': msg_prefix})
         elif chat_service_type == ChatServiceType.COZE_CHAT:
             dialogue_history = dialogue_history[-95:] # Coze最多支持100条,还需要附加系统消息
+            # 如果system后的第1条消息不为user,需要补一条user消息
+            if len(dialogue_history) > 0 and dialogue_history[0]['role'] != 'user':
+                fmt_time = self.format_timestamp(dialogue_history[0]['timestamp'])
+                messages.append(cozepy.Message.build_user_question_text(f'[{fmt_time}] '))
+            # coze最后一条消息必须为user,且可能吞掉连续的user消息,故强制增加一条空消息(可参与合并)
+            current_time = overwrite_context.get('current_time', datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
+            dialogue_history.append({
+                'role': 'user',
+                'content': ' ',
+                'timestamp': int(datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S').timestamp() * 1000),
+            })
+            # 将连续的同一角色的消息做聚合,避免coze吞消息
+            messages_to_aggr = []
+            last_message_role = None
             for entry in dialogue_history:
                 if not entry['content']:
                     logger.warning("staff[{}], user[{}], role[{}]: empty content in dialogue history".format(
@@ -493,12 +507,16 @@ class DialogueManager:
                     ))
                     continue
                 role = entry['role']
-                fmt_time = self.format_timestamp(entry['timestamp'])
-                content = '[{}] {}'.format(fmt_time, entry["content"])
-                if role == 'user':
-                    messages.append(cozepy.Message.build_user_question_text(content))
-                elif role == 'assistant':
-                    messages.append(cozepy.Message.build_assistant_answer(content))
+                if role != last_message_role:
+                    if messages_to_aggr:
+                        aggregated_message = '\n'.join(messages_to_aggr)
+                        messages.append(self.build_chat_message(last_message_role, aggregated_message, chat_service_type))
+                    messages_to_aggr = []
+                    last_message_role = role
+                messages_to_aggr.append(self.format_dialogue_content(entry))
+            if messages_to_aggr:
+                aggregated_message = '\n'.join(messages_to_aggr)
+                messages.append(self.build_chat_message(last_message_role, aggregated_message, chat_service_type))
             custom_variables = {}
             for k, v in prompt_context.items():
                 custom_variables[k] = str(v)
@@ -506,13 +524,6 @@ class DialogueManager:
             config['custom_variables'] = custom_variables
             config['bot_id'] = self._select_coze_bot(self.current_state)
 
-            msg_prefix = '[{}]'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
-            messages.append(cozepy.Message.build_assistant_answer(msg_prefix))
-            #FIXME(zhoutian): 这种方法并不可靠,需要结合状态来判断
-            if self.current_state == DialogueState.GREETING and not messages:
-                # messages.append(cozepy.Message.build_user_question_text(f'{msg_prefix} 请开始对话'))
-                pass
-
         #FIXME(zhoutian): 临时报警
         if user_message and not messages:
             logger.error(f"staff[{self.staff_id}], user[{self.user_id}]: inconsistency in messages")
@@ -524,6 +535,23 @@ class DialogueManager:
     def format_timestamp(timestamp_ms):
         return datetime.fromtimestamp(timestamp_ms / 1000).strftime("%Y-%m-%d %H:%M:%S")
 
+    @staticmethod
+    def format_dialogue_content(dialogue_entry):
+        fmt_time = DialogueManager.format_timestamp(dialogue_entry['timestamp'])
+        content = '[{}] {}'.format(fmt_time, dialogue_entry['content'])
+        return content
+
+    @staticmethod
+    def build_chat_message(role, content, chat_service_type: ChatServiceType):
+        if chat_service_type == ChatServiceType.COZE_CHAT:
+            if role == 'user':
+                return cozepy.Message.build_user_question_text(content)
+            elif role == 'assistant':
+                return cozepy.Message.build_assistant_answer(content)
+        else:
+            return {'role': role, 'content': content}
+
+
 if __name__ == '__main__':
     state_cache = DialogueStateCache()
     state_cache.set_state('1688854492669990', '7881302581935903', DialogueState.CHITCHAT, DialogueState.GREETING)