File size: 6,169 Bytes
89879a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
"""
測試意圖識別邏輯 - 不依賴外部套件
"""

def test_product_intent_logic():
    """測試商品意圖識別邏輯"""
    
    def analyze_query_intent_simple(message: str):
        """簡化版的意圖分析"""
        message_lower = message.lower()
        
        # 商品查詢關鍵字(擴展版)
        product_keywords = [
            '推薦', '有沒有', '是否有', '請問有', '商品', '產品', '貨品', 
            '查詢', '搜尋', '找', '庫存', '存貨', '價格', '多少錢',
            '貓砂', '狗糧', '寵物', '食品', '用品', '貓', '狗', '寵物用品',
            'cat', 'dog', 'pet', 'litter', 'food'  # 英文關鍵字
        ]
        
        # 推薦查詢關鍵字
        recommendation_keywords = ['推薦', '建議', '介紹', '有什麼', '哪些', '什麼好', '推薦一些']
        
        # 庫存查詢關鍵字
        inventory_keywords = ['庫存', '存貨', '剩餘', '還有', '現貨', '有多少', '剩多少']
        
        is_product_query = any(keyword in message_lower for keyword in product_keywords)
        is_recommendation = any(keyword in message_lower for keyword in recommendation_keywords)
        is_inventory_check = any(keyword in message_lower for keyword in inventory_keywords)
        
        confidence = 0.5
        if is_product_query:
            confidence += 0.3
        if is_recommendation:
            confidence += 0.2
        if is_inventory_check:
            confidence += 0.2
        
        return {
            "is_product_query": is_product_query,
            "is_recommendation": is_recommendation,
            "is_inventory_check": is_inventory_check,
            "confidence": min(confidence, 1.0),
            "intent": "product_query" if is_product_query else "unknown"
        }
    
    def quick_intent_check_simple(message: str):
        """簡化版的快速意圖檢查"""
        message_lower = message.lower()
        
        # 幫助相關關鍵字(優先處理)
        help_keywords = ['幫助', 'help', '說明', '怎麼用', '指令', '功能', '統計', 'stats', '選單', 'menu']
        
        # 非商品的業務查詢關鍵字(避免與商品查詢衝突)
        business_keywords = [
            '訂單狀態', '訂單查詢', '我的訂單', '交易記錄', '購買記錄',
            '客戶資料', '會員資料', '帳戶資訊', '銷售報表', '財務報表'
        ]
        
        if any(keyword in message_lower for keyword in help_keywords):
            return "help"
        elif any(keyword in message_lower for keyword in business_keywords):
            return "search"
        else:
            # 預設返回 "chat",讓 Pydantic AI 有機會處理商品查詢
            return "chat"
    
    # 測試案例
    test_messages = [
        "你好, 請問有沒有貓砂相關產品?",
        "是否有推薦貓砂?",
        "有什麼寵物用品?",
        "查詢狗糧庫存",
        "貓砂還有嗎?",
        "推薦一些好的貓砂",
        "你好!今天天氣如何?",  # 非商品查詢
        "/help",
        "統計",
        "我的訂單狀態"
    ]
    
    print("🧪 測試意圖識別邏輯")
    print("=" * 80)
    
    for i, message in enumerate(test_messages, 1):
        print(f"\n{i}. 測試訊息: '{message}'")
        
        # 1. 快速意圖檢查
        quick_intent = quick_intent_check_simple(message)
        print(f"   快速意圖: {quick_intent}")
        
        # 2. Pydantic AI 意圖分析
        product_intent = analyze_query_intent_simple(message)
        print(f"   商品查詢: {product_intent['is_product_query']}")
        print(f"   推薦查詢: {product_intent['is_recommendation']}")
        print(f"   庫存查詢: {product_intent['is_inventory_check']}")
        print(f"   信心度: {product_intent['confidence']:.2f}")
        
        # 3. 路由決策模擬
        should_use_pydantic_ai = (
            product_intent["is_product_query"] and 
            product_intent["confidence"] > 0.5
        )
        
        if quick_intent == "help":
            final_route = "幫助模式"
        elif should_use_pydantic_ai:
            final_route = "🛍️ Pydantic AI 商品查詢"
        elif quick_intent == "search":
            final_route = "傳統搜尋模式"
        else:
            final_route = "聊天模式"
        
        print(f"   👉 最終路由: {final_route}")
        
        # 特別標記貓砂相關查詢
        if "貓砂" in message or "貓" in message:
            print(f"   🐱 貓砂查詢檢測: {'✅ 應該被 Pydantic AI 處理' if should_use_pydantic_ai else '❌ 可能被錯誤路由'}")

def test_keyword_extraction():
    """測試關鍵字提取邏輯"""
    
    def extract_keywords_simple(query_text: str):
        """簡化版關鍵字提取"""
        # 移除常見的查詢詞彙
        stop_words = ['推薦', '有沒有', '是否有', '請問', '想要', '需要', '找', '查詢', '搜尋', '?', '?']
        
        # 分割並清理關鍵字
        words = query_text.replace('?', '').replace('?', '').split()
        keywords = [word for word in words if word not in stop_words and len(word) > 1]
        
        return keywords if keywords else [query_text.strip()]
    
    print(f"\n\n🔍 測試關鍵字提取")
    print("=" * 50)
    
    test_queries = [
        "你好, 請問有沒有貓砂相關產品?",
        "是否有推薦貓砂?",
        "有什麼寵物用品?",
        "查詢狗糧庫存"
    ]
    
    for query in test_queries:
        keywords = extract_keywords_simple(query)
        print(f"'{query}' → {keywords}")

def main():
    """主函數"""
    print("🚀 開始意圖識別測試\n")
    
    test_product_intent_logic()
    test_keyword_extraction()
    
    print("\n" + "=" * 80)
    print("✅ 測試完成!")
    print("\n💡 分析結果:")
    print("1. 檢查貓砂相關查詢是否被正確識別為商品查詢")
    print("2. 確認信心度是否超過 0.5 閾值")
    print("3. 驗證路由決策是否正確")

if __name__ == "__main__":
    main()