# 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