為5歲兒童構建實時AI導師
本文介紹了為4-9歲兒童構建實時AI數學和閲讀導師的工程挑戰與架構決策。核心挑戰在於實現亞秒級響應,同時融入教學法,避免兒童注意力分散。團隊摒棄了標準代理循環,設計了自定義架構,將生成與執行分離,實現流式動作,並利用異步規劃器在兒童思考時進行教學推理。安全系統通過並行生成與檢查,在不增加延遲的前提下保障內容安全。
我們着手構建首個面向4-9歲兒童的AI導師,教授數學與閲讀。要讓AI真正教好五歲孩子,教學法必須融入工程之中。兒童無法忍受緩慢的回覆,看不懂聊天界面,也無法忘記模型説錯的任何內容。在此,我們希望分享塑造我們實時AI導師架構決策的一些經驗。
對話中兩秒的停頓對兒童、開發者乃至與自動代理通話的成人都意義不同。幾秒鐘足以讓兒童注意力渙散,學習停滯。優秀的教師無需停頓思考就能管理好節奏:他們立即回應孩子,即使他們保留答案讓孩子自行思考。教學是在當前時刻選擇合適的方法,而大多數方法並非直接給出答案。
當我們開始構建面向4-9歲兒童的AI導師時,我們希望構建真正會教學的導師,而不僅僅是快速回應的聊天機器人。我們深知其底層約束十分嚴苛且不可妥協:每一次交互必須達到亞秒級響應。大多數代理通過推理預算在速度與質量之間權衡,而我們的架構必須將導師建立在教學法之上,並實時回應孩子。
我們摒棄了標準代理循環。教師不斷決定如何引導學生:是説話、在白板上畫圖、玩遊戲還是完全轉換話題。當前代理的標準模式是工具循環:LLM輸出一個或多個工具調用,等待執行,觀察結果,然後決定下一步。因此,構建教學代理的直接方法是為教師可能採取的每個動作創建一個工具。
但工具循環存在延遲問題。前沿模型需要2-3秒生成第一個token,然後以約30 token/s的速度解碼。我們的動作平均幾十個token。加上往返延遲和音頻播放,標準循環意味着每句話或屏幕變化之間會有3-4秒的空閒時間。在早期的一次玩家測試中,我們親眼目睹了這種情況:一個六歲男孩等待代理思考後問道:“他為什麼不做任何事?什麼時候開始?真無聊。”另一個孩子發現她只需部分時間集中注意力就能跟上,延遲教會了她忽略導師——那也是她停止學習的一刻。
方便的修復方案是使用更小、更快的模型,但這暴露出範圍問題。教學是一項廣泛的任務:導師可能在一節課中選擇幾十個動作,而最困難的決定往往是保留答案,給出提示、提出更小的問題或讓孩子適度掙扎,以便當他們悟出答案時洞察力真正屬於他們。較小的模型難以在如此廣泛的範圍內遵循指令。我們早期使用小模型的代理版本響應迅速,但不斷泄露答案,每次泄露都剝奪了學習發生的時刻。
因此,我們構建了一個自定義控制機制來平衡指令遵循、延遲和靈活的動作空間。模型在單個響應中流式輸出多個動作,解釋器在模型生成後續動作的同時解析並執行每個動作。孩子只需等待大約30個token的第一個動作,而非整個響應完成。
將生成與執行分離還帶來兩個好處:我們可以根據情境更改可用動作(例如,當問題出現在屏幕上時,代理收到搭建支架的指令和選項,而非直接回答);並且可以在不造成延遲損失的情況下驗證每個動作——僅在流產生無效動作時才中斷並重新生成,否則執行永不暫停。
這一切都非免費。掌控循環意味着我們必須構建自己的可觀測性和追蹤,而非依賴框架。並且我們逆流而行:前沿模型在工具使用模式上進行了大量後訓練。如果未來模型足夠快,我們的控制機制可以被更簡單的循環取代。
經驗:代理框架正朝着後台工作發展,其中速度與思考的權衡簡單;而實時學習處於另一極端。以對話速度教學意味着我們自己掌控循環。
好的導師能預測孩子下一步做什麼。真正的教師既反思學生剛做的事,又預料他們接下來會做什麼。同一節課教一百次,你會看到模式,但你也瞭解這個孩子:他們哪裏停滯不前,什麼讓他們興奮,今天可能在哪裏絆倒。你帶着計劃開始上課,並實時調整。
我們稱與孩子交互的代理為“對話器”。早期實驗表明,更小的動作空間能帶來更好的指令遵循,因此我們構建了第二個代理“規劃器”,用於對照課程目標審視對話並管理對話器的上下文。第一版同步運行,當然太慢了。固定輪次後過期的計劃不可靠,讓對話器請求新計劃也不奏效。有效的方案是異步規劃器,它在孩子思考或説話時運行——就像教師在對話間隙反思和預判一樣。那些間隙正是做出判斷的時機:挑戰孩子還是讓他們成功,繼續當前概念還是繼續前進。教師憑直覺做出判斷;模型必須推理出路徑,而異步運行為其贏得了時間。
異步還意味着兩個代理同時運行,兩者都讀寫共享狀態而不協調。因此,我們將每個輪次、每次點擊和每次UI更新作為不可變事件存儲在僅追加日誌中。任一代理讀取和追加,無需等待對方。
這種軌跡格式還支持另一種預判。每當對話器提出封閉式問題(如填空、玩I Spy、完成方程式等)時,控制機制會假設孩子可能的答案,並在自己的分支上預生成對每個答案的回應,從軌跡分叉出來。當孩子回答時,我們匹配分支並播放回應,無需等待新的模型調用。
代價是成本以及偶爾的預判錯誤。規劃器在更強大、更昂貴的模型上運行,且每個輪次都運行。而且預判終究是預判:有時一個準備好被推動的孩子會被輕鬆獲勝。更難評估的是對話器錯誤是失誤還是糟糕計劃的結果。我們尚無清晰的信號來決定何時信任計劃與實時發生的情況。
經驗:孩子實時與應用交互,而代理在離散的生成中運行,因此利用孩子思考或説話的時間。讓規劃器反思過去並預判未來,對話器處理當下,緩慢的教學推理與實時交流併發進行。當下一步可預測時,在孩子回答之前就生成它。
沒人聽到的安全檢查。大多數AI產品在模型調用或代理輪次之後串行構建護欄。用户不會注意到token流經過內容過濾器,開發者願意等待CLI工具調用自動審查。在與五歲孩子的實時對話中則無處可藏,也沒有撤銷:孩子不能聽到導師説的話。安全系統必須攔截每個輪次的每個動作。
我們的安全分類器是一個LLM,大約需要500-1000毫秒運行。等待檢查完成再運行對話器,每個輪次會額外增加一秒我們無法承受的延遲。這裏體現出我們控制機制中解耦生成與執行的另一個優勢:安全分類器阻止執行而不阻止生成。孩子説完話後,我們同時分派分類器和一個小模型來生成對話器的第一個動作。該模型快速反應,生成一個模仿或確認孩子話語的急切回應(“你喜歡恐龍!我也喜歡”)。
雖然基於規則的安全檢查更快更便宜,但它無法應對五歲孩子實際説話的方式。我們添加到安全策略的每個類別都會增加token,並需要重新調整非確定性分類器。有時轉錄錯誤會驚嚇分類器並觸發誤報。我們審查這些案例並用於改進代理對孩子的理解。
當急切動作生成時,分類器通常已返回安全。該檢查解除對話器的阻塞,使其在急切動作執行的同時生成。孩子聽到連續的輪次,儘管背後有多個模型調用。
但比延遲更困難的問題是:當反射性動作是錯誤選擇時該怎麼辦?模仿對於日常對話很好,但有時與教學法建議背道而馳。例如,一個孩子上課時説同學給他起了壞名字。同樣的反射會將壞名字迴響給孩子。因此,每當安全分類器標記孩子的輪次時,我們丟棄急切動作。對話器得到針對該輪次的不同指導:不要重複名字,承認那一定很糟糕,並建議與大人談談。
注意:我們的安全系統由兒童發展專家制定的政策管理。安全系統如何工作的細節將另文詳述。
經驗:將安全性檢查門控在執行而非生成上,以避免延遲損失。當檢查失敗時,用針對孩子情況的指導替換反射性回應。
三個問題空間只是冰山一角。構建AI導師需要的遠不止這些。你不能通過選擇正確的模型、給出提示然後收工來構建兒童AI導師。構建兒童AI導師需要更多:工程化一個實時系統,為事實正確性和教學正確性提供足夠時間——保留答案的時間,當答案削弱學習時;在孩子完成思考之前選擇下一個動作的時間;在聽到前反思快速反射的時間。
這些碎片單獨看起來很小,但只有當它們協同工作時,魔法才出現:一個提前思考、優雅恢復、感覺與孩子同在而非追趕的導師。
如果你覺得這些問題有趣,或者想了解更多構建實時兒童AI導師的實際挑戰,我們很樂意交流。我們正在招聘。