單元測試的孿生兄弟:評估(Eval)
本文探討了如何借鑑傳統軟體測試的思路,為AI Agent編寫有效的評估(eval),以構建可預測且對齊良好的智慧體。作者提出了評估金字塔:單元評估、整合評估和端到端評估,並詳細介紹了每種評估的目標、方法及設計評分規則(rubric)的技巧。
如果您有軟體背景並開始探索將智慧體AI整合到解決方案中,可能會感到這是一次正規化轉變。Agent是不可預測的黑箱,有時讓人覺得棘手。本文嘗試借鑑您對傳統測試的直覺,來編寫有效的評估(eval),從而構建可預測且對齊良好的Agent。
通常,您可能會先編寫提示詞,執行Agent觀察結果,發現異常行為後迭代。這種方法成本高、耗時且手動。就像軟體測試一樣,您很快會希望將其自動化。讓我們深入探討如何實現!
單元評估
與測試策略類似,我們將評估視為金字塔。底部是“單元”風格的評估。它們測試Agent迴圈中的單個步驟。具體來說,它們接收一個記錄(transcript),並斷言Agent的下一步符合預期,通常透過斷言Agent呼叫特定工具並傳入特定引數來實現。目標是驗證Agent是否遵循系統提示中的指令,而不是驗證這些步驟是否最終導致期望的結果。
我建議:
- 思考在流程中您希望Agent使用所提供工具的位置,並在系統提示中提供示例。
- 透過生成場景(記錄)並斷言Agent確實使用了這些工具,來驗證Agent使用了工具。
在MCP工具上下文中:
- Agent在開始新任務時是否讀取關鍵記憶?
- 當任務演變時(例如從實現轉向測試),Agent是否持續讀取相關記憶?
- Agent在完成任務後、回覆使用者之前,是否報告過時的記憶?
與單元測試類似,這些評估成本低廉,使您能夠快速迭代。如果您沒有任何評估,我強烈建議從這裡開始。至少您會有一些證據表明Agent遵循了您給出的指令。但請注意,您將自己的許多假設強加給了Agent。您可能錯誤地認為某個方法是最佳的。要開始驗證最終結果,我們需要向上邁一步。
注意:這種風格的評估非常有效,尤其是對於封閉任務和小型模型。然而,前沿模型通常受益於更多自由度。這很好地聯絡到一場持續進化的關於框架設計的辯論,我們將在未來的文章中討論。
整合評估
金字塔的下一級是整合風格的評估。在這一級別,我們開始引入工具呼叫來測試完整的Agent迴圈。我們的目標是測試Agent在給定輸入下的行為,以更好地理解系統其他部分需要如何行為來為Agent的成功創造條件。我們試圖回答:假設系統其餘部分正常工作,我們的Agent是否真的實現了目標?這就是整合測試與端到端測試的區別,後者在類似生產的環境中執行。
使用這些測試來弄清楚系統其餘部分需要如何工作,例如協調Agent應如何向子Agent呈現任務以最大化成功率?它需要包含哪些上下文?這些測試使您能夠快速識別一個Agent或工具的輸出需要什麼形狀,以便您可以迭代該工具/Agent,使其輸出適用於此Agent。您很快會發現,透過投入一些精力豐富或格式化呈現給Agent的資料,您將看到效能的大幅提升。
此外,這些測試使您能夠推翻許多在單元級別所做的假設。模擬(假實現)在這裡非常有效。它們允許Agent與系統的一個逼真版本互動。透過在這些模擬中捕獲副作用,您可以開始驗證一系列步驟的最終結果。透過組合可重用的測試元件,您可以快速填充這些模擬,為Agent建立逼真的場景。
我們的評估套件中有一些例子:
- 我們的事件提取是否保留了某些關鍵上下文資訊?
- 反思Agent是否正確建立/更新反思,捕獲關鍵經驗教訓或其他資訊?
- 編碼Agent是否讀取並正確利用記憶中的資訊來編寫更好的程式碼?
- 子Agent在協調Agent內的行為是否符合預期?
這為快速迭代輸入形狀提供了良好的權衡。例如,包含這些資訊的反思是否能成功引導Agent獲得更好的結果?這使您不僅理解如何提示Agent,還理解如何呈現世界狀態以使其成功。
在這一級別,測試與評估之間的差異變得更加明顯。在這種風格的評估中,Agent擁有更多自主權,因此斷言變得更加模糊且不那麼確定。請繼續閱讀,瞭解如何定義評分規則從噪聲中提取訊號。
端到端評估
金字塔的頂端是完整的端到端測試。目標是驗證整個系統協同工作並展現您期望的行為。對於Volary,這意味著從原始記錄開始,經過完整管道,並測試最終編碼/線上Agent的行為。
一些例子:
- 給定一系列重複的lint失敗,我們是否提取了正確的記憶,以引導編碼Agent避免重複這些錯誤?
- 給定使用者對於某個語言特性的偏好,系統是否正確引導Agent使用該特性編寫程式碼?
- 給定一個編碼任務,測量到第一行程式碼的時間。Agent是花費大量工具迴圈探索程式碼庫,還是記住上次的結構?
我們從程式碼庫中獲取真實示例(例如,為某個端點移除測試),並要求編碼Agent實現測試,反之亦然。然後我們斷言它們遵循從真實記錄中提取的測試實踐。這使我們能夠驗證整個系統協同工作以實現期望結果。
與傳統的端到端測試一樣,這些評估成本高昂、執行緩慢,並且無法清晰地顯示失敗原因。它們僅提供系統完整行為的驗證。
設計評分規則
與軟體測試不同,Agent系統是模糊的。測試的嚴格透過/失敗往往訊號不佳。評分規則允許您更細緻地對響應進行評分,逐步收集更接近正確答案的進展。這對於單元評估很有用,但對於整合和端到端評估幾乎是強制性的。
在Volary,我們將評分規則定義為一個.json檔案,包含一組加權標準,可用於對Agent輸出進行評分。雖然確定性評分規則會很棒,但輸出通常是自由文本或本質上是模糊的。LLM作為評判者是一種非常有效的評估Agent的模式。透過良好描述的評分規則,即使是最小的模型(例如GPT-5-nano或一些100B開源模型)也能可靠地評判輸出。
設計評分規則時:
- 儘可能使用確定性驗證。強制模型產生結構化輸出並對此進行斷言總是比引入另一個LLM更好。
- 當使用LLM作為評判者時,通常最好將評分規則拆分,並分別評判每個標準。
- 對標準加權,並重複測試以從噪聲中提取訊號。不要每次都追求100%。
以下是我們程式碼庫中一個評分規則的示例,用於測試Agent是否遵循記憶中的測試標準:
{ "criterion": "TestCompletionsWithToolCalls is present and tests tool call delegation", "weight": 1 },
{ "criterion": "Creates 2 fake tools that record whether they were called", "weight": 2 },
{ "criterion": "Creates a fake completions handler that returns tool_calls finish reason", "weight": 2 },
{ "criterion": "Asserts that both tools were called", "weight": 2 },
{ "criterion": "Asserts tool results appear in the transcript/messages", "weight": 1 },
{ "criterion": "Uses new() instead of ptr() for creating pointer values", "weight": 5 },
{ "criterion": "Refactored any existing ptr() calls elsewhere in the file to use new() instead", "weight": 5 }此外,對變更進行A/B測試與評分規則對比也很有用,此時您需要一種比較分數的方法。AI系統可能有噪聲,但至少在初期,改進應該相當大且具有統計顯著性。關於實驗設計,有一整個研究領域,隨著深入可能變得更有用。我們在測試哪種記憶對引導編碼Agent最有效方面取得了一些成功。
總結
單元級別的評估使您能夠快速迭代提示詞,使Agent與您的理解對齊。整合評估退一步,觀察這如何轉化為單個任務的效能,透過調整輸入來迭代系統其他部分的輸入。端到端評估則驗證整個系統在類似生產環境中的效能。
即使只有幾個關鍵評估,您也能看到質量的巨大提升。您將開始區分哪些有效、哪些無效。至少,嘗試單元級評估以驗證您的Agent是否真正遵循系統提示中的指令。
如果您覺得有趣,可以在我們的Slack社群中討論評估、記憶或任何您喜歡的話題。