Spaces:
Sleeping
Sleeping
| # 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 | |