ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI 家教状态机详解:从 INIT 到 DONE,每一轮 Turn 如何被「管住」

AI 家教状态机详解:从 INIT 到 DONE,每一轮 Turn 如何被「管住」 AI 家教状态机详解从 INIT 到 DONE每一轮 Turn 如何被「管住」标签状态机LLM应用架构Spring Boot教育科技Agent系列接《别再「套个大模型」了》技术深挖可控讲题的编排实现。写在前面接上大模型不等于接上「会教的老师」。模型会写话术却管不住「审题 → 分步 → 复述 → 收尾」的课堂节奏。本文讲 AI 家教里的状态机编排INIT→DONE各状态职责、一轮Turn的前后端契约、幂等与后处理闸门、多问误拆怎么防。一句话——状态机控权模型负责怎么说后处理防止说崩。适合已接 LLM、却被跳步 / 卡死 / 串学科折磨过的同学对照落地。1. 为什么必须上状态机大模型擅长「写得像老师」不擅长「严格服从课堂流程」。如果完全交给模型决定「讲到哪了」常见后果是一步讲完整题破坏分步 Reveal语文题突然教列方程只有一题却不断「下一问」收尾轮没有出口学生无法结束所以我们把状态推进权放在后端编排器把话术生成权交给模型再用后处理校正 Turn 的 UI/选项/下一状态。一句话状态机控权模型负责怎么说后处理防止说崩。2. 状态一览VIP 主路径状态职责学生常见动作典型下一状态INIT审题 考查点 第一步提问打字回答THINKUNDERSTAND对齐理解 / 情绪与卡点处理选项或文本THINKTHINK题目解构、进入第一步选项或文本STEPSTEP一步一问可多轮选项 / 文本 / 下一步STEP或CHECKCHECK复述自检按学科换话术打字复述SUMMARY/ 补讲SUMMARY结构化总结看解析 / 结束 / 下一问EXTENDEXTEND收尾选择区同上DONE或下一问重开DONE终态无互动DONE说明会话创建时会固化flow_typeVIP / Legacy后续turns:next只按该值路由。状态在实现里多为字符串常量读代码时先确认链路再进 Handler。3. Turn 协议前后端的「一轮课」每一轮后端返回结构化 JSON示意{state:CHECK,message:做个复述自检……语文设问→依据→收束,question:请用自己的话复述这题的赏析思路,options:[],ui:{allowTextInput:true,showNextButton:false},next_state:CHECK}字段含义字段含义message老师说的话气泡主文question本轮向学生提的问题options可点选项空数组表示不靠选项推进ui.allowTextInput是否开放底部输入ui.showNextButton是否显示「下一步」next_state本轮结束后会话应落到的状态三条铁律建议写进单测 / 后处理有question且无options→ 必须allowTextInputtrue并关闭孤立的「下一步」。进入 SUMMARY / 收尾→ 必须有可点出口查看解析 / 结束练习 / 多问时的下一问。禁止死锁轮无选项 不可输入 无下一步且非 DONE。这三条比「把 Prompt 写得更长」可靠得多。4. 编排主流程伪代码以下为 VIP「下一轮」的骨架逻辑示意非某一文件逐行拷贝function nextTurn(userId, explanationId, req): e loadOwnedExplanation(userId, explanationId) // —— 守卫 —— if turn : findByClientTurnId(req.clientTurnId): return replay(turn) // 幂等弱网连点不重复计分/不重复生成 if e.currentState DONE: return terminalDoneTurn() // 已结束不再写库 if req.currentState ! e.currentState and not isExitAction(req): // 结束/下一问等收口动作可放行 return softResyncTurn(e) // 并发提示带回服务端当前态 // —— 多问误拆纠正 / 懒加载拆分示意—— reconcileMisSplitIfStatementEnum(e) // ①②③「以上说法正确个数」→ 单问 // —— 按状态分发 —— switch e.currentState: case CHECK: turn runCheck(req, e) // 空输入→按学科发复述题有输入→掌握判定 case SUMMARY: turn handleSummaryOption(req, e) // 仅处理选项类事件更稳 case EXTEND: turn handleExtend(req, e) case THINK: turn llmGenerate(buildCtx(e, req)) case STEP: maybeStepPaceNudge(e, req) // 轮次偏多催促而非硬砍死 turn llmGenerate(buildCtx(e, req)) default: turn llmGenerate(buildCtx(e, req)) // —— 后处理闸门比 Prompt 更硬—— postProcess(e, turn) // —— 落库并推进 —— saveExplanationTurn(...) e.currentState turn.nextState updateExplanation(e) return turn4.1 CHECK掌握检测学科感知function runCheck(req, e): if blank(req.userInput): return checkAskTurn(e.subject) // 语文设问→意象/词句→收束 // 数学已知所求→关系/列式→代回核对 // 英语/史地政各自话术 if not masteryPass(req.userInput, e.question, e.subject): return masteryFailSummary(...) // 标准答案方向 薄弱点 收尾选项 return masteryPassSummary(...) // 同一轮给总结选项禁止「空桥接轮」空桥接轮是典型事故只说「接下来给你结构化总结」却不给内容、不给选项、不给输入——前端必卡死。正确做法是通过后同一轮交付总结与出口。4.2 postProcess最后一道闸function postProcess(e, turn): if turn.state INIT: turn.options [] ensureFirstStepAsk(turn) // 去掉全科通用卡点问卷 if hasQuestion(turn): allowInput(turn); hideNext(turn) if turn.state SUMMARY or turn.nextState SUMMARY: turn.nextState EXTEND ensureExitOptions(turn) // 查看解析 / 结束 / 下一问 injectNextSubQuestionIfNeeded(e, turn) if turn.state EXTEND: sanitizeExtendOptions(turn) forbidInteractiveDeadEnd(turn) // 非 DONE 不得死锁5. 多问大题怎么推进又如何防误拆5.1 数据模型sub_questions_json子问列表sub_question_index/sub_question_total当前问与总数Prompt 侧优先喂「当前子问」附带原题片段避免多问混讲。5.2 下一问if user picks NEXT_SUB_Q and hasNext(e): advanceIndex(e) reset stepIndex return buildFirstTurnAsInit() // 下一问重新开场5.3 误拆防护实战结论中文试卷编号语义不统一形态常见含义(1)(2)(3)/第1问真·多问设问①②③④ 「以上说法正确的个数」说法枚举 单题选择规则上要强信号才拆说法枚举强制单问历史误拆可 reconcile。6. 与 LLM 层如何协作简图编排器 buildCtx(状态/题干/历史摘要/学科/学段) │ ▼ TutorEngineRouter │ ├─ LangChainTutorEngine ──► LlmGateway │ ├─ TEXT │ └─ NATIVE FC多轮 tool loop硬上限 ├─ DeepSeek 降级路径 ────────► LlmGateway.chatText └─ RuleBased 兜底 ───────────► 无外网也能走完主路径工具侧建议白名单 服务端执行如当前子问、步骤摘要、KB 检索、错因模式。定量验算如鸡兔更适合后置校验流水线不一定要做成 Function Calling以免打乱引导式教学。Prompt 运行时读库可热更新仓库 Markdown 用于规范与引导入库——改文件后记得同步库表否则线上仍是旧约束。7. 客户端只需做好三件事每轮带上explanationId、currentState、eventType、clientTurnId严格按options/allowTextInput/showNextButton渲染不在前端「猜」业务连点防护稳定的clientTurnId服务端幂等不要用前端补丁修复后端死锁。死锁是编排/后处理的责任前端兜底只会掩盖问题。8. 落地检查清单可当 Code Review 列表INIT 是否还在甩全科通用「卡点问卷」有提问无选项时是否强制开放输入CHECK 话术是否按subject分支掌握通过是否同一轮给出总结出口SUMMARY/EXTEND 是否必定能结束会话说法枚举题是否不会被拆成多问clientTurnId是否真正幂等大模型失败时 Rule/兜底是否仍能讲完9. 小结AI 家教的状态机本质是在回答一个问题开放生成与封闭流程之间如何做出稳定、可测、可运营的教学体验我们的实践答案是用状态机定义「课怎么上」用 Turn 协议定义「这一分钟师生怎么互动」用后处理定义「模型越界时系统怎么拉回来」用学科分支定义「同一流程下话术如何不同」下一篇AI 家教实战Function Calling RAG增强讲题却不抢教学节奏。欢迎评论区交流你们的状态划分方式或「死锁 / 串台 / 误拆」的真实案例。
返回列表