開發工具
Google 透過 Agent Development Ki...
Step by Step guide: Build a Voice Agent That Never Goes Silent using ADK

developers.googleblog.com · 2026-10-20
摘要
Google 透過 Agent Development Kit (ADK) 與 gemini-3.8-live 模型,提供開發者建立流暢語音 Agent 的實作指南。該方案強調利用非阻塞工具(non-blocking tools)與串流技術,在後端進行長時間查詢時仍能維持對話連貫性,並提供 WHEN_IDLE、INTERRUPT 等精確的回應排程控制。
解決語音對話中的「死寂」問題
在文字聊天介面中,若資料庫查詢或檢索增強生成(RAG)流程需要十三秒,會顯示載入動畫。然而,在即時語音對話中,若後端工具執行阻塞十三秒,將導致十三秒的完全靜默。這種情況會使用戶誤以為通話中斷並掛斷電話。由於後端查詢無法總是縮短至一秒以內,解決方案必須從架構層面著手,確保在慢速工具於背景執行時,Agent 仍能保持對話連貫性。開源的 Agent Development Kit(ADK)與 gemini-3.8-live 模型,讓開發者能在 Python 中原生實作非阻塞語音工具,無需自行編寫客戶端 WebSocket 事件迴圈來管理非同步工具狀態。
根據在 gemini-3.8-live 上的基準測試,在銷售報告工作流程中,將阻塞式工具切換為串流工具後,Agent 發出第一個字詞的時間從十四點四秒大幅縮減至一點二秒。此指南涵蓋如何利用串流工具、非阻塞 FunctionTool 定義以及回應排程(response_scheduling),建構具備反應速度且自然的語音 Agent。
非阻塞工具帶來的使用者體驗提升
在 ADK 中實作非阻塞工具呼叫,能立即改善使用者體驗。首先,它能消除對話中的空白時間。Agent 不再凍結在對話中途,而是能立即確認請求(例如:「現在正在查詢這些數據...」),並維持對話進行。其次,對於包含多個階段的工作流程(如連接、查詢與對帳),Agent 能敘述中間重要進展,使等待時間聽起來像是積極的進度。
此外,非阻塞工具支援多工與平行對話。當長時間查詢在背景執行時,使用者可以提出後續或無關的問題,Agent 能在不中斷會話的情況下及時回答。最後,開發者擁有精細的交付控制權,可決定最終結果何時以及如何進入對話:例如等待自然的說話間隙、立即中斷以發送關鍵警報,或靜默更新對話內容。
標準工具的阻塞困境與串流工具模式
在標準 Agent 開發中,工具通常定義為完成工作後返回單一值的非同步函數。若直接將其傳遞給 ADK 中的 Agent,在 Gemini Live API 雙向語音會話期間,執行迴圈會等待工具返回,才會生成進一步的模型輪次。若查詢耗時十三秒,Agent 將產生十三秒的完全靜默。即使提示指令要求「告訴使用者你正在處理」,也無法解決此問題,因為模型輪次被阻塞,等待函數回應負載。
為保持對話流暢,可採用兩種非阻塞模式。第一種是串流工具,適用於操作具有有意義階段的情況。在 ADK 中,將標準工具轉變為串流工具,只需將 return 改為 yield。透過定義非同步生成器(AsyncGenerator),ADK 會自動將工具宣告標記為 NON_BLOCKING,並向模型返回立即的狀態確認。
在實際運作中,當模型觸發串流工具時,ADK 會立即分派非同步狀態事件。Agent 會立即說話,例如:「現在為您查詢 EMEA 的數據...」。每個 yield 發送部分函數回應至上游,模型會隨之轉述每個更新。若使用者在查詢運行期間提出無關問題,Agent 可回答該問題,而不取消或中斷背景任務。
生產環境考量與使用者取消機制
對於串流工具的生產環境部署,需注意單一飛行(Single-Flight)工具呼叫。由於串流工具跨多個輪次推送更新,若使用者重複提示,模型可能會嘗試再次呼叫工具。因此,應在 docstring 中明確指示「僅呼叫一次」,並在工具實作中考慮實例化記憶體閂鎖或冪等金鑰,以確保生產安全。
ADK 提供內建的 escape hatch 供使用者取消長時間運行的串流工具。透過在 Agent 的工具列表中包含名為 stop_streaming 的函數,ADK 會攔截呼叫並取消生成器底層的 asyncio.Task,在函數內引發 asyncio.CancelledError,讓開發者能乾淨地關閉資料庫連線或檔案處理常式。值得注意的是,當使用者插話(Barge-In)時,Live API 會停止模型的輸出,ADK 會發出 interrupted=True 的事件以停止音訊播放,但正在運行的串流工具或背景工具並不會被取消,其結果仍會交付。若要停止工具,模型必須呼叫 stop_streaming。
背景執行與回應排程控制
若等待時間沒有故事可敘述,連續的狀態評論可能顯得具有侵入性。此時,可讓任務在背景靜默執行。一種快速設置方式是使用僅在完成時 yield 一次的 async generator。由於這是非同步生成器,ADK 會發出立即的待處理回應,Agent 會迅速確認請求,在計算期間保持靜默,並在準備就緒或使用者結束說話時呈現數據。
若偏好保留標準協程,可將函數包裝在 FunctionTool 中並配置 response_scheduling。在 ADK 2.10 以上版本,也可設定 behavior 為 NON_BLOCKING,以在背景運行工具而不修改排程模式。使用 response_scheduling 與一次性返回協程時,模型在整個函數完成前不會收到負載,因此通常不會發出初始語音確認,除非使用者繼續說話。此模式適合使用者立即轉入其他問題,且希望結果在下一個自然停頓時融入對話的情境。
response_scheduling 屬性控制模型對 incoming 工具回應的反應時機。WHEN_IDLE 從不切入正在進行的輪次;若模型或使用者仍在說話,結果會等待該輪次結束,模型會在下一個自然停頓時回應。ADK 支援三種排程行為:WHEN_IDLE、INTERRUPT 與 SILENT。在基準會話中,WHEN_IDLE 會禮貌等待模型回答其他問題後再交付數據;INTERRUPT 會在中途切斷當前語音,隨後模型完成答案並附加數據;SILENT 則將結果加入對話歷史,供後續輪次使用,不引發未經請求的宣告。
組合串流與排程
執行形狀(串流與否)與交付時機(response_scheduling)是獨立的,可進行組合。在 ADK 2.8 及更新版本中,串流工具可透過 yield types.FunctionResponse 動態指定每個更新的排程。例如,可將中間進度設為 SILENT,而將最終結果設為 WHEN_IDLE,以確保最終數據在說話者結束後交付。
基本原則是:若等待有故事,則串流它;若等待只是等待,則在背景運行,讓結果在閒置時落地。非阻塞工具並未減少後端執行時間,但改變了 Agent 的對話存在感。透過將 ADK 的串流工具與靈活的回應排程,搭配 gemini-3.8-live 的即時能力,開發者可建構在複雜操作中保持專注、自然且存在的語音助理。實作此方案需使用 google-adk >= 2.10.0 框架,並部署於 Gemini Enterprise 上的 gemini-3.8-live 模型。串流工具與即時排程需依賴雙向即時會話(run_live)環境。
●開發者:可參考 ADK 實作非阻塞工具與串流回應,優化語音 Agent 的流暢度
●投資人:Google 持續深化 Gemini 模型在即時互動與開發者生態系的應用
●一般用戶:未來使用語音助手時,將能體驗更自然、無停頓的對話流程
重要性評分
🟠 值得關注
喜歡這篇?每天早晨還有更多。
訂閱 5min AI,讓 AI 替你追蹤整個 AI 世界。
相關指南

