File size: 3,510 Bytes
c40cb3f
6d36a0d
 
 
 
0e97bbc
6d36a0d
 
 
 
 
0e97bbc
6d36a0d
 
0e97bbc
6d36a0d
303c885
 
6d36a0d
303c885
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d36a0d
 
 
 
 
 
303c885
6d36a0d
 
 
 
 
 
 
 
 
0e97bbc
6d36a0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86c5051
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from utils.logger import log
from .ai_model import AIModel

class IntentClassifier:
    """
    一个专门用于识别用户输入意uto的分类器。
    它使用LLM来判断用户的消息属于预定义的哪个类别。
    """

    def __init__(self, ai_model: AIModel):
        self.ai_model = ai_model
        self.VALID_INTENTS = ['PROVIDING_TRAVEL_INFO', 'GREETING', 'OTHER']

    def _build_prompt(self, message: str) -> str:
        """构建用于意图分类的、轻量级的Prompt。"""
        return f"""
# 角色
你是一个专业的旅行助手对话意图分类器。

# 任务
你的任务是分析用户的单条消息,并从以下类别中选择最符合用户核心意图的一个类别。你必须严格遵循“意图优先级”规则。

# 意图类别定义
- PROVIDING_TRAVEL_INFO: 用户明确提供了关于旅行计划的具体信息,如目的地、预算、时长、旅行同伴、兴趣点等。这是需要提取信息的最高优先级意图。
- INQUIRY: 用户在主动询问旅行建议、信息或请求帮助,但没有提供具体计划信息。例如:"法国有什么好玩的?" 或 "帮我规划一下行程"。
- GREETING: 用户主要在表达问候、打招呼或进行简单的寒暄。例如:"你好", "hi", "在吗?"。
- OTHER: 不属于以上任何一种的通用查询、闲聊或无法识别的意图。

# 核心规则:意图优先级
当用户输入包含多种意图时,必须遵循以下优先级顺序进行分类:
PROVIDING_TRAVEL_INFO > INQUIRY > GREETING > OTHER

这意味着:
1. 只要用户提到了任何具体的旅行计划信息(地点、时间、预算等),意图就必须是 PROVIDING_TRAVEL_INFO。
2. 如果没有提供具体信息,但有提问,意图就是 INQUIRY。
3. 只有在几乎纯粹是打招呼时,意图才是 GREETING。

# 示例
- 用户输入: "你好,我想去东京玩" -> 分类: PROVIDING_TRAVEL_INFO
- 用户输入: "Hi, 巴黎有什么推荐的吗?" -> 分类: INQUIRY
- 用户输入: "周末愉快!" -> 分类: GREETING
- 用户输入: "我们预算不多,大概3000元,目的地是成都。" -> 分类: PROVIDING_TRAVEL_INFO
- 用户输入: "你好在吗" -> 分类: GREETING
- 用户输入: "随便聊聊" -> 分类: OTHER

# 分析与决策
请分析以下用户消息,并根据上述规则做出唯一的意图判断。

用户消息:
---
{message}
---

你的判断结果 (请只返回一个意图字符串: PROVIDING_TRAVEL_INFO, INQUIRY, GREETING, 或 OTHER):
"""

    def classify(self, message: str) -> str:
        """对给定的消息进行意图分类。"""
        log.info(f"🚀 开始对消息进行意图分类: '{message[:30]}...'")
        prompt = self._build_prompt(message)
        
        try:
            response = self.ai_model.chat_completion(
                model="gpt-3.5-turbo",
                messages=[{"role": "user", "content": prompt}],
                temperature=0.0,
                max_tokens=10
            )
            intent = response.strip().replace("'", "").replace("\"", "")
            
            if intent in self.VALID_INTENTS:
                log.info(f"✅ 意图分类成功: {intent}")
                return intent
            else:
                log.warning(f"⚠️ LLM返回了未知的意图 '{intent}',将回退到 'OTHER'")
                return 'OTHER'
        except Exception as e:
            log.error(f"❌ 意图分类时发生错误: {e}", exc_info=True)
            return 'OTHER'