Logo
Published on

第一次學 Kotlin Koog AI 就上手 Day 28:品質保證:相關自動化測試策略

在前一篇文章中,我們學習了如何保護 AI 應用的資料安全與用戶隱私。今天我們要探討另一個重要主題:測試策略。當 AI 應用準備上線時,如何確保它能穩定運作?如何測試一個回應不固定的 AI 系統?

想像一下,你的 AI 客服系統已經開發完成,但你如何確保它在各種情況下都能正確運作?傳統應用的測試相對簡單,輸入固定就會得到固定輸出。但 AI 應用不同,同樣的問題可能得到不同的回答,而且還依賴外部的 LLM 服務。今天我們將學習 Koog 框架提供的測試工具,讓你能夠有效地測試 AI 應用,建立可靠的品質保證體系

AI 應用測試的挑戰

回應隨機性問題

AI 應用的回應往往不固定,同樣的問題可能得到不同的回答。這讓傳統測試方式變得困難

// 這種測試可能會失敗
@Test
fun `test AI response`() {
    val result = agent.run("你好")
    // AI 每次回應可能都不同
    assertEquals("你好!很高興見到你", result)
}

外部 API 依賴問題

AI 應用依賴外部 LLM 服務,測試時會遇到

  • 網路不穩定:API 可能無法連線
  • 成本考量:測試會產生 API 費用
  • 速度問題:真實 API 調用很慢

Koog 的解決方案

Koog 框架提供測試工具來解決這些問題

  1. Mock 系統:模擬 AI 回應,不用真實 API
  2. 測試模式:專用的測試環境設定
  3. 基礎驗證:檢查 Agent 執行是否正常

測試環境設定

在開始撰寫測試之前,我們需要先在 build.gradle.kts 中加入必要的測試相依套件

dependencies {
    // Kotlin 協程測試支援
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2")

    // Koog AI 測試框架
    testImplementation("ai.koog:agents-test:0.3.0")

    // Kotlin 測試基礎套件
    testImplementation(kotlin("test"))
}

這些套件提供了

  • kotlinx-coroutines-test:支援協程的測試工具,包含 runTest 函數
  • ai.koog:agents-test:Koog 框架的測試工具,提供 Mock 系統和測試模式
  • kotlin("test"):Kotlin 標準測試套件,包含斷言函數

安裝完成後,就可以開始撰寫測試了

單元測試:Mock 驅動的測試策略

基礎 Mock 測試

讓我們從一個簡單的 Mock 測試開始,學習如何測試 AI Agent

@Test
fun `should respond to greeting`() = runTest {
    // 建立 Mock 執行器
    val mockExecutor = getMockExecutor {
        // 當收到包含「你好」的訊息時,回應特定內容
        mockLLMAnswer("您好!我是客服助手,有什麼可以幫助您的嗎?") onRequestContains "你好"

        // 設定預設回應(當沒有符合條件時)
        mockLLMAnswer("我需要更多資訊才能幫助您").asDefaultResponse
    }

    // 建立測試用 Agent
    val agent = AIAgent(
        executor = mockExecutor,
        systemPrompt = "你是一個友善的客服助手",
        llmModel = OpenAIModels.CostOptimized.GPT4_1Mini
    ) {
        withTesting() // 啟用測試模式
    }

    // 執行測試
    val result = agent.run("你好")

    // 驗證結果
    assertEquals("您好!我是客服助手,有什麼可以幫助您的嗎?", result)
}

Mock 工具行為

當 Agent 需要使用工具時,我們也可以模擬工具的行為

object WeatherTool : SimpleTool<WeatherTool.Args>() {

    @Serializable
    data class Args(val text: String) : ToolArgs

    override val argsSerializer = Args.serializer()

    override suspend fun doExecute(args: Args): String {
        return ""
    }

    override val descriptor = ToolDescriptor(
        name = "get_weather",
        description = "查詢指定城市的天氣資訊",
        requiredParameters = listOf(
            ToolParameterDescriptor(
                name = "city",
                description = "城市名稱(支援中文或英文)",
                type = ToolParameterType.String
            )
        )
    )
}

@Test
fun `should use weather tool correctly`() = runTest {
    // 建立工具註冊表
    val toolRegistry = ToolRegistry {
        tool(WeatherTool)
    }

    val mockExecutor = getMockExecutor(toolRegistry) {
        // 模擬 LLM 決定呼叫天氣工具
        mockLLMToolCall(
            WeatherTool,
            WeatherTool.Args("台北")
        ) onRequestContains "台北天氣"

        // 模擬工具回傳結果
        mockTool(WeatherTool) alwaysReturns "台北今日晴天,溫度 25 度"

        // 設定 AI 回應
        mockLLMAnswer("台北今日晴天,溫度 25 度") onRequestContains "台北天氣"
    }

    val agent = AIAgent(
        executor = mockExecutor,
        systemPrompt = "你是天氣助手,可以查詢天氣資訊",
        toolRegistry = toolRegistry,
        llmModel = OpenAIModels.CostOptimized.GPT4_1Mini
    ) {
        withTesting()
    }

    val result = agent.run("請告訴我台北天氣如何")
    assertTrue(result.contains("25 度") || result.contains("晴天"))
}