Gemini Spark 教學:繁中完整上手指南(功能、定價、實測)
Gemini Spark 教學完整指南,深入解析 Gemini Spark 是什麼、怎麼用,並提供繁中介面設定、免費方案詳解與實測效能分析,助您快速上手。
閱讀指南 →
Gemini 2.5 Pro 怎麼免費使用?功能介紹與 ChatGPT 比較
Gemini 2.5 Pro 怎麼免費用?本文說明 Google Gemini 的開啟步驟、免費版和 Advanced 付費版的功能差異,以及 Gemini 2.5 Pro 和 ChatGPT 在哪些場景各有優勢。
閱讀指南 →
Gemini 教學:4 步生成 AI 手繪旅遊地圖與實戰應用
透過 Gemini 教學 4 步生成 AI 手繪旅遊地圖,掌握從概念到實作的完整流程。本文涵蓋 Gemini Developer API 定價分析、Google AI Studio 與 Gemini Canvas 對比,以及生成式 AI 在旅遊規劃中的實戰應用技巧。
閱讀指南 →🤖 本文摘要由 AI 自動生成,內容源自原始報導。如有疑慮,請參閱關於我們。
喜歡這篇?每天早晨還有更多。
訂閱 5min AI,讓 AI 替你追蹤整個 AI 世界。