linebot_pydantic_fastapi / test_final_fix.py
mickeywu520's picture
修正資料庫增強查詢
0254ce4
"""
測試最終修復版本
"""
def test_final_keyword_extraction():
"""測試最終修復的關鍵字提取"""
def extract_keywords_final(query_text: str):
"""最終修復版的關鍵字提取邏輯"""
# 移除常見的查詢詞彙
stop_words = ['推薦', '有沒有', '是否有', '請問', '想要', '需要', '找', '查詢', '搜尋', '還有嗎', '還有', '嗎']
# 清理查詢文字
cleaned_text = query_text.replace('?', '').replace('?', '').strip()
# 分割並清理關鍵字
words = cleaned_text.split()
keywords = []
for word in words:
if word not in stop_words and len(word) > 1:
keywords.append(word)
# 如果沒有有效關鍵字,嘗試從原始文字中提取核心詞彙
if not keywords:
# 嘗試提取核心商品詞彙
core_words = ['貓砂', '狗糧', '寵物', '商品', '產品']
for core_word in core_words:
if core_word in cleaned_text:
keywords.append(core_word)
break
# 如果還是沒有,使用清理後的文字
if not keywords:
keywords = [cleaned_text]
# 擴展相關關鍵字
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 list(set(expanded_keywords))
print("🔧 測試最終修復的關鍵字提取邏輯")
print("=" * 50)
test_cases = [
"貓砂還有嗎?",
"是否有推薦貓砂?",
"有什麼寵物用品?",
"查詢狗糧庫存",
"美國極冠",
"礦砂"
]
for query in test_cases:
print(f"\n查詢: '{query}'")
keywords = extract_keywords_final(query)
print(f"關鍵字: {keywords}")
# 檢查是否包含預期的關鍵字
if query == "貓砂還有嗎?":
if '貓砂' in keywords and '礦砂' in keywords:
print(" ✅ 包含預期的貓砂相關關鍵字")
else:
print(" ❌ 缺少預期的關鍵字")
def test_complete_flow():
"""測試完整的查詢流程"""
def extract_keywords_final(query_text: str):
stop_words = ['推薦', '有沒有', '是否有', '請問', '想要', '需要', '找', '查詢', '搜尋', '還有嗎', '還有', '嗎']
cleaned_text = query_text.replace('?', '').replace('?', '').strip()
words = cleaned_text.split()
keywords = [word for word in words if word not in stop_words and len(word) > 1]
if not keywords:
core_words = ['貓砂', '狗糧', '寵物', '商品', '產品']
for core_word in core_words:
if core_word in cleaned_text:
keywords.append(core_word)
break
if not keywords:
keywords = [cleaned_text]
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 list(set(expanded_keywords))
# 實際商品資料
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
}
]
print("\n🛍️ 測試完整查詢流程")
print("=" * 50)
test_query = "貓砂還有嗎?"
print(f"用戶查詢: '{test_query}'")
# 1. 關鍵字提取
keywords = extract_keywords_final(test_query)
print(f"提取關鍵字: {keywords}")
# 2. 商品匹配
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):
if product not in matched_products:
matched_products.append(product)
print(f" ✅ 匹配: {product['productName']} (關鍵字: {keyword})")
break
# 3. 格式化回應
if matched_products:
response_text = f"為您推薦 {len(matched_products)} 個商品:\n\n"
for i, product in enumerate(matched_products, 1):
response_text += f"{i}. {product['productName']}\n"
response_text += f" 庫存: {product['stock']} - 庫存正常\n"
response_text += f" 商品編號: {product['productCode']}\n\n"
print(f"\n📝 格式化回應:")
print(response_text)
print("✅ 應該能找到商品了!")
else:
print("\n❌ 仍然沒有找到商品")
def main():
"""主函數"""
print("🚀 測試最終修復版本")
print("=" * 60)
test_final_keyword_extraction()
test_complete_flow()
print("\n" + "=" * 60)
print("✅ 測試完成!")
print("\n💡 修復總結:")
print("1. 正確處理 '貓砂還有嗎?' → ['貓砂']")
print("2. 擴展為相關關鍵字: ['貓砂', '礦砂', ...]")
print("3. 能匹配到兩個貓砂商品")
print("4. 現在重啟服務應該能正常工作")
if __name__ == "__main__":
main()