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