Eliot0110 commited on
Commit
86c5051
·
1 Parent(s): cdc4c48

improve: classifier improve

Browse files
modules/intent_classifier.py CHANGED
@@ -3,31 +3,59 @@ from .ai_model import AIModel
3
 
4
  class IntentClassifier:
5
  """
6
- 一个专门用于识别用户输入意uto的分类器。
7
  它使用LLM来判断用户的消息属于预定义的哪个类别。
 
8
  """
9
 
10
  def __init__(self, ai_model: AIModel):
11
  self.ai_model = ai_model
12
- self.VALID_INTENTS = ['PROVIDING_TRAVEL_INFO', 'GREETING', 'OTHER']
 
13
 
14
  def _build_prompt(self, message: str) -> str:
15
- """构建用于意图分类的、轻量级的Prompt。"""
 
 
16
  return f"""
17
- 你的任务是分析用户的单条消息,并判断其意图。
18
- 请从以下几个意图中选择一个最匹配的,并且只返回这个意图的字符串,不要添加任何其他解释或标点符号。
19
 
20
- 可用意图:
21
- - PROVIDING_TRAVEL_INFO: 用户明确提到了旅行相关的具体信息,如目的地、时间、预算、人数等。例如:"我想去巴黎玩一周" 或 "预算5000块钱"。
22
- - GREETING: 用户只是在打招呼或进行简单的问候。例如:"你好", "hi", "在吗?"。
23
- - OTHER: 不属于以上任何一种的通用查询或闲聊。例如:"法国有什么好玩的?" 或 "帮我订票"。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
  用户消息:
26
  ---
27
  {message}
28
  ---
29
 
30
- 你的判断结果 (请只返回一个意图字符串):
31
  """
32
 
33
  def classify(self, message: str) -> str:
@@ -53,3 +81,4 @@ class IntentClassifier:
53
  except Exception as e:
54
  log.error(f"❌ 意图分类时发生错误: {e}", exc_info=True)
55
  return 'OTHER'
 
 
3
 
4
  class IntentClassifier:
5
  """
6
+ 一个专门用于识别用户输入意图的分类器。
7
  它使用LLM来判断用户的消息属于预定义的哪个类别。
8
+ 【增强版】:内置了意图优先级规则,能处理混合意图。
9
  """
10
 
11
  def __init__(self, ai_model: AIModel):
12
  self.ai_model = ai_model
13
+ # 【修改】增加了 INQUIRY 意图,并调整了顺序以反映逻辑
14
+ self.VALID_INTENTS = ['PROVIDING_TRAVEL_INFO', 'INQUIRY', 'GREETING', 'OTHER']
15
 
16
  def _build_prompt(self, message: str) -> str:
