- 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 框架提供測試工具來解決這些問題
- Mock 系統:模擬 AI 回應,不用真實 API
- 測試模式:專用的測試環境設定
- 基礎驗證:檢查 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 產生