分類: 🤖 AI 與自動化

  • Agent SDK vs 傳統 If-Else:客服系統從 500 行代碼到 10 行的蛻變

    📥 Download Jupyter Notebook

    Download complete Jupyter Notebook


    Agent SDK vs 傳統 If-Else:客服系統從 500 行代碼到 10 行的蛻變

    📋 快速摘要

    • Agent SDK 將 500+ 行 if-else 邏輯簡化為 ~10 行配置
    • 維護成本從「高」降到「低」—— 新增規則只需改提示,無需改代碼
    • 適用場景:客服回覆、內容審核、工單分類
    • 不適用場景:金融交易、爬蟲、醫療診斷(需要 100% 確定性)
    • 本文包含可運行的 Jupyter Notebook 對比演示

    爲什麽選擇 Agent SDK 而非傳統 If-Else?

    想象你在維護一個客服系統。每當新的詢問類型出現,你就得添加 5-10 行 if-elif-else 代碼。6 個月後,代碼變成 500+ 行的怪獸,充滿邊界情況處理。

    現在有一個更好的方式:用 Agent SDK 讓 AI 自動理解客戶意圖,不需要每次都改代碼。

    實例對比:傳統方式 vs Agent SDK

    ❌ 傳統方式:500+ 行代碼

    典型的 if-else 實現(簡化版本):

    def traditional_customer_service(inquiry: str) -> str:
        if "退貨" in inquiry or "return" in inquiry.lower():
            if "7天" in inquiry or "7 days" in inquiry.lower():
                return "✓ 好消息!7 天內的商品我們接受退貨。請提供訂單號和退貨原因。"
            elif "30天" in inquiry or "30 days" in inquiry.lower():
                return "⚠ 30 天內的商品需要評估狀況。請寄回商品,我們會判斷是否可退。"
            else:
                return "✗ 超過退貨期限(30天),無法退貨。詳見購買頁面。"
        # ... 還有物流、商品、預設回覆,加起來 500+ 行
        else:
            return "感謝您的詢問。請告訴我更多細節,我會盡快幫您解決。"

    問題:

    • 新增詢問類型 → 需要改代碼 → 需要測試 → 需要重新部署
    • 邊界情況處理複雜(用戶說「退貨」的 10 種不同表達方式)
    • 代碼量隨詢問類型線性增長
    • 維護成本高、Bug 多

    ✨ Agent SDK 方式:~10 行配置

    from claude_agent_sdk import query, ClaudeAgentOptions
    
    async for message in query(
        prompt="You are a customer service agent. Understand customer inquiries and help with returns, invoices, shipping, and product issues.",
        options=ClaudeAgentOptions(
            allowed_tools=["Retrieve Policy", "Query Order", "Update Status"],
            permission_mode="acceptEdits"
        )
    ):
        if isinstance(message, ResultMessage):
            print(message.result)  # AI-generated response

    優勢:

    • 新增規則 → 只需改系統提示,無需改代碼
    • 自動理解變通說法
    • 代碼量固定,不隨規則增加而增加
    • 維護成本低、Bug 少

    真實測試結果

    5 個實際客戶詢問測試:

    測試 傳統方式 Agent SDK 勝者
    回覆時間 0.03ms 150ms If-Else (快 5000x)
    代碼行數 500+ ~10 ✨ Agent SDK (簡潔 50x)
    新增規則難度 高(改代碼→測試→部署) 低(改提示→即時生效) ✨ Agent SDK
    維護成本 ✨ Agent SDK
    用戶體驗 生硬、標準化 自然、親切 ✨ Agent SDK

    何時使用 Agent SDK vs If-Else

    ✅ 適合 Agent SDK 的場景

    • 客服回覆 — 自然理解客戶意圖
    • 內容審核 — 判斷垃圾信息、仇恨言論
    • 工單分類 — 自動分類優先級
    • 推薦系統 — 推薦相關商品
    • 數據提取 — 從非結構化文本提取信息

    ❌ 不適合 Agent SDK 的場景

    • 金融交易 — 需要 100% 確定性
    • 醫療診斷 — 需要絕對準確
    • 法律判決 — 需要精確遵循規則
    • 實時系統 — AI 延遲 100-500ms
    • Web 爬蟲 — 需要精確控制

    Claude API vs Agent SDK:核心差異

    這是很多人困惑的地方。讓我用實例說明。

    場景:客服回答「我的訂單呢?」

    系統需要:

    1. 查訂單資料庫
    2. 查物流資料庫
    3. 組合信息回答客戶

    ❌ Claude API(你控制流程)

    from anthropic import Anthropic
    
    client = Anthropic()
    
    # 第 1 次調用
    response1 = client.messages.create(
        model="claude-opus-4-6",
        messages=[{
            "role": "user",
            "content": "客戶說:我 3 月 10 號買的商品,現在還沒收到"
        }]
    )
    # Claude:「我需要查一下你的訂單...」
    
    # ❌ 你必須手動查資料庫
    order = query_order_db(customer_id, "2026-03-10")
    
    # ❌ 第 2 次調用 Claude
    response2 = client.messages.create(
        model="claude-opus-4-6",
        messages=[{
            "role": "user",
            "content": f"""訂單信息:{order}
    
    請回答客戶。"""
        }]
    )
    
    # ❌ 如果客戶追問,又要第 3、4 次調用...

    你的應用程式在做決策:

    • 「我應該先查訂單」
    • 「我應該問 Claude 什麼問題」
    • 「我應該再查一次物流」

    ✅ Agent SDK(Claude 自動控制流程)

    from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
    
    # 就一次調用,Claude 自動做一切
    async for message in query(
        prompt="""你是客服系統。根據客戶問題,查詢訂單和物流信息,給出完整回答。
    
    客戶問題:「我 3 月 10 號買的商品,現在還沒收到,怎麼辦?」
    
    工具說明:
    - query_order(customer_id, date):查訂單
    - query_shipping(tracking_id):查物流
    
    請自動使用這些工具,給出完整回答。""",
    
        options=ClaudeAgentOptions(
            allowed_tools=["query_order", "query_shipping"]
        )
    ):
        if isinstance(message, ResultMessage):
            print(message.result)
            # 完成!Claude 自動完成了一切

    Claude 自動做決策:

    • ✅ Claude 看到問題
    • ✅ Claude 決定「我需要查訂單」
    • ✅ Claude 自動調用工具
    • ✅ Claude 看結果,決定「我還需要查物流」
    • ✅ Claude 自動調用工具
    • ✅ Claude 綜合所有信息,給出回答

    一句話總結

    Claude API 我知道要查 DB 的順序 → 我來組織
    Agent SDK 我把查 DB 的工具做好 → Claude 自己組織順序

    Agent SDK vs Claude API 完整對比

    特性 Claude API Agent SDK
    使用場景 一次性請求、內容生成 決策型任務、自動化工作流
    流程控制 你的應用程式控制 Claude 自動決策
    工具調用 手動查 DB,手動傳給 Claude Claude 自動調用工具和解析
    複雜度 簡單 – 一個請求,一個回應 複雜 – 多步驟推理、工具調用
    代碼量 多(需要寫 loop 邏輯) 少(一句話啟動)
    安全性 你負責驗證輸出 內置權限管理、審計日誌

    決策樹:選擇正確的工具

    你的任務來了
        ↓
    「這個任務需要 AI 自己決策嗎?」
        ├─ YES → 「結果容錯為零嗎?」
        │         ├─ YES → ❌ 不用 AI,用硬編碼邏輯
        │         └─ NO  → ✅ 用 Agent SDK
        │
        └─ NO  → 「只是單純生成內容/回答嗎?」
                  ├─ YES → ✅ 用 Claude API
                  └─ NO  → 「需要多步驟工作流嗎?」
                            ├─ YES → 你控制流程 + Claude API
                            └─ NO  → ✅ Claude API 就夠了

    真實案例:電商商品自動分類系統

    背景: 某線上購物平台(如東森)需要自動將客戶上傳的商品歸類到正確的分類。

    情況說明

    規模: 4 萬個商品分類(電子產品、服裝、家居、運動等)

    挑戰: 如何在成本可控的情況下,快速準確地進行分類?

    方案 1:傳統 TFIDF 模型

    實現方式:

    1. 收集所有商品描述 + 人工標註的分類
    2. 用 TFIDF 算法訓練模型,提取關鍵詞權重
    3. 客戶輸入新商品描述 → 模型計算與各分類的相似度 → 返回排名前 3 的分類
    # 傳統 TFIDF 方法
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.neighbors import NearestNeighbors
    
    # 1. 訓練
    vectorizer = TfidfVectorizer()
    tfidf_matrix = vectorizer.fit_transform(product_descriptions)
    model = NearestNeighbors(n_neighbors=3, metric='cosine')
    model.fit(tfidf_matrix)
    
    # 2. 預測
    new_product = "輕便防水的戶外登山背包,容量 40L"
    new_tfidf = vectorizer.transform([new_product])
    distances, indices = model.kneighbors(new_tfidf)
    
    # 結果:前 3 個分類
    # [運動戶外, 旅遊用品, 箱包配飾]

    優勢:

    • ⚡ 毫秒級回應(無網路延遲)
    • 💰 零成本(本地運行)
    • 🎯 可控、可解釋(看得到關鍵詞權重)

    缺點:

    • ❌ 無法理解語義(「便宜的手機」vs「經濟型手機」被當作完全不同的商品)
    • ❌ 變通說法識別差(「登山背包」識別不了,但「戶外登山用雙肩包」就被歸錯類)
    • ❌ 每次添加新分類或修改規則都需要重新訓練
    • ❌ 無法跨語言(中文和英文分開訓練)
    • ❌ 無法處理複雜邏輯(「防水的同時是否防塵?」這類二次判斷)

    方案 2:單純 AI 分類(Claude API)

    天真的做法:把 4 萬個分類都給 Claude

    from anthropic import Anthropic
    
    client = Anthropic()
    
    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": f"""根據這個商品描述進行分類:
    
    商品描述:輕便防水的戶外登山背包,容量 40L
    
    可用分類:
    - 電子產品
    - 服裝鞋履
    ... (共 4 萬個)
    
    返回最相關的前 3 個分類 + 置信度。"""
        }]
    )

    問題: 4 萬個分類 × 10 tokens/分類 = 40 萬 tokens 光是分類列表

    • 成本:$5 / 次(按 Claude Opus 定價)
    • 日成本(10,000 商品):$50,000 / 天 = **$1.5M / 月** ❌
    • 完全不可行

    方案 3:向量搜尋 + AI 精確分類(最優)

    核心思想: 不是把 4 萬個分類都給 Claude,而是:

    1. 預先計算: 將 4 萬個分類嵌入向量空間(一次性,離線)
    2. 實時檢索: 商品描述進來 → 向量相似度搜尋 → 找出最相關的 Top 50 分類
    3. 精確分類: 只把 50 個候選分類傳給 Claude
    4. 結果: 成本 = 原本的 1/800,準確度反而更高
    # 向量檢索 + AI 分類架構
    
    from sentence_transformers import SentenceTransformer
    from milvus import connections, Collection
    from anthropic import Anthropic
    
    client = Anthropic()
    
    # ============ 階段 1:預先計算分類向量(一次性) ============
    def initialize_category_embeddings():
        """將 4 萬個分類嵌入向量空間"""
        connections.connect("default", host="127.0.0.1", port="19530")
        collection = Collection("products_categories")
    
        # 從資料庫讀取所有分類
        categories = get_all_categories_from_db()
    
        # 計算向量(使用本地模型)
        model = SentenceTransformer('all-MiniLM-L6-v2')
        embeddings = model.encode([cat['name'] for cat in categories])
    
        # 插入向量資料庫
        collection.insert({
            "id": [cat['id'] for cat in categories],
            "category_name": [cat['name'] for cat in categories],
            "embedding": embeddings
        })
        collection.load()
        print("✅ 4 萬個分類向量化完成!")
    
    # ============ 階段 2:實時檢索 + AI 分類 ============
    def classify_product_optimized(product_description):
        """實時分類流程"""
    
        # 1. 將商品描述向量化
        model = SentenceTransformer('all-MiniLM-L6-v2')
        query_embedding = model.encode(product_description)
    
        # 2. 向量搜尋:找出最相關的 Top 50 分類(< 50ms)
        connections.connect("default", host="127.0.0.1", port="19530")
        collection = Collection("products_categories")
    
        search_results = collection.search(
            data=[query_embedding],
            anns_field="embedding",
            param={"metric_type": "L2", "params": {"nprobe": 10}},
            limit=50  # 只取 Top 50
        )
    
        top_categories = [hit.entity.get("category_name") for hit in search_results[0]]
        categories_text = '\n'.join([f"- {cat}" for cat in top_categories])
    
        print(f"✓ 向量搜尋找到 50 個候選分類(用時:< 50ms)")
    
        # 3. Claude 從 50 個候選中精確選擇(150ms)
        response = client.messages.create(
            model="claude-opus-4-6",
            max_tokens=1024,
            messages=[{
                "role": "user",
                "content": f"""根據這個商品描述進行分類:
    
    商品描述:{product_description}
    
    相關分類候選(已按相似度排序,僅展示 Top 50):
    {categories_text}
    
    請從上述候選中選擇最相關的前 3 個分類 + 置信度。
    
    返回格式:
    1. 分類名稱 (置信度: 95%)
    2. 分類名稱 (置信度: 80%)
    3. 分類名稱 (置信度: 65%)
    
    同時說明理由。"""
            }]
        )
    
        return response.content[0].text

    性能對比:

    指標 TFIDF 純 AI
    (全部分類)
    向量 + AI
    (推薦)
    分類傳輸 不適用 40 萬 tokens 500 tokens(50 個)
    成本/次 $0 $5.00 $0.005
    日成本(10K 商品) $0 $50,000 $50
    響應時間 1ms 1-2 秒 200ms
    準確度 中(容易混淆) ⭐⭐⭐ 高
    語義理解 ❌ 差 ✅ 強 ✅ 強
    多語言支持 ❌ 差 ✅ 強 ✅ 強

    如何讓 Agent SDK / Claude 存取動態分類列表?

    問題: 上面的案例中,分類是硬編碼或簡單傳輸。但在真實系統中,分類會經常變動。Agent SDK 怎麼知道最新的分類清單?

    三種方案對應不同規模

    方案 A:應用層查詢(適合 < 500 分類)

    流程: 應用程式 → 查詢資料庫 → 替換提示詞佔位符 → Agent 使用

    import sqlite3
    from anthropic import Anthropic
    
    client = Anthropic()
    
    # 應用程式層:查詢資料庫
    def get_categories_from_db():
        conn = sqlite3.connect('products.db')
        cursor = conn.cursor()
        cursor.execute('SELECT name FROM categories WHERE active = 1 ORDER BY name')
        categories = [row[0] for row in cursor.fetchall()]
        conn.close()
        return categories
    
    # 獲取最新分類
    categories = get_categories_from_db()
    categories_text = '\n'.join([f"- {cat}" for cat in categories])
    
    # 生成提示詞
    prompt = f"""根據商品描述選擇分類:
    
    商品描述:輕便防水的戶外登山背包,容量 40L
    
    可用分類:
    {categories_text}
    
    返回前 3 個分類。"""
    
    # Claude 使用最新分類進行分類
    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )

    優勢: 簡單、直接、零複雜度

    缺點: 每次請求都要查資料庫

    方案 B:Agent 工具查詢(適合 500-5000 分類)

    流程: Agent 調用自訂工具 → 工具查詢資料庫 → Agent 使用結果

    from anthropic import tool
    import sqlite3
    
    @tool
    def query_categories(keyword: str = None) -> str:
        """查詢可用的商品分類。
    
        Args:
            keyword: 可選的搜尋關鍵詞(例如:'電子' 會返回 '電子產品')
        """
        conn = sqlite3.connect('products.db')
        cursor = conn.cursor()
    
        if keyword:
            cursor.execute(
                'SELECT name FROM categories WHERE active = 1 AND name LIKE ? ORDER BY name',
                (f'%{keyword}%',)
            )
        else:
            cursor.execute('SELECT name FROM categories WHERE active = 1 ORDER BY name')
    
        categories = [row[0] for row in cursor.fetchall()]
        conn.close()
        return ', '.join(categories)
    
    # Agent 可以調用工具
    prompt = """根據商品描述選擇分類:
    
    商品描述:輕便防水的戶外登山背包,容量 40L
    
    步驟:
    1. 使用 query_categories 工具查詢所有或相關分類
    2. 從結果中選擇最相關的前 3 個
    
    返回格式:
    1. 分類名稱 (置信度: 95%)
    ...
    """

    優勢: 動態、Agent 可以「思考」查詢策略

    缺點: 增加 API 往返次數

    方案 C:向量檢索(適合 > 5000 分類,如東森 4 萬)

    流程: 預先嵌入分類 → 商品描述進來 → 向量搜尋 Top 50 → Claude 精確選擇

    (詳見上方「向量搜尋 + AI 精確分類」段落)

    方案選擇表

    分類規模 推薦方案 成本 延遲 複雜度
    < 100 方案 A(直接傳) 最低 最快 ⭐ 最簡
    100-500 方案 A(推薦) ⭐ 簡
    500-5000 方案 B(推薦) ⭐⭐ 中
    > 5000(東森 4 萬) 方案 C(必須) 最低 最快 ⭐⭐⭐ 複

    工具設計的正確思路:從問題出發

    這是最重要的一個章節。 很多工程師設計 Agent 工具時,會陷入「工具先行」的誤區。但正確的做法是「需求驅動」。

    ❌ 錯誤的做法:工具先行

    「我要做 Agent SDK」
      ↓
    「我需要什麼工具?」
      ↓
    設計工具:query(), update(), delete()
      ↓
    「我怎麼用這些工具?」
      ↓
    慢慢找場景...
      ↓
    結果:工具太通用、有遺漏、或過度設計

    ✅ 正確的做法:從問題出發

    「我的系統可能遇到什麼問題?」
      ↓
    列舉所有可能的問題
      ↓
    反推需要什麼工具來解決
      ↓
    設計這些工具(不多不少)
      ↓
    套入 Agent SDK
      ↓
    結果:工具精準、完整、適中

    實例 1:東森商品分類系統

    第 1 步:列舉可能的問題

    系統運行時會遇到什麼問題?
    
    用戶層面:
      ✓ 「我怎麼知道這個商品該放哪一類?」
      ✓ 「系統選的分類對嗎?」
      ✓ 「能不能推薦其他可能的分類?」
    
    系統層面:
      ✓ 「分類資料庫有沒有更新?」
      ✓ 「分類規則有沒有衝突?」
      ✓ 「某個分類底下有沒有商品?」
    
    邊界問題:
      ✓ 「這個商品可能屬於多個分類嗎?」
      ✓ 「怎麼處理新加的分類?」
      ✓ 「怎麼回滾到之前的分類?」

    第 2 步:反推需要的工具

    問題                                 → 需要的工具
    ──────────────────────────────────────────────────
    「能推薦其他可能的分類?」            → search_similar_categories()
    「分類有沒有更新?」                  → get_latest_categories()
    「分類規則有沒有衝突?」              → validate_category_rules()
    「某分類有沒有商品?」                → count_products_in_category()
    「可能屬於多個分類嗎?」              → get_ambiguous_categories()

    第 3 步:只設計這些工具

    @tool
    def search_similar_categories(keyword: str, top_k: int = 5) -> list:
        """找相關分類"""
    
    @tool
    def get_latest_categories(updated_after: str = None) -> list:
        """取最新分類資料"""
    
    @tool
    def validate_category_rules(category_id: str) -> dict:
        """驗證分類規則有沒有問題"""
    
    @tool
    def count_products_in_category(category_id: str) -> int:
        """某分類有多少商品"""
    
    @tool
    def get_ambiguous_categories(product_desc: str) -> list:
        """找可能有歧義的分類"""

    就這 5 個工具,不多不少!

    實例 2:客服系統

    列舉問題 → 推斷工具

    問題列表:
    1. 「客戶的訂單存在嗎?」
    2. 「訂單現在在哪裡?」
    3. 「這個客戶有沒有退貨紀錄?」
    4. 「退貨政策允許嗎?」
    5. 「要問主管才能退嗎?」
    6. 「怎麼記錄這次交互?」
    
    需要的工具:
    1. query_order()
    2. get_shipping_status()
    3. get_customer_return_history()
    4. check_return_policy()
    5. escalate_to_manager()
    6. log_interaction()

    就這 6 個,不多不少!

    為什麼這樣設計好?

    優勢 解釋
    ✅ 不會過度設計 只有解決實際問題的工具
    ✅ 不會有遺漏 所有可能的問題都考慮到
    ✅ Claude 理解清楚 系統邊界明確,工具語義清晰
    ✅ 工具粒度適中 既不太大也不太小
    ✅ 易於維護和擴展 添加新問題 = 添加新工具

    設計 Agent 工具時的關鍵決策:工具粒度

    基於「從問題出發」的思路,現在我們討論工具粒度。 粒度(granularity)決定了 Claude 能否有效使用工具。

    三種極端情況

    ❌ 工具太大(做太多事)

    @tool
    def query_order_everything(
        customer_id: str,
        order_id: str = None,
        status: str = None,
        start_date: str = None,
        end_date: str = None,
        shipping_status: str = None,
        include_items: bool = True,
        include_history: bool = True
    ) -> dict:
        """一個工具做所有事"""
        # 6 個 WHERE 條件
        # ...

    問題:

    • Claude 很容易參數填錯(太多選擇)
    • Claude 不知道應該用哪些參數組合
    • 你寫了 6 個 WHERE,Claude 可能只需要 1 個,浪費

    ❌ 工具太小(太細碎)

    @tool
    def query_by_customer_id(customer_id: str) -> list:
        """只查客戶"""
    
    @tool
    def query_by_status(status: str) -> list:
        """只查狀態"""
    
    @tool
    def query_by_date_range(start: str, end: str) -> list:
        """只查日期"""
    
    # ... 還有 10 個工具

    問題:

    • Claude 要調用 3-4 次工具才能完成一個查詢
    • 延遲高、成本高
    • Claude 要自己 join 結果,容易出錯

    ✅ 工具適中(語義相關的組合)

    @tool
    def get_customer_order_status(customer_id: str, order_id: str = None) -> dict:
        """查客戶的訂單,可選篩選特定訂單"""
        # WHERE customer_id = ? AND (order_id = ? if provided)
    
    @tool
    def get_orders_by_date(start_date: str, end_date: str) -> list:
        """查某個時間範圍的訂單"""
        # WHERE created_at BETWEEN ? AND ?
    
    @tool
    def get_orders_by_status(statuses: list) -> list:
        """查特定狀態的訂單"""
        # WHERE status IN (...)

    優勢:

    • 每個工具有單一職責(符合 SOLID 原則)
    • Claude 能清楚理解用途
    • 通常 1-2 次調用完成查詢
    • 參數數量合理(不超過 3-4 個)

    工具粒度判斷清單

    設計工具時,問自己這些問題:

    判斷點 好的工具 差的工具
    工具名能清楚表達意圖嗎? get_orders_by_customer() query_db()
    參數數量 < 4 個 > 5 個
    Claude 能猜到用途嗎? 「我看到名字就知道查什麼」 「我完全不知道這是什麼」
    通常多少次調用完成任務? 1-2 次 3-5 次或更多
    工具代表一個業務概念嗎? 「訂單狀態」「物流追蹤」 「數據庫查詢」「參數組合」

    實際案例:東森分類系統

    ❌ 太大的工具

    @tool
    def search_categories(
        keyword: str = None,
        parent_category: str = None,
        min_products: int = None,
        max_products: int = None,
        active_only: bool = True,
        sort_by: str = "name"
    ):
        """搜尋分類"""
        # 這是什麼?搜分類還是搜商品?太模糊

    ✅ 適中的工具(基於問題驅動)

    @tool
    def search_categories_by_keyword(keyword: str) -> list:
        """用關鍵詞搜分類
    
        例:keyword="運動" → 返回 [運動戶外, 運動服飾, ...]
        """
    
    @tool
    def get_category_children(parent_id: str) -> list:
        """取某分類的子分類"""
    
    @tool
    def get_products_in_category(category_id: str, limit: int = 100) -> list:
        """取分類下的商品"""

    Claude 使用:

    「我要分類一個『防水戶外背包』的商品」
    ↓
    Claude:「我先搜 '戶外' 相關分類」
      → search_categories_by_keyword("戶外")
      → 返回 [運動戶外, 戶外用品, ...]
    
    Claude:「運動戶外 有什麼子類別?」
      → get_category_children("運動戶外")
      → 返回 [登山, 露營, 滑雪, ...]
    
    Claude:「登山 分類有什麼產品,我看看背包在哪」
      → get_products_in_category("登山")
      → 自動判斷這個背包應該是「運動戶外 > 登山」

    Claude 自動組織,不需要你預先決定順序!

    工具粒度的黃金法則

    問自己:「Claude 看著這個工具名和參數,會不會用?」

    • 如果會 → 工具大小合適
    • 如果不會 → 工具太大或太模糊,要拆或改名

    總結:何時遷移到 Agent SDK

    如果你符合以下任何一個,考慮 Agent SDK:

    • 代碼包含 200+ 行 if-elif-else 邏輯
    • 每月都在添加新的處理規則
    • 用戶經常報告「系統沒理解我」
    • 客服系統無法適應變通表達方式
    • 維護成本不斷上升

    核心優勢總結:

    • 代碼行數:500+ → 10(50 倍簡化)
    • 新增規則:改代碼+測試+部署 → 改提示(即時生效)
    • 用戶體驗:生硬規則化 → 自然親切
    • 維護成本:高 → 低

    工具設計思路:

    • ❌ 不要:先設計工具,再找用處
    • ✅ 要:從問題出發,反推需要的工具
    • ✅ 結果:工具精準、完整、易用

    準備好了嗎?下載 Jupyter Notebook,親手測試,然後在你的項目中試用 Agent SDK。

  • Claude Code 完全教學指南

     

    Claude Code:AI 驅動的軟體開發革命

     

    你可能經歷過這個場景:下午 3 點,產品經理說:「客戶要新功能,明天就要。」你打開編輯器,開始敲代碼。腦子裡同時在想:資料庫欄位、API 端點、錯誤處理、邊界情況、測試用例……你一個人在腦子裡跑著整個開發流程。

    Claude Code 改變了什麼?想像你有個高級工程師坐在身邊。你說:「我需要一個使用者認證系統。」他問:「SQL 還是 NoSQL?」你說 PostgreSQL,他立刻開始寫。你看著代碼,說:「這個有漏洞」,他改。整個過程,你只需要說出你想什麼。

    這就是 Claude Code 的核心:

      • 你專注想什麼(目標、邏輯、決策)

      • Claude Code 專注怎麼做(實現、語法、細節)

      • 你可以用一個人的時間,做一隊工程師的工作

    第 1 章:快速入門

    1.1 三分鐘安裝

    macOS

    brew install anthropic/tap/claude-code

    Linux

    sudo apt update && sudo apt install claude-code

    Windows

    從 https://claude.com/download 下載 .exe

    1.2 設定 API 金鑰

      1. 去 https://console.anthropic.com

      1. 登入 → API Keys → Create Key

      1. 複製金鑰(只顯示一次)

      1. 執行:claude config set-key YOUR_KEY

    1.3 第一個對話

    claude

    開始輸入:「寫一個 Python 函數,檢查質數」

    第 2 章:核心概念

    2.1 對話思維

    不是:「寫個登入頁面」(50% 符合)

    而是:逐步談論,每步精煉。第一版 80%,加要求→90%→100%。

    2.2 理解能力邊界

    能看到:你的項目文件、提到的內容、之前的對話

    看不到:其他項目、密碼、網路信息(除非 WebFetch)

    第 3 章:20+ 工具詳解

    3.1 工具分類

    表 1: Claude Code 工具分類速查表

    此表格按功能分類列出 Claude Code 的所有工具。左欄是功能類型(檔案、執行等),中欄是對應的工具名稱,右欄說明每個工具的用途。

    類型 工具 做什麼
    檔案 Read, Edit, Write, Glob 讀、寫、編輯、搜尋文件
    執行 Bash, Pytho 跑代碼,看結果
    搜尋 Grep, Agent 找東西,分析代碼
    版本控制 Git 提交、看歷史、合併
    Web WebFetch, WebSearch 調 API,查信息
    管理 TaskCreate, TaskUpdate 管理任務,追蹤進度

    第 4 章:Skills 與 Workflows

    Skill 是預定義的工作流程。例如 TDD(先寫測試再寫代碼)、Code Review、Debugging、Agent 派遣。

    第 5 章:MCP 插件系統

    MCP:讓 Claude Code 直接連接外部服務(資料庫、Figma、Discord 等)。

    沒 MCP:你說 → Claude Code 生成 → 你複製 → 你跑 → 你粘貼 → Claude Code 分析。太慢。

    有 MCP:一氣呵成,快很多。

    第 6 章:進階用法(用得更好的祕訣)

    6.1 Prompt 工程:怎樣問問題很重要

    同樣的需求,不同的問法,結果天差地別。看這個對比:

    表 2: Prompt 範例對比 – 如何提問更好

    此表格展示同一個需求的三種提問方式。用來學習如何寫出高質量的 prompt。

    維度 壞問題 好問題 結果差異
    問題 「寫個登入頁面」 「Vue 3 + TypeScript 的登入頁面,記住我、3 次失敗鎖定、Tailwind CSS」
    Claude Code 需要猜的東西 框架?UI 庫?功能?設計?認證方式? 全都說了,不用猜
    生成的代碼符合度 ~50% ~100% 提升 50%
    你需要改的次數 5-6 次 0-1 次 省時間 80%
    Token 消耗 5000+ tokens 1500 tokens 省 70%
    總時間 35 分鐘 5 分鐘 快 7 倍

    「好問題」的三要素 + 對比表

    表 3: 好 Prompt 的三個必要元素

    此表格拆解一個優秀 prompt 的三個要素。用來檢查自己的 prompt 是否齊全。

    要素 例子 為什麼重要
    上下文 「我在寫後台管理系統,Vue 3 + TypeScript」 Claude Code 知道框架、語言、用途。消除最大的猜測。
    具體需求 「功能:用戶名 + 密碼、記住我、錯誤提示」 功能清單,一項一項。不用用戶去想「還要什麼」。
    約束條件 「UI:Tailwind CSS、安全:防 XSS」 限制技術選擇,防止 Claude Code 過度設計。

    6.2 Context 管理:怎樣讓 Claude Code 聚焦

    Context 聚焦的三層級對比

    表 4: Context 管理 – 不同範圍的效能對比

    此表格比較不同 Context 範圍的效率和品質。用來決定每次應該給 Claude Code 多少上下文。

    層級 範圍 Context 大小 執行速度 答案品質 何時用
    全項目 所有 780 個文件 50,000+ tokens ⏱️ 很慢 ⭐ 60% 罕見,只在架構設計
    一個模塊 src/orders/(~50 個文件) 5,000 tokens ⏱️⏱️ 中等 ⭐⭐⭐⭐⭐ 95% 大部分工作,推薦
    一個文件或函數 getOrders()(~30 行) 500 tokens ⏱️⏱️⏱️ 瞬間 ⭐⭐⭐⭐⭐ 99% 精細調整、除錯

    經驗法則:項目 <50 個文件 → 全項目沒問題 | 50-500 → 聚焦模塊 | >500 → 聚焦文件/函數

    6.3 性能優化:寫出快速的代碼

    案例:交易策略回測的優化過程

    表 5: 真實案例 – 性能優化的具體耗時

    此表格展示交易回測項目從 5 分鐘優化到 3 秒的完整過程。用來了解 Claude Code 的實際優化效果。

    版本 實現方法 執行時間 加速倍數 瓶頸
    v1(原始) 三層 Python 迴圈 5 分 0 秒 1x CPU 單核執行 1.25M 次迭代
    v2(矢量化) NumPy 矢量操作 8 秒 37.5x 記憶體讀取
    v3(並行) NumPy + 多進程 3 秒 100x 磁碟 I/O
    v4(快取) v3 + LRU 快取 1.5 秒 200x 實時使用可行

    常見優化模式的效果對比

    表 6: 常見優化技巧的效果對比

    此表格列出開發中常用的優化技巧和預估加速倍數。用來評估哪些優化最值得做。

    優化模式 應用場景 典型加速 實現難度 何時用
    迴圈 → 矢量化 批量計算、數據處理 10-100 倍 Python 迴圈跑得慢
    重複計算 → 快取 同一數據多次計算 5-50 倍 看到重複 print 語句
    全表掃描 → 索引 資料庫查詢 100-1000 倍 WHERE 很慢
    同步 → 非同步 網路請求、I/O 3-10 倍 等待外部服務
    串行 → 並行 獨立計算 2-8 倍 多核 CPU 閒置

    6.4 成本優化:不浪費 Toke

    典型操作的 Token 消耗

    表 7: Token 成本速查表 – 常見操作的費用

    此表格列出日常開發操作的 token 消耗和估算成本。用來計算:「這個任務要花多少錢?」

    操作 典型 Token 數 成本(Opus) 優化方式
    讀一個小文件(<1KB) 50-100 $0.0002 只讀需要的部分
    寫一個函數 500-1000 $0.002 一次寫多個相關函數
    修改一個文件 1000-2000 $0.005 一次改多處,不要改多次
    讀整個大項目 5000-10000 $0.02 聚焦到一個模塊
    派遣一個 Agent 2000-5000 $0.01 只在真的需要時派遣

    模型選擇指南(按任務類型)

    表 8: 模型選擇指南 – 按任務類型選用 Opus/Soet/Haiku

    此表格幫助選擇合適的 Claude 模型。用來回答「我應該用 Opus 還是 Soet?」

    模型 價格 速度 推薦用途 例子
    Opus $3/$15 ⏱️ 慢 架構決策、複雜邏輯、Code Review 「檢查系統的認證設計」、「找性能瓶頸」
    Soet $3/$15 ⏱️⏱️ 中等 一般代碼生成、改 bug、寫測試 「寫登入頁面」、「修復崩潰」、「寫單元測試」
    Haiku $0.8/$4 ⏱️⏱️⏱️ 快 搜索、讀文件、簡單改動、查詢 「找所有 API 端點」、「讀這個文件」、「改個變量名」

    第 7 章:踩坑指南(學到的血淚教訓)

    7.1 常見失敗模式速查表

    表 9: 常見失敗模式 – 新手容易踩的 8 個坑

    此表格列出使用 Claude Code 最常見的失敗場景和解決方案。用來快速診斷「為什麼我的結果不對?」

    失敗模式 症狀 根本原因 修復方案 預防檢查
    期望太高 想讓 Claude Code 寫整個平台,結果亂七八糟 把 Claude Code 當自動化工廠,不是思考夥伴 拆解成小功能,逐步迭代 □ 功能清單有多於 5 個嗎?拆小。
    Context 爆炸 回答很差,執行很慢 讀了整個大項目,context 滿了 聚焦到一個模塊或文件 □ Context 有超過 5000 tokens 嗎?聚焦。
    不驗證結果 上生產後才發現 bug 沒跑代碼驗證,直接相信 Claude Code 讓 Claude Code 跑代碼,看實際輸出 □ 你跑過這段代碼嗎?沒有就先跑。
    安全忽視 API 沒認證,客戶能查別人數據 沒明確提出安全需求 明確列出安全要求(認證、防注入、加密) □ 有提到「安全」「認證」「防護」嗎?
    被建議騙了 按 Claude Code 的建議做,結果更複雜 建議太通用,不適合你的場景 提供約束條件(預算、人力、規模) □ 有說明你的約束條件嗎?

    7.2 真實項目教訓對比表

    表 10: 血淚教訓 – 真實項目中的失敗案例

    此表格記錄實際項目中發生過的重大問題和解決方案。用來學習別人的教訓。

    項目 問題 症狀 修復 教訓
    SimpleEC OMS Agent Team OOM 當機 派遣 9 個 Opus Agent,機器 16GB 記憶體爆炸 分批執行,一次 3-5 個 Agent 消耗 ~1.5GB 每個,要算好預算
    iDempiere 動態查詢失敗 SQL 查詢經常報「Unknown column」錯誤 先查詢 schema,確認欄位名 複雜系統要讀文檔,不要假設
    交易策略 優化後結果不一致 矢量化快 37 倍,但數字精度不同 優化前鎖定正確性,改後驗證 性能優化要漸進,不要一下改太多

    7.3 成本 & ROI 實際數字

    表 11: 成本與投資回報 – 真實項目的數字

    此表格列出真實項目的成本構成和投資回報。用來評估投資 Claude Code 是否值得。

    項目 代碼量 對話次數 Token 消耗 成本 節省時間 ROI
    SimpleEC OMS 50,000 行 500 次 5M tokens $20 200 小時(2 個月 → 2 週) 10 倍
    iDempiere 自訂 30,000 行 300 次 2M tokens $8 100 小時 12 倍
    交易策略 10,000 行 100 次 500K tokens $2 40 小時 20 倍

    結論:Claude Code 成本微乎其微(單項目 $2-20),但節省的時間是數週到數月。任何項目 ROI 都在 10 倍以上。

    7.4 避坑檢查清單

    表 12: 預發布檢查清單 – 交付前必檢項目

    此表格是交付代碼前的檢查清單。用來確保代碼質量和完整性。

    階段 檢查項目 不檢查的後果
    需求定義 ☐ 明確上下文(「我在做什麼項目」) Claude Code 猜測,符合度 50%
    ☐ 列出功能清單(一項一項) 遺漏功能,改多次
    ☐ 說出約束條件(性能、安全、技術棧) 實現不符需求,推倒重來
    實現階段 ☐ 聚焦 Context(「現在只看這部分」) Context 爆炸,品質下降 70%
    ☐ 讓 Claude Code 跑代碼驗證 Bug 進入生產,客戶投訴
    ☐ 關鍵改動要提交(不要等全部完成) 一個地方出錯,整個項目回滾
    優化階段 ☐ 明確性能要求(「<100ms」不是「儘量快」) 優化方向錯誤,白費力氣
    ☐ 優化後驗證正確性一致 快了但結果錯了,worse than before
    團隊協作 ☐ Agent Team 控制數量(最多 5 個) 資源耗盡,OOM 當機
    ☐ 監控成本(知道 token 消耗) 一個月花 $500 都沒發現

    7.5 遇到問題的除錯決策樹

    代碼不工作?按這個順序診斷:

    代碼崩潰?n  ├─ 是 → 看錯誤信息(線索在這)n  │       ├─ 語法錯誤? → 讓 Claude Code 修n  │       ├─ Runtime 錯誤? → 隔離問題,寫個最小測試n  │       └─ 邏輯錯誤? → 跑 debug 代碼,看變量值n  │n  └─ 否(運行但結果錯)→ 對比預期 vs 實際n          ├─ 部分錯? → 這部分代碼邏輯問題n          ├─ 都錯? → 理解錯誤,回到「需求定義」n          └─ 有時錯? → 邊界條件遺漏,寫測試複現

    金律:「不要瞎猜,運行代碼。」99% 的問題都能通過運行 + 看錯誤 + 寫測試解決。

    第 8 章:Agent Team 協作指南

    8.1 什麼時候用 Agent Team?

    一個 Claude Code 不夠時,就該考慮多個 Agent 分工。

    表 13: 單個 Claude vs Agent Team – 何時升級

    此表格對比單個 Claude Code 和 Agent Team 的應用場景。用來決定是否需要升級到多 Agent。

    特徵 單個 Claude Agent Team
    場景 簡單任務(寫功能、修 bug) 複雜項目(需要並行工作、分角色)
    執行時間 30 分鐘內 1-2 小時或更長
    決策成本 低(你直接說) 中(角色分工、資源預算)
    回報倍數 5-10x(人力) 30-100x(多角色並行)
    實際例子 寫個登入頁面 架構大重構、多模塊並行開發

    判斷法則:

    – 任務可以分成 3+ 個獨立部分? → 考慮 Agent Team

    – 這些部分需要同時進行? → 確定用 Agent Team

    – 部分之間無強依賴? → 完美

    8.2 角色設計:避免混亂和重複

    核心原則

    表 14: Agent Team 設計原則 – 好設計 vs 壞設計

    此表格列出 Agent Team 設計的核心原則和常見錯誤。用來避免設計失誤。

    維度 ✅ 好設計 ❌ 壞設計
    角色數量 3-5 個 9+ 個(資源爆炸)
    職責邊界 清晰、無重疊 模糊、功能重疊
    通信方式 Team Lead 統一協調 每個 Agent 互相溝通(亂套)
    模型選擇 任務匹配(opus/soet/haiku) 都用同一個模型(資源浪費)

    常見角色類型

    領導層:Team Lead(Haiku)n  ├─ 分配任務、協調進度、整合結果n  └─ 不需要高智力,需要協調能力實現層:Developer Agent(Soet)n  ├─ 寫代碼、修 bug、測試n  └─ 需要快速完成、成本敏感研究層:Architect / Researcher(Opus)n  ├─ 設計決策、技術選型、深度分析n  └─ 需要高質量、可容忍慢可選層:QA Agent(Soet)n  ├─ 執行測試、驗證結果n  └─ 提高品質、並行檢查

    角色劃分檢查清單

    □ 每個 Agent 只負責一個邏輯完整的工作(不要分成太細)

    □ 不同 Agent 的職責無重疊(問自己:Agent A 的工作會被 Agent B 做嗎?)

    □ Team Lead 能清楚地把任務分配給各 Agent

    □ Team Lead 有辦法整合各 Agent 的輸出

    □ 總共 ≤ 5 個 Agent(否則資源問題,見 8.3)

    8.3 記憶體控制:避免當機

    資源現狀(16GB 機器)

    表 15: 記憶體預算 – 16GB 機器上的 Agent 配置

    此表格列出每種模型的記憶體消耗和最多同時 Agent 數。用來規劃 Agent Team 的規模。

    Agent 模型 每個消耗 最多同時跑 常見配置
    Opus ~1.0GB 5-6 個 高精度任務
    Soet ~0.6GB 10-12 個 通用實現
    Haiku ~0.4GB 15+ 個 快速搜尋、協調

    2026/3/3 事故根因:同時跑 9 個 Opus Agent → OOM 當機

    記憶體預算公式

    可用記憶體 = free -h 的 available 列 - 2GB(系統保留)需求 = Σ(各 Agent 記憶體) + 0.5GB(Team Lead)✅ 需求 < 可用 → 可以啟動n❌ 需求 ≥ 可用 → 必須分批

    分批策略(超過 5 個 Agent)

    不要同時啟動 9 個 Opus!必須分批:

    批次 1:Agent A + B + C + D + E(5 個)同時跑n        ↓(全部完成)n批次 2:Agent F + G + H + I + J(5 個)同時跑n        ↓(全部完成)n批次 3:Team Lead 整合所有結果

    即時監控命令

    # 檢查系統可用記憶體(秒級更新)nwatch -n 1 'free -h'# 檢查 Claude 進程數(最多不超過 5 個 opus)nps aux | grep claude | wc -l# 如果用 claude-limited(cgroup 限制)ncat /sys/fs/cgroup/memory/claude/memory.limit_in_bytes  # 限制ncat /sys/fs/cgroup/memory/claude/memory.usage_in_bytes  # 實際用量

    8.4 測試策略:避免「虛假成功」

    問題根源

    「測試全過卻 UI 點到抓狂」的本質:測試驗證的不是用戶真正體驗的東西。

    表 16: Mock 陷阱 – 測試環境 vs 真實環境的差異

    此表格說明為什麼本地測試通過但生產環境失敗。用來理解測試策略的重要性。

    差距 測試環境 真實環境 後果
    資料 乾淨 fixtures 髒資料、邊界值 NaN 顯示、閃爍
    執行 同步、可預測 非同步、競態條件 重複提交、資料丟失
    網路 即時或 mock 延遲、超時、失敗 loading 無限轉
    使用者 按劇本操作 快速連點、返回鍵 狀態錯亂、記憶體洩漏

    Mock 的三大致命陷阱

    陷阱 1:Over-mocking(mock 了不該 mock 的)n───────────────────────────────────────njest.mock("../api/auth", () => ({ login: () => "success" }))n❌ 你測的是:「假設 API 永遠正確」n✅ 你應該測:「API 格式改了怎麼辦」陷阱 2:Stale Mocks(mock 跟實作不同步)n────────────────────────────────────n後端改了 userName → displayNamen前端 mock 還返回 userNamen→ 測試過 ✅ 但線上爆炸 ?陷阱 3:Happy Path Only(只 mock 成功路徑)n──────────────────────────n所有 mock 都返回 200 + 完美資料n→ 從不測 401、500、timeoutn→ 用戶看白屏或無限 loading

    前期設計檢查清單

    在開始寫功能前,問自己:

    □ 這個功能會失敗嗎?(網路斷線、伺服器 500、用戶輸入錯誤)

    □ 失敗時怎麼展示錯誤?(空白 vs 友善訊息)

    □ 在網路慢的情況下怎麼工作?(loading、禁用按鈕防重複提交)

    □ 用戶會怎樣濫用?(快速連點、關閉瀏覽器、返回鍵)

    □ 邊界資料怎麼處理?(null、空字串、超大數字)

    這些問題回答不了 → 代碼寫不好 → 測試也救不了

    測試策略三層次(按優先級)

    層級 1:組件集成測試(最重要,投資回報最高)n────────────────────────────────────n✅ 用真實組件、mock API 層(用 MSW,不是 jest.mock)n✅ 測:點擊 → API 呼叫 → 結果渲染n✅ 覆蓋:成功 + 失敗 + loading 狀態n✅ 工具:React Testing Library、@testing-library/user-event層級 2:E2E 測試(關鍵流程)n────────────────────────n✅ 測:登入 → 操作 → 結果n✅ 不要 mock 任何東西(真實後端 + 測試資料庫)n✅ 工具:Playwright、Cypress層級 3:單元測試(純邏輯)n──────────────────────n✅ 純計算函數(格式化、排序、驗證)n✅ 工具函數、資料轉換n❌ 不要測組件內部細節(太脆弱)

    常見功能的測試清單

    登入功能:

    – □ [E2E] 輸入帳密 → 點登入 → 跳轉首頁 → 顯示用戶名

    – □ [集成] 密碼錯誤 → 顯示錯誤訊息

    – □ [集成] 提交時禁用按鈕(防重複提交)

    – □ [集成] 網路超時 → 重試機制

    – □ ❌ 不要 mock router(登入後跳轉是核心行為)

    – □ ❌ 不要 mock localStorage(token 存取就是測試重點)

    支付流程:

    – □ [E2E] 選商品 → 結帳 → 支付 → 成功頁

    – □ [集成] 金額計算:小計 + 稅金 + 折扣 + 運費 = 總計

    – □ [集成] 支付失敗 → 錯誤訊息 + 可重試

    – □ [單元] 折扣碼驗證邏輯

    – □ [E2E] 重複提交防護(連點不會重複扣款)

    8.5 實戰案例:SimpleEC OMS 失敗與修復

    失敗原因:

    – 資料庫連線池沒關閉 → 頻繁操作時耗盡

    – 測試環境用 mock,生產環境真實資料 → 資料格式不同

    – 測試只覆蓋成功路徑 → 沒測過並發競態

    修復步驟:

    1. 新增集成測試(對真實資料庫,測並發場景)

    2. 移除過度 mock(只 mock 第三方 API)

    3. 新增 E2E 測試(真實業務流程)

    結果: 問題率從 15% 降到 2%

    8.6 小結

    Agent Team 三黃金規則:

    1. 角色要清晰 — 不要讓兩個 Agent 做同樣的事

    2. 資源要預算 — 先算再建,分批執行

    3. 測試要前置 — 設計時就考慮失敗情況,不要事後補救

    最後的話: 多 Agent 協作能 100 倍加速工作,但複雜度也倍增。沒有架構設計,光有工具沒用。

    總結

    從入門到精通:8 章的進階路線

    • 第 1-2 章:基礎與核心概念
    • 第 3-4 章:工具與工作流程
    • 第 5 章:系統集成(MCP)
    • 第 6 章:進階技巧
    • 第 7 章:實戰失敗案例
    • 第 8 章:多 Agent 協作

    Claude Code 的價值不在寫代碼有多快,而在於你能專注「想什麼」而不是「怎麼做」。當你掌握了 Agent Team 協作,一個人可以做一個小隊的工作。但記住:強大的工具也需要謹慎使用。

  • 為什麼你的 Agent 總是失敗:根本原因分析指南

    為什麼你的 Agent 總是失敗?我們的 DBA 驗證 Agent 每一次都失敗。直到有人停下來問一個簡單的問題:「我們有沒有親自驗證過 SQL 環境是可用的?」答案是:沒有。這是一次真實的根本原因分析故事。

    問題症狀:Agent 重複失敗的模式

    我們的 DBA 驗證 Agent 每一次都失敗,不是「有時候失敗」,而是每一次都失敗

    2026-03-11 14:22 - dba-sonnet agent 啟動
    2026-03-11 14:23 - ModuleNotFoundError: analyst.data.db
    2026-03-11 14:24 - Agent 卡住,無輸出
    
    2026-03-12 09:00 - 重試,同樣失敗
    2026-03-12 15:30 - 又失敗
    2026-03-13 08:00 - 還是失敗

    模式很清楚:Agent 每次都卡在同一個地方,沒有任何進展。

    傳統調試法為什麼失敗

    我們試過改參數、改配置、改 Agent 模型……什麼都試過了:

    1. 檢查 Agent 配置 → 配置看起來沒問題
    2. 改 Agent Prompt → 改了 5 次,還是失敗
    3. 換更強的模型 → Opus、Sonnet,都失敗
    4. 加更多上下文 → 還是失敗
    5. 等待用戶反饋 → 毫無進展

    結果:花了 3 小時,毫無進展。我們陷入了「猜測地獄」。

    轉折:PUA Debugging 的 5 維度法

    當意識到傳統方法行不通後,我們採用了結構化的根本原因分析框架。這改變了一切。

    維度 1-3:搜索 + 確認

    我們發現 Agent Prompt 中引用的模塊 analyst.data.db 根本不存在。

    維度 4:驗證前置假設 ← 關鍵轉折

    這是傳統調試永遠到不了的地方。我們停下來問:

    「我親自能連接到數據庫嗎?讓我現在就試試。」

    結果發現了可行的執行方式:

    PGPASSWORD='tdcc1234' psql -U tdcc -h localhost -d analyst -c "YOUR SQL QUERY"

    這一步改變了一切。

    維度 5:反轉假設

    • 原假設:「問題出在 Agent」
    • 新假設:「問題出在 Prompt 沒有教正確的方式」
    • 結果:Agent 一次成功,生成完整報告

    失敗 vs 成功的對比

    項目失敗的 Prompt成功的 Prompt
    說法「使用 SQL 查詢檢查每個表」「執行此命令:PGPASSWORD=… psql …」
    具體性無具體命令20+ 個完整命令
    認證信息含 DB 用戶名和密碼
    結果Agent 失敗Agent 成功

    核心教訓:正確的調試思路

    傳統方法會把你困在「猜測地獄」裡:

    改 Prompt → 改模型 → 改配置 → 重試 → 還是失敗 → 回到第一步(無限迴圈)

    正確的方法是:

    1. 「環境本身可以做到這件事嗎?」
    2. 親自測試(不信任 Agent 的假設)
    3. 記錄可行的執行方式
    4. 寫詳細的 Prompt(含具體命令)
    5. Agent 執行 ← 通常一次成功

    你的職責不是「讓 Agent 聰明」,而是「給 Agent 正確的路徑」。

    驗證結果 — 實證數據

    表名筆數最新日期狀態
    symbols (TWSE)1,344
    symbols (TPEX)996
    daily_prices232,8972026-03-13
    institutional_trading0✗ 缺失
    tdcc_distribution4,6342026-03-13
    daily_market_index2552026-03-13

    關鍵發現:三大法人數據完全缺失(0 筆),需立即補齊。

    應用場景

    這個根本原因分析方法適用於:

    • 數據庫驗證 ✓
    • API 集成 ✓
    • 自動化腳本 ✓
    • 任何「系統重複失敗」的場景

    結語

    我們花了 3 小時調試,最後發現答案很簡單:

    不是 Agent 需要改變,而是我們需要先驗證環境,然後清楚地描述執行方式。

    下次你的系統卡住時,停下來問自己:

    「我親自能做到這件事嗎?」

    如果答案是「能」,那問題不在系統,而在於你沒有清楚地描述執行步驟。

  • Claude Code 實戰:用 AI 開發完整台股分析系統(含量化因子、回測引擎、Web Dashboard)

    進展更新 (2026-03-11 歷史數據回填完成)

    重大進展:成功回填 6 個月的歷史市場數據!系統現在包含 227,221 筆完整的股票交易記錄,涵蓋 2025 年 9 月至 2026 年 3 月。

    (閱讀全文…)

  • Claude Code Agent Teams 實測:9 個 Opus Agent 同時跑,16GB 記憶體瞬間炸裂

    Claude Code 的 Agent Teams 功能可以讓多個 AI 同時協作,但你的電腦記憶體撐得住嗎?

    (閱讀全文…)

  • Claude Code Agent Teams 完整教學:啟用設定、觸發條件與多代理協作實戰

    Claude Code 的 Agent Teams(代理團隊)是一個實驗性功能,能讓多個 Claude Code instance 同時工作、互相溝通、共享任務。這篇文章完整記錄了我從啟用設定、觸發條件研究,到規劃用 Agent Teams 重建電商 OMS 系統的全過程。

    (閱讀全文…)

  • Claude Code 進階指南:90% 的人不知道的三個隱藏功能

    多數人把 Claude Code 當聊天機器人,但它其實是完整的開發團隊。

    (閱讀全文…)