Spaces:
Sleeping
Sleeping
improve: classifier improve
Browse files- modules/intent_classifier.py +39 -10
- modules/travel_assistant.py +4 -1
modules/intent_classifier.py
CHANGED
|
@@ -3,31 +3,59 @@ from .ai_model import AIModel
|
|
| 3 |
|
| 4 |
class IntentClassifier:
|
| 5 |
"""
|
| 6 |
-
|
| 7 |
它使用LLM来判断用户的消息属于预定义的哪个类别。
|
|
|
|
| 8 |
"""
|
| 9 |
|
| 10 |
def __init__(self, ai_model: AIModel):
|
| 11 |
self.ai_model = ai_model
|
| 12 |
-
|
|
|
|
| 13 |
|
| 14 |
def _build_prompt(self, message: str) -> str:
|
| 15 |
-
"""
|
|
|
|
|
|
|
| 16 |
return f"""
|
| 17 |
-
|
| 18 |
-
|
| 19 |
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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, {})
|