17
+ """
18
+ 【修改】构建用于意图分类的、带有优先级规则和示例的Prompt。
19
+ """
20
  return f"""
21
+ # 角色
22
+ 你是一个专业的旅行助手对话意图分类器。
23
 
24
+ # 任务
25
+ 你的任务是分析用户的单条消息,并从以下类别中选择最符合用户核心意图的一个类别。你必须严格遵循“意图优先级”规则。
26
+
27
+ # 意图类别定义
28
+ - PROVIDING_TRAVEL_INFO: 用户明确提供了关于旅行计划的具体信息,如目的地、预算、时长、旅行同伴、兴趣点等。这是需要提取信息的最高优先级意图。
29
+ - INQUIRY: 用户在主动询问旅行建议、信息或请求帮助,但没有提供具体计划信息。例如:"法国有什么好玩的?" 或 "帮我规划一下行程"。
30
+ - GREETING: 用户主要在表达问候、打招呼或进行简单的寒暄。例如:"你好", "hi", "在吗?"。
31
+ - OTHER: 不属于以上任何一种的通用查询、闲聊或无法识别的意图。
32
+
33
+ # 核心规则:意图优先级
34
+ 当用户输入包含多种意图时,必须遵循以下优先级顺序进行分类:
35
+ PROVIDING_TRAVEL_INFO > INQUIRY > GREETING > OTHER
36
+
37
+ 这意味着:
38
+ 1. 只要用户提到了任何具体的旅行计划信息(地点、时间、预算等),意图就必须是 PROVIDING_TRAVEL_INFO。
39
+ 2. 如果没有提供具体信息,但有提问,意图就是 INQUIRY。
40
+ 3. 只有在几乎纯粹是打招呼时,意图才是 GREETING。
41
+
42
+ # 示例
43
+ - 用户输入: "你好,我想去东京玩" -> 分类: PROVIDING_TRAVEL_INFO
44
+ - 用户输入: "Hi, 巴黎有什么推荐的吗?" -> 分类: INQUIRY
45
+ - 用户输入: "周末愉快!" -> 分类: GREETING
46
+ - 用户输入: "我们预算不多,大概3000元,目的地是成都。" -> 分类: PROVIDING_TRAVEL_INFO
47
+ - 用户输入: "你好在吗" -> 分类: GREETING
48
+ - 用户输入: "随便聊聊" -> 分类: OTHER
49
+
50
+ # 分析与决策
51
+ 请分析以下用户消息,并根据上述规则做出唯一的意图判断。
52
 
53
  用户消息:
54
  ---
55
  {message}
56
  ---
57
 
58
+ 你的判断结果 (请只返回一个意图字符串: PROVIDING_TRAVEL_INFO, INQUIRY, GREETING, 或 OTHER):
59
  """
60
 
61
  def classify(self, message: str) -> str:
 
81
  except Exception as e:
82
  log.error(f"❌ 意图分类时发生错误: {e}", exc_info=True)
83
  return 'OTHER'
84
+
modules/travel_assistant.py CHANGED
@@ -21,6 +21,7 @@ class TravelAssistant:
21
  self.response_generator = ResponseGenerator(self.ai_model, self.kb)
22
  log.info("✅ Travel Assistant 核心模块全部初始化完成!")
23
 
 
24
  def chat(self, message: str, session_id: str, history: list, persona_key: str = None):
25
  log.info(f"📞 === 聊天请求开始 ===")
26
  log.info(f"📝 消息: '{message[:30]}...'")
@@ -74,7 +75,9 @@ class TravelAssistant:
74
  # 场景B: 用户意图是问候或其它,直接生成引导性回复,完全绕过信息提取
75
  log.info(f"💬 意图为 '{intent}',绕过信息提取,直接生成引导性回复。")
76
  if intent == 'GREETING':
77
- bot_response = "您好!很高兴能为您规划旅程。请问您想去哪里,玩几天,预算大概是多少呢?"
 
 
78
  else: # 'OTHER'
79
  # 对于其它问题,可以调用通用的生成器,让它决定如何回复
80
  bot_response = self.response_generator.generate(message, session_state, {})
 
21
  self.response_generator = ResponseGenerator(self.ai_model, self.kb)
22
  log.info("✅ Travel Assistant 核心模块全部初始化完成!")
23
 
24
+
25
  def chat(self, message: str, session_id: str, history: list, persona_key: str = None):
26
  log.info(f"📞 === 聊天请求开始 ===")
27
  log.info(f"📝 消息: '{message[:30]}...'")
 
75
  # 场景B: 用户意图是问候或其它,直接生成引导性回复,完全绕过信息提取
76
  log.info(f"💬 意图为 '{intent}',绕过信息提取,直接生成引导性回复。")
77
  if intent == 'GREETING':
78
+ bot_response = "您好!很高兴能为您规划旅程。请问您想去哪里,玩几天,预算大概是多少呢?您可以输入:我想去巴黎玩三天"
79
+ elif intent == 'INQUIRY':
80
+ bot_response = "当然!为了给您更精准的推荐,可以告诉我您的兴趣偏好吗?比如您对历史文化、自然风光、美食购物还是夜生活更感兴趣呢?这样我才能更好地为您量身定制哦!"
81
  else: # 'OTHER'
82
  # 对于其它问题,可以调用通用的生成器,让它决定如何回复
83
  bot_response = self.response_generator.generate(message, session_state, {})