
在前面的文章中,我們學習了快取機制、記憶體系統、事件處理和策略路由等功能。今天我們要深入學習 Koog 框架的核心概念之一:策略圖(Strategy Graph),這是建構複雜 AI 工作流程的基礎
還記得我們之前使用的簡單策略嗎?
// 簡單的單次執行策略
val agent = AIAgent(
    executor = simpleOpenAIExecutor(ApiKeyManager.openAIApiKey!!),
    strategy = singleRunStrategy(), // 簡單策略
    systemPrompt = "你是一個客服助手"
)
這種策略適合處理簡單的問答,但當我們需要處理複雜的業務邏輯時,就需要更強大的工具——策略圖 (Strategy Graph)
策略圖就像是一張藍圖,描述 AI Agent 如何一步步處理複雜任務
想像一下,如果 AI Agent 是一個工廠,策略圖就是生產線的設計圖,每個節點是一個工作站,邊是輸送帶,條件是品質檢查點
val strategy = strategy<String, String>("strategy_name") {
    // 在這裡定義節點和邊
}
<輸入類型, 輸出類型>
節點是策略圖的基本執行單位,每個節點負責一個特定的任務
val processNode by node<String, String>("process_data") { input ->
    // 處理輸入資料
    val result = "處理後的資料:$input"
    result // 返回處理結果
}
邊定義了節點之間的連接關係
// 基本連接
edge(nodeA forwardTo nodeB)
// 條件連接
edge(nodeA forwardTo nodeB onCondition { output ->
    output.length > 10
})
// 轉換輸出
edge(nodeA forwardTo nodeB transformed { output ->
    output.uppercase()
})
每個策略圖都有兩個特殊節點
讓我們建立一個實際的範例,展示如何使用策略圖處理電商訂單
flowchart TD
    A[開始] --> B[驗證訂單節點]
    B --> C{驗證結果}
    C -->|驗證通過| D[計算價格節點]
    C -->|驗證失敗| E[錯誤處理節點]
    D --> F[生成確認節點]
    F --> G[結束]
    E --> G[結束]
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#fff3e0
    style D fill:#f3e5f5
    style E fill:#ffebee
    style F fill:#f3e5f5
    style G fill:#e8f5e8

