business_agent/ ├── __init__.py # 讓後端 import BusinessAgent ├── agent.py # 主程式(下面全部內容) ├── schemas.py # 所有 Pydantic 結構(安全、意圖) ├── prompts.py # 你未來要填的真實 prompt(目前放 placeholder) └── config.py # 可設定 model、temperature 等 1. business_agent/config.py from dataclasses import dataclass @dataclass class AgentConfig: model: str = "gpt-4o-mini-2024-11-08" # 支援最新 Responses API temperature_safety: float = 0.0 temperature_intent: float = 0.0 temperature_rag: float = 0.3 max_tokens: int = 2048 2. business_agent/schemas.py from pydantic import BaseModel, Field from typing import Literal, Optional, Dict, Any class SafetyOutput(BaseModel): is_safe: bool = Field(..., description="是否為合法、安全、可回答的問題") reason: Optional[str] = Field(None, description="若不安全,說明原因") class IntentNEROutput(BaseModel): intent: Literal[ "product_inquiry", # 需要查資料的業務問題 → 走 RAG "price_check", # 快速回覆類 1 "greeting_faq", # 快速回覆類 2 "off_topic", # 超出範圍 "complaint" # 客訴(未來可擴充) ] = Field(..., description="嚴格選擇以上其中一種意圖") entities: Dict[str, Any] = Field( default_factory=dict, description="抽取的命名實體,如 {'product': 'XX保險', 'age': 35}" ) quick_reply: Optional[str] = Field( None, description="僅當 intent 為 price_check 或 greeting_faq 時,填入完整、可直接回傳的回覆句子" ) 3. business_agent/prompts.py from langchain_core.prompts import ChatPromptTemplate # 你之後取代這裡的 placeholder SAFETY_SYSTEM_PROMPT = """你是一個極其嚴格的內容審核員,請判斷使用者問題是否安全、可回答。 (這裡放你真正的安全規則)""" INTENT_SYSTEM_PROMPT = """你是一個專業的業務助理,請嚴格按照以下規則分析使用者問題: (這裡放你真正的意圖說明 + 5種意圖定義 + NER 要求 + 快速回覆規則)""" 5. business_agent/__init__.py Pythonfrom .agent import BusinessAgent __all__ = ["BusinessAgent"] backend.py from openai import AsyncOpenAI from business_agent import BusinessAgent openai_client = AsyncOpenAI(api_key="sk-...") vector_client = YourVectorSearchClient(...) agent = BusinessAgent(openai_client=openai_client, vector_search_client=vector_client) async for chunk in agent.astream(history, metadata): if chunk["type"] == "token": await ws.send_text(chunk["content"]) elif chunk["type"] == "final": save_logs(chunk["logs"]) # 完整中間資訊都在這裡