|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
"""
|
|
|
|
|
|
LLM 投資建議功能演示
|
|
|
|
|
|
|
|
|
|
|
|
展示如何使用LLM服務生成投資建議
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
import json
|
|
|
|
|
|
from unittest.mock import Mock
|
|
|
|
|
|
|
|
|
|
|
|
# 模擬環境變數
|
|
|
|
|
|
os.environ['OPENAI_API_KEY'] = 'sk-fake-key-for-demo'
|
|
|
|
|
|
|
|
|
|
|
|
from llm_service import LLMInvestmentAdvisor
|
|
|
|
|
|
from prompts.investment_advice import get_comprehensive_analysis_prompt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def demo_strategy_data():
|
|
|
|
|
|
"""模擬策略資料"""
|
|
|
|
|
|
return {
|
|
|
|
|
|
'id': 123,
|
|
|
|
|
|
'name': '科技成長策略',
|
|
|
|
|
|
'role': '最大化夏普比率',
|
|
|
|
|
|
'annual_ret': 0.28, # 年化28%報酬
|
|
|
|
|
|
'vol': 0.22, # 年化22%波動
|
|
|
|
|
|
'annual_sr': 1.95, # 夏普比率1.95
|
|
|
|
|
|
'mdd': -0.15, # 最大回落15%
|
|
|
|
|
|
'alpha': 0.12, # Alpha 12%
|
|
|
|
|
|
'beta': 1.05, # Beta 1.05
|
|
|
|
|
|
'var10': 0.08, # 10% VaR 8%
|
|
|
|
|
|
'r2': 0.89, # R-squared 89%
|
|
|
|
|
|
'gamma': 2.8, # Gamma 2.8
|
|
|
|
|
|
'assets': ['AAPL', 'MSFT', 'GOOGL', 'NVDA', 'TSLA'],
|
|
|
|
|
|
'tw': False, # 美國市場
|
|
|
|
|
|
'weight': {
|
|
|
|
|
|
'data': [[0.25, 0.20, 0.18, 0.22, 0.15]],
|
|
|
|
|
|
'columns': ['AAPL', 'MSFT', 'GOOGL', 'NVDA', 'TSLA'],
|
|
|
|
|
|
'index': ['2024-01-01']
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def demo_llm_service():
|
|
|
|
|
|
"""演示LLM服務"""
|
|
|
|
|
|
print("🤖 LLM 投資建議功能演示")
|
|
|
|
|
|
print("=" * 50)
|
|
|
|
|
|
|
|
|
|
|
|
# 模擬策略資料
|
|
|
|
|
|
strategy_data = demo_strategy_data()
|
|
|
|
|
|
|
|
|
|
|
|
print("\n📊 策略概況:")
|
|
|
|
|
|
print(f" 策略名稱:{strategy_data['name']}")
|
|
|
|
|
|
print(f" 投資目標:{strategy_data['role']}")
|
|
|
|
|
|
print(f" 年化報酬:{strategy_data['annual_ret']:.1%}")
|
|
|
|
|
|
print(f" 年化波動:{strategy_data['vol']:.1%}")
|
|
|
|
|
|
print(f" 夏普比率:{strategy_data['annual_sr']:.2f}")
|
|
|
|
|
|
print(f" 最大回落:{strategy_data['mdd']:.1%}")
|
|
|
|
|
|
print(f" 持有資產:{', '.join(strategy_data['assets'])}")
|
|
|
|
|
|
|
|
|
|
|
|
print("\n🔧 測試 Prompt 生成...")
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 直接調用函數,不使用快取
|
|
|
|
|
|
prompt = get_comprehensive_analysis_prompt(strategy_data)
|
|
|
|
|
|
print(f" ✅ Prompt 生成成功,長度:{len(prompt)} 字符")
|
|
|
|
|
|
print(" 📝 Prompt 預覽:")
|
|
|
|
|
|
print(f" {prompt[:200]}...")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f" ❌ Prompt 生成失敗:{e}")
|
|
|
|
|
|
print(f" 錯誤詳情:{str(e)}")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
print("\n🤖 測試 LLM 服務...")
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 由於是演示,我們使用模擬的OpenAI客戶端
|
|
|
|
|
|
advisor = LLMInvestmentAdvisor(api_key="fake-key")
|
|
|
|
|
|
|
|
|
|
|
|
# 模擬生成建議
|
|
|
|
|
|
demo_advice = advisor._get_fallback_advice(strategy_data)
|
|
|
|
|
|
print(" ✅ 建議生成成功:")
|
|
|
|
|
|
print(" " + "=" * 30)
|
|
|
|
|
|
print(f" {demo_advice}")
|
|
|
|
|
|
print(" " + "=" * 30)
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f" ❌ LLM 服務測試失敗:{e}")
|
|
|
|
|
|
|
|
|
|
|
|
print("\n📝 真實使用場景:")
|
|
|
|
|
|
print(" 1. 用戶訪問策略詳情頁面")
|
|
|
|
|
|
print(" 2. 點擊「🤖 LLM 投資建議」區塊")
|
|
|
|
|
|
print(" 3. 前端調用 /api/llm_advice/123")
|
|
|
|
|
|
print(" 4. 後端查詢策略資料並生成建議")
|
|
|
|
|
|
print(" 5. 顯示專業的投資分析報告")
|
|
|
|
|
|
|
|
|
|
|
|
print("\n⚙️ 設置說明:")
|
|
|
|
|
|
print(" 1. 設置 OPENAI_API_KEY 環境變數")
|
|
|
|
|
|
print(" 2. 選擇合適的模型 (GPT-4 或 GPT-3.5)")
|
|
|
|
|
|
print(" 3. 調整 prompt 模板以符合需求")
|
|
|
|
|
|
print(" 4. 監控 API 使用量和成本")
|
|
|
|
|
|
|
|
|
|
|
|
print("\n🚀 功能特色:")
|
|
|
|
|
|
print(" ✅ 智能投資分析")
|
|
|
|
|
|
print(" ✅ 風險評估報告")
|
|
|
|
|
|
print(" ✅ 市場適配建議")
|
|
|
|
|
|
print(" ✅ 快取機制")
|
|
|
|
|
|
print(" ✅ 錯誤處理")
|
|
|
|
|
|
print(" ✅ 專業UI介面")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def demo_prompt_templates():
|
|
|
|
|
|
"""演示不同的Prompt模板"""
|
|
|
|
|
|
print("\n🔧 Prompt 模板演示")
|
|
|
|
|
|
print("=" * 30)
|
|
|
|
|
|
|
|
|
|
|
|
strategy_data = demo_strategy_data()
|
|
|
|
|
|
|
|
|
|
|
|
templates = [
|
|
|
|
|
|
("基本分析", "basic"),
|
|
|
|
|
|
("全面分析", "comprehensive"),
|
|
|
|
|
|
("風險導向", "risk"),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
for name, template_type in templates:
|
|
|
|
|
|
print(f"\n{name}模板:")
|
|
|
|
|
|
try:
|
|
|
|
|
|
if template_type == "risk":
|
|
|
|
|
|
from prompts.investment_advice import get_risk_focused_prompt
|
|
|
|
|
|
prompt = get_risk_focused_prompt(strategy_data)
|
|
|
|
|
|
elif template_type == "comprehensive":
|
|
|
|
|
|
prompt = get_comprehensive_analysis_prompt(strategy_data)
|
|
|
|
|
|
else:
|
|
|
|
|
|
prompt = get_comprehensive_analysis_prompt(strategy_data) # fallback
|
|
|
|
|
|
|
|
|
|
|
|
print(f" 長度:{len(prompt)} 字符")
|
|
|
|
|
|
print(f" 預覽:{prompt[:100]}...")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f" ❌ 錯誤:{e}")
|
|
|
|
|
|
print(f" 錯誤詳情:{str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
demo_llm_service()
|
|
|
|
|
|
demo_prompt_templates()
|
|
|
|
|
|
|
|
|
|
|
|
print("\n" + "=" * 50)
|
|
|
|
|
|
print("🎉 LLM 投資建議功能演示完成!")
|
|
|
|
|
|
print("📖 詳細設置說明請參閱 LLM_SETUP.md")
|
|
|
|
|
|
print("🧪 運行測試:python test_llm_service.py")
|