上一篇我們讓 Agent 可以同時使用多個 MCP Tool,完成比較複雜的任務,不過在實際使用 Tool 時,不可能每次都成功。
如果要求 Agent 讀取一個不存在的檔案 Tool 就可能回傳錯誤,那麼 Agent 遇到錯誤之後會怎麼做呢,難道只能把錯誤訊息直接丟回給使用者嗎?
所以今天就來加入 Tool Error Handling,讓 Agent 遇到錯誤時,不只是回報錯誤,而是嘗試自己找到解決方法。
其實前面做 File System MCP 時,我們就已經有基本的錯誤處理。
例如 read_file():
if not path.exists():
return (
f"錯誤:找不到檔案 '{file_path}'。"
"可以先使用 list_files 查看目前有哪些檔案。"
)
如果讀取不存在的檔案,就不會直接讓程式發生例外,而是回傳一個有意義的錯誤訊息。
錯誤:找不到檔案 'tes.txt'。
可以先使用 list_files 查看目前有哪些檔案。
這樣的設計比單純回傳 Error 更容易讓 Agent 判斷接下來該怎麼做。
不過光是讓 Tool 回傳錯誤還不夠。
如果 Agent 收到找不到 tes.txt,然後直接告訴使用者抱歉,我找不到 tes.txt,這其實還是由使用者自己處理問題,就像下面這樣

雖然他有告訴我們發生了什麼事,並給出了一些建議,但整個過程還是被中斷了,所以這次我們會在 Agent 的 system_instruction 加入一些規則

這裡沒有直接寫死如果找不到 tes.txt 就去讀 test.txt,而是告訴 Agent 一個比較通用的原則:
如果 Tool 失敗,而且還有可能完成任務,就繼續想辦法。
這樣 Agent 才有機會根據不同情況自己選擇 Tool。
我們拿之前的 file_server.py 來做測試,包括之前創建的sandbox和rag_client.py也一起搬過來,接著開始測試

這裡我輸入了幫我讀取 tes.txt,可以看到它成功讀取了 test.txt 的內容,這裡也能看出雖然我們稍微打錯了檔名,但 Agent 還是能夠自己判斷把錯誤更正。
整個過程大概是:
User
↓
read_file("tes.txt")
↓
找不到檔案
↓
Agent 分析錯誤
↓
list_files()
↓
找到 test.txt
↓
read_file("test.txt")
↓
取得內容
↓
完成任務
這樣這次 Agent 就不只是把錯誤回傳給使用者,而是自己繼續執行 Tool,直到找到可以完成任務的方法。
這次實作也讓我比較明顯感受到,Agent 的 Error Handling 不只是傳統程式裡的 try/except,可以簡單分成兩個部分:
負責處理預期會發生的錯誤。
例如:
if not path.exists():
return "錯誤:找不到指定的檔案。"
讓 Agent 知道 Tool 發生了什麼問題。
收到錯誤之後,判斷是否還有辦法完成原本的任務。
例如:
Tool 失敗
↓
分析錯誤
↓
選擇其他 Tool
↓
再次嘗試
這也是今天比較重要的地方。
今天讓 Agent 遇到 Tool 錯誤時,不再只是把錯誤訊息直接回傳給使用者,而是可以根據錯誤結果,自己選擇其他 Tool 繼續處理,雖然只是很簡單的例子,但這已經比單純呼叫 Tool → 得到結果更接近真正的 Agent。
因為實際任務中,錯誤不一定代表任務結束,有時候只是代表需要換一種方式繼續完成任務。
iThome鐵人賽