這個流程圖展示了策略圖中各個節點之間的關係
class OrderProcessingAgent {
    private val agent = AIAgent(
        executor = simpleOpenAIExecutor(ApiKeyManager.openAIApiKey!!),
        systemPrompt = "你是一個專業的訂單處理助手",
        llmModel = OpenAIModels.CostOptimized.GPT4_1Mini,
        // 使用自訂策略圖
        strategy = createOrderProcessingStrategy()
    )
    private fun createOrderProcessingStrategy() = strategy<String, String>("order_processing") {
        // 節點一:驗證訂單資料
        val validateOrderNode by node<String, String>("validate_order") { orderData ->
            println("正在驗證訂單資料...")
            // 模擬訂單驗證邏輯
            val lines = orderData.split("\n")
            val hasCustomerInfo = lines.any { it.contains("客戶:") }
            val hasProductInfo = lines.any { it.contains("商品:") }
            val hasAmount = lines.any { it.contains("金額:") }
            when {
                !hasCustomerInfo -> "錯誤:缺少客戶資訊"
                !hasProductInfo -> "錯誤:缺少商品資訊"
                !hasAmount -> "錯誤:缺少金額資訊"
                else -> {
                    println("訂單驗證通過")
                    "驗證通過:$orderData"
                }
            }
        }
        // 節點二:計算價格
        val calculatePriceNode by node<String, String>("calculate_price") { validatedOrder ->
            println("正在計算訂單價格...")
            // 從訂單中提取金額
            val amountLine = validatedOrder.split("\n")
                .find { it.contains("金額:") }
            val amount = amountLine?.substringAfter("金額:")?.trim()?.toDoubleOrNull() ?: 0.0
            val tax = amount * 0.05 // 5% 稅金
            val total = amount + tax
            val result = "$validatedOrder\n稅金:$tax\n總計:$total"
            println("價格計算完成,總計:$total")
            result
        }
        // 節點三:生成訂單確認
        val generateConfirmationNode by node<String, String>("generate_confirmation") { orderWithPrice ->
            println("正在生成訂單確認...")
            val confirmation = """
                訂單確認書
                ================
                $orderWithPrice
                ================
                狀態:已確認
                確認時間:${java.time.LocalDateTime.now()}
            """.trimIndent()
            println("訂單確認書生成完成")
            confirmation
        }
        // 節點四:錯誤處理
        val handleErrorNode by node<String, String>("handle_error") { errorMessage ->
            println("處理訂單錯誤")
            """
                訂單處理失敗
                錯誤原因:$errorMessage
                請檢查訂單資料並重新提交
            """.trimIndent()
        }
        // 定義執行流程
        edge(nodeStart forwardTo validateOrderNode)
        // 驗證成功 -> 計算價格
        edge(validateOrderNode forwardTo calculatePriceNode onCondition { result ->
            result.startsWith("驗證通過")
        })
        // 驗證失敗 -> 錯誤處理
        edge(validateOrderNode forwardTo handleErrorNode onCondition { result ->
            result.startsWith("錯誤")
        })
        // 計算價格 -> 生成確認
        edge(calculatePriceNode forwardTo generateConfirmationNode)
        // 所有路徑最終都到達結束點
        edge(generateConfirmationNode forwardTo nodeFinish)
        edge(handleErrorNode forwardTo nodeFinish)
    }
    suspend fun processOrder(orderData: String): String {
        return agent.run(orderData)
    }
}
雖然看起來程式碼很複雜,但是把每個
node拆開來看,然後了解edge的流程走向,其實不會很複雜
suspend fun main() {
    val processor = OrderProcessingAgent()
    println("=== 訂單處理策略圖演示 ===\n")
    // 測試正常訂單
    val validOrder = """
        客戶:張小明
        商品:筆記型電腦
        金額:50000
    """.trimIndent()
    println("處理正常訂單:")
    try {
        val result = processor.processOrder(validOrder)
        println("\n處理結果:")
        println(result)
    } catch (e: Exception) {
        println("處理失敗:${e.message}")
    }
    println("\n" + "=".repeat(50) + "\n")
    // 測試異常訂單
    val invalidOrder = """
        客戶:李小華
        商品:智慧型手機
        // 缺少金額資訊
    """.trimIndent()
    println("處理異常訂單:")
    try {
        val result = processor.processOrder(invalidOrder)
        println("\n處理結果:")
        println(result)
    } catch (e: Exception) {
        println("處理失敗:${e.message}")
    }
}
=== 訂單處理策略圖演示 ===
處理正常訂單:
正在驗證訂單資料...
訂單驗證通過
正在計算訂單價格...
價格計算完成,總計:52500.0
正在生成訂單確認...
訂單確認書生成完成
處理結果:
                訂單確認書
                ================
                驗證通過:客戶:張小明
商品:筆記型電腦
金額:50000
稅金:2500.0
總計:52500.0
                ================
                狀態:已確認
                確認時間:2025-08-17T17:31:42.787342
==================================================
處理異常訂單:
正在驗證訂單資料...
處理訂單錯誤
處理結果:
訂單處理失敗
錯誤原因:錯誤:缺少金額資訊
請檢查訂單資料並重新提交
每個節點職責單一,邊界清楚,整個流程一目了然
透過條件邊,可以實現複雜的業務邏輯分流
每個節點可以獨立測試,便於除錯和修改
節點可以在不同的策略圖中重複使用
| 特性 | 簡單策略 | 策略圖 | 
|---|---|---|
| 複雜度 | 低 | 高 | 
| 靈活性 | 有限 | 極高 | 
| 條件控制 | 困難 | 簡單 | 
| 錯誤處理 | 基本 | 完善 | 
| 可維護性 | 一般 | 優秀 | 
| 學習成本 | 低 | 中等 | 
今天我們學習了 Koog 框架策略圖的基礎概念
策略圖是構建複雜 AI 應用的重要基礎,它讓我們能夠以結構化的方式設計和管理複雜的工作流程
下一篇文章我們將深入學習進階節點操作,包括 LLM 互動節點和工具執行節點,讓策略圖能夠與外部系統進行更豐富的互動
圖片來源:AI 產生
同步刊登於 Blog 第一次學 Kotlin Koog AI 就上手 Day 22:策略圖基礎:構建多階段 AI 工作流程