为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导师的实际挑战,我们很乐意交流。我们正在招聘。