| 
														
															@@ -3,7 +3,7 @@ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 # vim:fenc=utf-8 
														 | 
														
														 | 
														
															 # vim:fenc=utf-8 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import json 
														 | 
														
														 | 
														
															 import json 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-from typing import Dict, Any, Optional 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+from typing import Dict, Any, Optional, List 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import chat_service 
														 | 
														
														 | 
														
															 import chat_service 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import configs 
														 | 
														
														 | 
														
															 import configs 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -18,7 +18,7 @@ class UserProfileExtractor: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             api_key=chat_service.VOLCENGINE_API_TOKEN, 
														 | 
														
														 | 
														
															             api_key=chat_service.VOLCENGINE_API_TOKEN, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             base_url=chat_service.VOLCENGINE_BASE_URL 
														 | 
														
														 | 
														
															             base_url=chat_service.VOLCENGINE_BASE_URL 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         ) 
														 | 
														
														 | 
														
															         ) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        self.model_name = chat_service.VOLCENGINE_MODEL_DOUBAO_PRO_1_5 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        self.model_name = chat_service.VOLCENGINE_MODEL_DEEPSEEK_V3 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     def get_extraction_function(self) -> Dict: 
														 | 
														
														 | 
														
															     def get_extraction_function(self) -> Dict: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         """ 
														 | 
														
														 | 
														
															         """ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -38,7 +38,7 @@ class UserProfileExtractor: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                         }, 
														 | 
														
														 | 
														
															                         }, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                         "preferred_nickname": { 
														 | 
														
														 | 
														
															                         "preferred_nickname": { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                             "type": "string", 
														 | 
														
														 | 
														
															                             "type": "string", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                            "description": "用户希望对其的称呼,如果能够准确识别" 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                            "description": "用户希望对其的称呼,如果用户明确提到" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                         }, 
														 | 
														
														 | 
														
															                         }, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                         "gender": { 
														 | 
														
														 | 
														
															                         "gender": { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                             "type": "string", 
														 | 
														
														 | 
														
															                             "type": "string", 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -72,15 +72,27 @@ class UserProfileExtractor: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             } 
														 | 
														
														 | 
														
															             } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    def generate_extraction_prompt(self, user_profile: Dict, dialogue_history: str) -> str: 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    def generate_extraction_prompt(self, user_profile: Dict, dialogue_history: List[Dict]) -> str: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         """ 
														 | 
														
														 | 
														
															         """ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         生成用于信息提取的系统提示词 
														 | 
														
														 | 
														
															         生成用于信息提取的系统提示词 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         """ 
														 | 
														
														 | 
														
															         """ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         context = user_profile.copy() 
														 | 
														
														 | 
														
															         context = user_profile.copy() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        context['dialogue_history'] = dialogue_history 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        context['dialogue_history'] = self.compose_dialogue(dialogue_history) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return USER_PROFILE_EXTRACT_PROMPT.format(**context) 
														 | 
														
														 | 
														
															         return USER_PROFILE_EXTRACT_PROMPT.format(**context) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    def extract_profile_info(self, user_profile, dialogue_history: str) -> Optional[Dict]: 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    @staticmethod 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    def compose_dialogue(dialogue: List[Dict]) -> str: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        role_map = {'user': '用户', 'assistant': '客服'} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        messages = [] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        for msg in dialogue: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            if not msg['content']: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                continue 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            if msg['role'] not in role_map: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                continue 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            messages.append('[{}] {}'.format(role_map[msg['role']], msg['content'])) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        return '\n'.join(messages) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    def extract_profile_info(self, user_profile, dialogue_history: List[Dict]) -> Optional[Dict]: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         """ 
														 | 
														
														 | 
														
															         """ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         使用Function Calling提取用户画像信息 
														 | 
														
														 | 
														
															         使用Function Calling提取用户画像信息 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         """ 
														 | 
														
														 | 
														
															         """ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -89,11 +101,12 @@ class UserProfileExtractor: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															         try: 
														 | 
														
														 | 
														
															         try: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             logger.debug("try to extract profile from message: {}".format(dialogue_history)) 
														 | 
														
														 | 
														
															             logger.debug("try to extract profile from message: {}".format(dialogue_history)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            prompt = self.generate_extraction_prompt(user_profile, dialogue_history) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             response = self.llm_client.chat.completions.create( 
														 | 
														
														 | 
														
															             response = self.llm_client.chat.completions.create( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 model=self.model_name, 
														 | 
														
														 | 
														
															                 model=self.model_name, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 messages=[ 
														 | 
														
														 | 
														
															                 messages=[ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                     {"role": "system", "content": '你是一个专业的用户画像分析助手。'}, 
														 | 
														
														 | 
														
															                     {"role": "system", "content": '你是一个专业的用户画像分析助手。'}, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                    {"role": "user", "content": self.generate_extraction_prompt(user_profile, dialogue_history)} 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    {"role": "user", "content": prompt} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 ], 
														 | 
														
														 | 
														
															                 ], 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 tools=[self.get_extraction_function()], 
														 | 
														
														 | 
														
															                 tools=[self.get_extraction_function()], 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 temperature=0 
														 | 
														
														 | 
														
															                 temperature=0 
														 |