Spaces:
Sleeping
Sleeping
| # modules/travel_assistant.py - 正确版本 | |
| from .config_loader import ConfigLoader | |
| from .ai_model import AIModel | |
| from .knowledge_base import KnowledgeBase | |
| from .intent_classifier import IntentClassifier | |
| from .info_extractor import InfoExtractor | |
| from .session_manager import SessionManager | |
| from .response_generator import ResponseGenerator | |
| from utils.logger import log | |
| class TravelAssistant: | |
| def __init__(self): | |
| # 依赖注入:在这里实例化所有需要的模块 | |
| log.info("开始初始化 Travel Assistant 核心模块...") | |
| self.config = ConfigLoader() | |
| self.kb = KnowledgeBase() | |
| self.ai_model = AIModel() | |
| self.session_manager = SessionManager() | |
| self.info_extractor = InfoExtractor() | |
| self.intent_classifier = IntentClassifier(self.ai_model) | |
| self.response_generator = ResponseGenerator(self.ai_model, self.kb) | |
| log.info("✅ Travel Assistant 核心模块全部初始化完成!") | |
| def chat(self, message: str, session_id: str, history: list, persona_key: str = None): | |
| log.info(f"📞 === 聊天请求开始 ===") | |
| log.info(f"📝 消息: '{message[:30]}...'") | |
| log.info(f"🆔 前端传入session_id: '{session_id}'") | |
| log.info(f"🎭 persona_key: '{persona_key}'") | |
| # 1. 获取或创建会话 | |
| session_state = self.session_manager.get_or_create_session(session_id) | |
| current_session_id = session_state['session_id'] | |
| log.info(f"📋 使用后端session_id: '{current_session_id}'") | |
| # 2. 设置persona | |
| if persona_key and persona_key in self.config.personas: | |
| persona_info = { | |
| 'key': persona_key, | |
| 'name': self.config.personas[persona_key]['name'], | |
| 'style': self.config.personas[persona_key]['style'], | |
| 'source': 'frontend_selection' | |
| } | |
| self.session_manager.update_session(current_session_id, {'persona': persona_info}) | |
| session_state = self.session_manager.get_or_create_session(current_session_id) | |
| log.info(f"✅ 设置persona: {persona_info['name']}") | |
| # 3. 意图识别 (前置守卫) | |
| raw_intent = self.intent_classifier.classify(message) | |
| log.info(f"🔍 用户意图识别结果: '{raw_intent}'") | |
| extracted_info = {} | |
| intent = 'OTHER' | |
| if 'PROVIDING_TRAVEL_INFO' in raw_intent: | |
| intent = 'PROVIDING_TRAVEL_INFO' | |
| elif 'GREETING' in raw_intent: | |
| intent = 'GREETING' | |
| log.info(f"✅ 解析后用户意图: '{intent}'") | |
| # 4.: 根据意图进行逻辑分流 | |
| if intent == 'PROVIDING_TRAVEL_INFO': | |
| # 场景A: 用户提供了旅行信息,执行完整的信息提取 | |
| extracted_info = self.info_extractor.extract(message) | |
| if extracted_info: | |
| self.session_manager.update_session(current_session_id, extracted_info) | |
| session_state = self.session_manager.get_or_create_session(current_session_id) | |
| # 无论是否提取成功,都让 response_generator 来生成上下文感知的回复 | |
| bot_response = self.response_generator.generate(message, session_state, extracted_info) | |
| else: | |
| # 场景B: 用户意图是问候或其它,直接生成引导性回复,完全绕过信息提取 | |
| log.info(f"💬 意图为 '{intent}',绕过信息提取,直接生成引导性回复。") | |
| if intent == 'GREETING': | |
| bot_response = "您好!很高兴能为您规划旅程。请问您想去哪里,玩几天,预算大概是多少呢?您可以输入:我想去巴黎玩三天" | |
| elif intent == 'INQUIRY': | |
| bot_response = "当然!为了给您更精准的推荐,可以告诉我您的兴趣偏好吗?比如您对历史文化、自然风光、美食购物还是夜生活更感兴趣呢?这样我才能更好地为您量身定制哦!" | |
| else: # 'OTHER' | |
| # 对于其它问题,可以调用通用的生成器,让它决定如何回复 | |
| bot_response = self.response_generator.generate(message, session_state, {}) | |
| # 6. 返回结果 | |
| status_info = self.session_manager.format_session_info(session_state) | |
| new_history = history + [[message, bot_response]] | |
| log.info(f"✅ 聊天完成,返回session_id: {current_session_id}") | |
| log.info(f"📊 最终状态: {self.session_manager._get_session_summary(current_session_id)}") | |
| log.info(f"📞 === 聊天请求结束 ===") | |
| return bot_response, current_session_id, status_info, new_history |