|
|
|
|
@ -0,0 +1,148 @@ |
|
|
|
|
#!/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") |