linebot_pydantic_fastapi / debug_cat_litter_query.py
mickeywu520's picture
修正資料庫增強查詢
0254ce4
"""
緊急調試:貓砂查詢問題
"""
def debug_keyword_expansion():
"""調試關鍵字擴展邏輯"""
def extract_keywords_with_expansion(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]
# 擴展相關關鍵字
expanded_keywords = []
for keyword in keywords:
expanded_keywords.append(keyword)
# 貓砂相關擴展
if '貓砂' in keyword or '貓' in keyword:
expanded_keywords.extend(['礦砂', '豆腐砂', '水晶砂', '木屑砂', 'litter'])
# 狗糧相關擴展
if '狗糧' in keyword or '狗' in keyword:
expanded_keywords.extend(['犬糧', '犬種', '狗食', 'dog'])
# 寵物相關擴展
if '寵物' in keyword:
expanded_keywords.extend(['貓', '狗', '犬', 'pet', 'cat'])
return expanded_keywords if expanded_keywords else [query_text.strip()]
print("🔍 調試關鍵字擴展邏輯")
print("=" * 50)
test_query = "貓砂還有嗎?"
print(f"原始查詢: '{test_query}'")
keywords = extract_keywords_with_expansion(test_query)
print(f"擴展關鍵字: {keywords}")
return keywords
def debug_product_matching():
"""調試商品匹配邏輯"""
# 實際商品資料
products = [
{
"id": 2,
"productCode": "SW-06-01",
"productName": "Shovel well豪好鏟 破碎型礦砂",
"stock": 50,
"category_id": 1
},
{
"id": 3,
"productCode": "TL-03",
"productName": "美國極冠貓砂 薰衣草12kg",
"stock": 48,
"category_id": 1
}
]
print("\n🛍️ 調試商品匹配邏輯")
print("=" * 50)
keywords = debug_keyword_expansion()
print(f"\n商品資料:")
for product in products:
print(f" - {product['productName']}")
print(f"\n匹配測試:")
for keyword in keywords:
print(f"\n關鍵字: '{keyword}'")
matches = []
for product in products:
product_name_lower = product["productName"].lower()
product_code_lower = product["productCode"].lower()
keyword_lower = keyword.lower()
if (keyword_lower in product_name_lower or
keyword_lower in product_code_lower):
matches.append(product)
print(f" ✅ 匹配: {product['productName']}")
if not matches:
print(f" ❌ 無匹配")
return keywords
def debug_intent_analysis():
"""調試意圖分析邏輯"""
def analyze_query_intent_debug(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",
"matched_keywords": [kw for kw in product_keywords if kw in message_lower]
}
print("\n🤖 調試意圖分析邏輯")
print("=" * 50)
test_query = "貓砂還有嗎?"
print(f"查詢: '{test_query}'")
analysis = analyze_query_intent_debug(test_query)
print(f"商品查詢: {analysis['is_product_query']}")
print(f"推薦查詢: {analysis['is_recommendation']}")
print(f"庫存查詢: {analysis['is_inventory_check']}")
print(f"信心度: {analysis['confidence']:.2f}")
print(f"匹配的關鍵字: {analysis['matched_keywords']}")
return analysis
def debug_search_logic():
"""調試搜尋邏輯"""
print("\n🔍 調試搜尋邏輯")
print("=" * 50)
# 模擬 search_products_advanced 邏輯
def simulate_search_products_advanced(query_text: str):
"""模擬進階商品搜尋"""
# 1. 提取關鍵字
def extract_keywords_with_expansion(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]
expanded_keywords = []
for keyword in keywords:
expanded_keywords.append(keyword)
if '貓砂' in keyword or '貓' in keyword:
expanded_keywords.extend(['礦砂', '豆腐砂', '水晶砂', '木屑砂', 'litter'])
if '狗糧' in keyword or '狗' in keyword:
expanded_keywords.extend(['犬糧', '犬種', '狗食', 'dog'])
if '寵物' in keyword:
expanded_keywords.extend(['貓', '狗', '犬', 'pet', 'cat'])
return expanded_keywords if expanded_keywords else [query_text.strip()]
# 2. 商品資料
products = [
{
"id": 2,
"productCode": "SW-06-01",
"productName": "Shovel well豪好鏟 破碎型礦砂",
"stock": 50,
"is_deleted": False
},
{
"id": 3,
"productCode": "TL-03",
"productName": "美國極冠貓砂 薰衣草12kg",
"stock": 48,
"is_deleted": False
}
]
# 3. 搜尋邏輯
keywords = extract_keywords_with_expansion(query_text)
print(f"搜尋關鍵字: {keywords}")
matched_products = []
for product in products:
if product["is_deleted"]:
continue
# 檢查是否有任一關鍵字匹配
for keyword in keywords:
keyword_lower = keyword.lower()
product_name_lower = product["productName"].lower()
product_code_lower = product["productCode"].lower()
if (keyword_lower in product_name_lower or
keyword_lower in product_code_lower):
matched_products.append(product)
print(f" ✅ 匹配: {product['productName']} (關鍵字: {keyword})")
break # 找到匹配就跳出
return {
"success": True,
"data": matched_products,
"count": len(matched_products)
}
test_query = "貓砂還有嗎?"
result = simulate_search_products_advanced(test_query)
print(f"搜尋結果:")
print(f" 成功: {result['success']}")
print(f" 數量: {result['count']}")
if result['data']:
print(f" 找到的商品:")
for product in result['data']:
print(f" - {product['productName']} (庫存: {product['stock']})")
else:
print(f" ❌ 沒有找到商品")
def main():
"""主函數"""
print("🚨 緊急調試:貓砂查詢問題")
print("=" * 60)
# 1. 調試意圖分析
intent_analysis = debug_intent_analysis()
# 2. 調試關鍵字擴展和商品匹配
debug_product_matching()
# 3. 調試完整搜尋邏輯
debug_search_logic()
print("\n" + "=" * 60)
print("🔍 問題診斷結果:")
if intent_analysis["confidence"] >= 1.0:
print("✅ 意圖識別正常 (信心度 1.00)")
else:
print("❌ 意圖識別有問題")
print("\n💡 可能的問題:")
print("1. 關鍵字擴展邏輯是否正確執行?")
print("2. 資料庫查詢是否有錯誤?")
print("3. 商品資料是否正確載入?")
print("4. SQL 查詢條件是否正確?")
if __name__ == "__main__":
main()