基本執行流程測試

我們可以測試 Agent 是否按預期的流程執行

@Test
fun `should execute basic workflow`() = runTest {
    val mockExecutor = getMockExecutor {
        // 設定多步驟回應
        mockLLMAnswer("我需要先了解您的問題") onRequestContains "問題"
        mockLLMAnswer("讓我為您提供解決方案") onRequestContains "了解"
        mockLLMAnswer("問題已解決").asDefaultResponse
    }

    val agent = AIAgent(
        executor = mockExecutor,
        systemPrompt = "你是問題解決助手",
        llmModel = OpenAIModels.CostOptimized.GPT4_1Mini
    ) {
        withTesting()
    }

    // 測試基本執行
    val result = agent.run("我有一個問題需要協助")

    // 測試基本執行
    var result = agent.run("我有一個問題需要協助")
    assertEquals("我需要先了解您的問題", result)

    result = agent.run("我想要了解相關的方案")
    assertEquals("讓我為您提供解決方案", result)

    result = agent.run("謝謝你的回答")
    assertEquals("問題已解決", result)
}

整合測試:真實環境驗證

基本整合測試設定

當我們需要測試真實的 AI 功能時,可以設定整合測試

class RealAgentTest {

    @Test
    fun `integration test - real AI response`() = runTest {
        // 設定真實的 API 金鑰(從環境變數獲取)
        val openAiKey = System.getenv("OPENAI_API_KEY") ?: return@runTest

        val executor = SingleLLMPromptExecutor(
            OpenAILLMClient(openAiKey)
        )

        val agent = AIAgent(
            executor = executor,
            systemPrompt = "你是一個友善的助手,請用正體中文回答",
            llmModel = OpenAIModels.CostOptimized.GPT4_1Nano,
            temperature = 0.1 // 使用較低溫度讓回應更穩定
        )

        // 測試真實場景
        val response = agent.run("請簡短說明什麼是 AI")

        // 驗證基本品質
        assertTrue(response.isNotEmpty())
        assertTrue(response.contains("AI") || response.contains("人工智慧"))
    }
}

本地測試選項

如果不想使用雲端 API,也可以使用本地模型進行測試

class LocalModelTest {

    @Test
    fun `local model test - basic response`() = runTest {
        // 假設已設定 Ollama 本地服務
        val executor = SingleLLMPromptExecutor(OllamaClient("http://localhost:11434"))

        val agent = AIAgent(
            executor = executor,
            systemPrompt = "你是一個簡潔的助手",
            llmModel = OllamaModels.Meta.LLAMA_3_2
        )

        val response = agent.run("說個笑話")
        assertTrue(response.isNotEmpty())
        println("本地模型回應:$response")
    }
}

測試最佳實踐

在編寫 AI 應用測試時,建議遵循這些原則

  • 單元測試優先使用 Mock:避免真實 API 調用的成本和不穩定性
  • 整合測試要謹慎:只在必要時使用真實 API
  • 使用寬鬆的斷言:AI 回應有隨機性,不要過於嚴格

進階測試主題

本文介紹的是 Koog 測試框架的基礎功能,實際上還有許多進階的測試主題尚未涵蓋

Strategy Graph 測試

Koog 框架的一大特色是 Strategy Graph(策略圖),它定義了 AI Agent 的執行流程和決策邏輯。官方文件提供了完整的 Graph 測試工具

  • testGraph:測試整體圖結構
  • assertNodes:驗證節點的輸入輸出行為
  • assertEdges:確認節點之間的連接邏輯
  • assertSubgraphByName:測試子圖的存在和結構
  • verifySubgraph:深入驗證子圖內部邏輯

其他測試功能

Koog 測試框架還提供了

  • 事件處理測試:使用 EventHandler 測試工具調用、錯誤處理等事件
  • 多種 Mock 模式:條件式回應、預設回應、工具行為模擬
  • 測試模式配置:withTesting() 啟用特殊測試功能

這些進階功能讓你能夠更全面地測試 AI 應用的各個層面。如需深入了解,請參考官方文件

結語

透過本篇文章,我們學習了 AI 應用測試的基本策略

  • Mock 系統:使用模擬回應進行快速測試,避免真實 API 成本
  • 基本驗證:檢查 Agent 執行流程和回應內容
  • 整合測試:必要時使用真實 LLM 服務進行端到端測試
  • 實用技巧:處理 AI 回應隨機性的測試方法

測試是確保 AI 應用品質的重要環節。從簡單的 Mock 測試開始,逐步建立適合您應用的測試策略。下一篇文章將探討如何將 Koog 應用部署到生產環境

參考文件


支持創作

如果這篇文章對您有幫助,歡迎透過 贊助連結 支持我持續創作優質內容。您的支持是我前進的動力!


圖片來源:AI 產生