Spaces:
Sleeping
Sleeping
File size: 2,491 Bytes
af60cba |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# 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
|