在前一篇文章中,我們學習了如何保護 AI 應用的資料安全與用戶隱私。今天我們要探討另一個重要主題:測試策略。當 AI 應用準備上線時,如何確保它能穩定運作?如何測試一個回應不固定的 AI 系統?
想像一下,你的 AI 客服系統已經開發完成,但你如何確保它在各種情況下都能正確運作?傳統應用的測試相對簡單,輸入固定就會得到固定輸出。但 AI 應用不同,同樣的問題可能得到不同的回答,而且還依賴外部的 LLM 服務。今天我們將學習 Koog 框架提供的測試工具,讓你能夠有效地測試 AI 應用,建立可靠的品質保證體系
AI 應用的回應往往不固定,同樣的問題可能得到不同的回答。這讓傳統測試方式變得困難
// 這種測試可能會失敗
@Test
fun `test AI response`() {
val result = agent.run("你好")
// AI 每次回應可能都不同
assertEquals("你好!很高興見到你", result)
}
AI 應用依賴外部 LLM 服務,測試時會遇到
Koog 框架提供測試工具來解決這些問題
在開始撰寫測試之前,我們需要先在 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 測試開始,學習如何測試 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)
}
當 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 應用測試時,建議遵循這些原則
本文介紹的是 Koog 測試框架的基礎功能,實際上還有許多進階的測試主題尚未涵蓋
Koog 框架的一大特色是 Strategy Graph(策略圖),它定義了 AI Agent 的執行流程和決策邏輯。官方文件提供了完整的 Graph 測試工具
Koog 測試框架還提供了
這些進階功能讓你能夠更全面地測試 AI 應用的各個層面。如需深入了解,請參考官方文件
透過本篇文章,我們學習了 AI 應用測試的基本策略
測試是確保 AI 應用品質的重要環節。從簡單的 Mock 測試開始,逐步建立適合您應用的測試策略。下一篇文章將探討如何將 Koog 應用部署到生產環境
圖片來源:AI 產生