linebot_pydantic_fastapi / test_pydantic_ai_integration.py
mickeywu520's picture
整合 Pydantic AI 框架並優化專案結構
7e828dc
"""
測試 Pydantic AI 整合 - 驗證商品查詢功能
特別測試 "是否有推薦貓砂?" 這類查詢的準確性
"""
import asyncio
import sys
import os
# 添加專案根目錄到 Python 路徑
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from backend.services.message_router import MessageRouter
from backend.services.pydantic_ai_service import ProductQueryService
from backend.services.enhanced_product_service import EnhancedProductService
def test_message_router():
"""測試訊息路由器"""
print("🧪 測試訊息路由器...")
router = MessageRouter()
# 測試案例
test_cases = [
"是否有推薦貓砂?",
"有什麼狗糧推薦?",
"查詢寵物用品庫存",
"iPhone 還有庫存嗎?",
"推薦一些好用的商品",
"你好!今天天氣如何?", # 應該路由到聊天模式
"/help", # 應該顯示幫助
]
for i, message in enumerate(test_cases, 1):
print(f"\n--- 測試案例 {i}: {message} ---")
try:
result = router.route_message(message, "test_user")
print(f"模式: {result.get('mode', 'unknown')}")
print(f"成功: {result.get('success', False)}")
print(f"回應: {result.get('text', 'No response')[:100]}...")
if result.get('products_found'):
print(f"找到商品數量: {result['products_found']}")
except Exception as e:
print(f"❌ 錯誤: {str(e)}")
# 顯示統計
print(f"\n📊 路由統計:")
stats = router.get_route_statistics()
for mode, count in stats['stats'].items():
print(f" {mode}: {count}")
def test_product_query_service():
"""測試 Pydantic AI 商品查詢服務"""
print("\n🛍️ 測試 Pydantic AI 商品查詢服務...")
try:
service = ProductQueryService()
if not service.is_available():
print("❌ Pydantic AI 服務不可用 (請檢查 GROQ_API_KEY)")
return
# 測試意圖分析
test_messages = [
"是否有推薦貓砂?",
"有什麼狗糧推薦?",
"查詢iPhone庫存",
"今天天氣如何?", # 非商品查詢
]
print("\n🔍 意圖分析測試:")
for message in test_messages:
intent = service.analyze_query_intent(message)
print(f" '{message}' -> 商品查詢: {intent['is_product_query']}, 信心度: {intent['confidence']:.2f}")
# 測試實際查詢
print("\n🛍️ 實際查詢測試:")
query_result = service.process_product_query_sync("是否有推薦貓砂?", "test_user")
print(f"成功: {query_result['success']}")
print(f"意圖: {query_result.get('intent', 'unknown')}")
print(f"回應: {query_result.get('text', 'No response')}")
if query_result.get('products_found'):
print(f"找到商品: {query_result['products_found']}")
except Exception as e:
print(f"❌ 測試錯誤: {str(e)}")
def test_enhanced_product_service():
"""測試增強商品服務"""
print("\n🔧 測試增強商品服務...")
try:
service = EnhancedProductService()
# 測試商品推薦
print("🎯 測試商品推薦功能:")
result = service.get_product_recommendations("貓砂", limit=5)
print(f"成功: {result.success}")
print(f"找到商品數量: {result.count}")
if result.success and result.data:
print("推薦商品:")
for i, product in enumerate(result.data[:3], 1):
print(f" {i}. {product.get('product_name', 'N/A')} - 庫存: {product.get('current_stock', 0)}")
elif result.error:
print(f"錯誤: {result.error}")
# 測試進階搜尋
print("\n🔍 測試進階搜尋功能:")
result = service.search_products_advanced("寵物", include_stock_info=True, limit=3)
print(f"成功: {result.success}")
print(f"找到商品數量: {result.count}")
if result.success and result.data:
print("搜尋結果:")
for i, product in enumerate(result.data, 1):
print(f" {i}. {product.get('product_name', 'N/A')} - {product.get('stock_status', 'N/A')}")
except Exception as e:
print(f"❌ 測試錯誤: {str(e)}")
def test_database_connection():
"""測試資料庫連接"""
print("\n🗄️ 測試資料庫連接...")
try:
from backend.database.connection import test_database_connection
if test_database_connection():
print("✅ 資料庫連接正常")
else:
print("❌ 資料庫連接失敗")
except Exception as e:
print(f"❌ 資料庫測試錯誤: {str(e)}")
def main():
"""主測試函數"""
print("🚀 開始 Pydantic AI 整合測試\n")
# 1. 測試資料庫連接
test_database_connection()
# 2. 測試增強商品服務
test_enhanced_product_service()
# 3. 測試 Pydantic AI 服務
test_product_query_service()
# 4. 測試訊息路由器
test_message_router()
print("\n✅ 測試完成!")
if __name__ == "__main__":
# 檢查環境變數
from backend.config import settings
print("🔧 環境檢查:")
print(f" GROQ_API_KEY: {'✅ 已設定' if settings.GROQ_API_KEY else '❌ 未設定'}")
print(f" DATABASE_URL: {'✅ 已設定' if settings.DATABASE_URL else '❌ 未設定'}")
print()
# 執行測試
main()