# modules/response_generator.py from .ai_model import AIModel from .knowledge_base import KnowledgeBase class ResponseGenerator: def __init__(self, ai_model: AIModel, knowledge_base: KnowledgeBase): self.ai_model = ai_model self.kb = knowledge_base def generate(self, user_message: str, session_state: dict) -> str: # 1. 优先使用 RAG (检索增强生成) # 我们用目的地名称来强化检索查询 search_query = user_message if session_state.get("destination"): search_query += f" {session_state['destination']['name']}" relevant_knowledge = self.kb.search(search_query) if relevant_knowledge: context = self._format_knowledge_context(relevant_knowledge) return self.ai_model.generate(user_message, context) # 2. 如果没有知识库匹配,则使用基于规则的引导式对话 if not session_state.get("destination"): return "听起来很棒!你想去欧洲的哪个城市呢?比如巴黎, 罗马, 巴塞罗那?" if not session_state.get("duration"): return f"好的,{session_state['destination']['name']}是个很棒的选择!你计划玩几天呢?" if not session_state.get("persona"): return "最后一个问题,这次旅行对你来说什么最重要呢?(例如:美食、艺术、购物、历史)" # 3. 如果信息都收集全了,但没触发RAG,让Gemma生成一个通用计划 plan_prompt = ( f"请为用户生成一个在 {session_state['destination']['name']} 的 " f"{session_state['duration']['days']} 天旅行计划。" f"旅行风格侧重于: {session_state['persona']['description']}。" ) return self.ai_model.generate(plan_prompt, context="用户需要一个详细的旅行计划。") def _format_knowledge_context(self, knowledge_items: list) -> str: if not knowledge_items: return "没有特定的背景知识。" # 简化处理,只用最相关的一条知识 item = knowledge_items[0]['knowledge']['travel_knowledge'] context = f"相关知识:\n- 目的地: {item['destination_info']['primary_destinations']}\n" context += f"- 推荐天数: {item['destination_info']['recommended_duration']}天\n" context += f"- 专业见解: {item['professional_insights']['key_takeaways']}\n" return context