
AI 家教实战Function Calling RAG增强讲题却不抢教学节奏标签Function CallingRAGLangChain4j教育科技大模型应用系列本文接《状态机专章》讲LLM 侧如何「借力」却不抢走状态机方向盘。写在前面前两篇我们分别讲了产品哲学状态机控权模型负责怎么说后处理防说崩编排细节INIT→DONE、Turn 契约、多问误拆、死锁闸门这篇回答一个更「工程向」的问题既然流程已经管死了还要不要 Function Calling 和 RAG要的话怎么用才不会把课堂又搞乱一句话结论工具与检索只提供「事实与上下文」不提供「下一状态」状态推进权永远在编排器。1. 为什么「纯 Prompt」不够讲题场景里模型经常需要这些信息需求纯塞进 Prompt 的问题当前子问题干多问大题时 Prompt 越来越长模型仍会串问已讲步骤要点靠「历史摘要」容易丢漏或重复讲学科知识/错因全量 KB 塞进去既贵又不稳连续答错纠偏规则写死在 Prompt 里难维护更麻烦的是让模型「假装」调工具在 JSON 里写needTooltrue解析失败率高、难观测、难回滚。所以我们做了两件事原生 Function CallingNATIVE模型真正tool_calls服务端白名单执行最小可用 RAGKB 片段可检索注入主路径默认克制避免拖垮节奏2. 统一入口LlmGateway讲题主路径与旁路OCR、学科分类、掌握判定等都收敛到同一网关避免到处 new ClientTutorEngine / OCR / Subject / Mastery │ ▼ LlmGateway │ ┌─────────┼─────────┐ │ │ chatText chatForTeachTurn 纯文本 NATIVE 多轮 tool loop │ │ └─────────┬─────────┘ ▼ ChatLanguageModelDeepSeek OpenAI 兼容 │ ▼仅讲题 NATIVE TutorToolRegistry.execute服务端白名单设计要点状态机、Turn 协议、后处理不变——FC 只增强「生成前能拿到什么」配置可切NATIVE/PROMPT_LEGACY伪工具回滚/NONEAPI Key 探测与模型工厂统一降级路径仍走 Gateway不另起一套 HTTP Client3. 工具白名单少而准我们刻意控制工具数量。教育 Agent 不是万能助手工具越多模型越容易「为了调工具而调工具」时延和 token 一起炸。工具名能力典型使用场景get_current_sub_question当前子问题干多问推进、防串问get_step_digest已讲步骤要点 结论池STEP/CHECK 避免重复或漏讲search_kbKB / RAG 检索需要知识片段补强时get_wrong_pattern连续对错纠偏建议学生反复踩同一坑刻意不做进 FC 的能力数量题验算如鸡兔同笼放在后置流水线如定量校验而不是 Function Calling。原因很现实验算是「对不对」引导式教学是「怎么想」——职责不同做成工具容易被模型提前调用抢戏、泄题、打断一步一问题型特判塞进工具表白名单会无限膨胀能后置校验的就不要前置于工具调用。4. 多轮 tool loop怎么防「工具飞车」NATIVE 路径大致是messages ToolSpecification │ ▼ 模型 generate可带 tool_calls │ ├─ 无 tool_calls → 期望输出 Turn JSON → 结束 └─ 有 tool_calls → 服务端并行执行 → 结果写回 messages │ ├─ 未达上限 → 继续带 tools 再 generate └─ 达上限 → 去掉 tools硬约束「只输出 Turn JSON」工程约束建议写进配置 代码硬帽maxToolCallsPerTurn业务默认偏小例如 2硬上限例如 3防止配置误写成 20 导致时延爆炸同名 同参本轮缓存避免模型重复打同一工具按状态开放工具INIT / DONE 等状态可关掉只在 UNDERSTAND / THINK / STEP / CHECK / EXTEND 等需要处开放未知工具名拒绝执行只走注册表旧伪工具名可做别名兼容模型再聪明也不能通过工具返回「请把 next_state 改成 SUMMARY」——工具结果只是文本事实块编排器才认状态。5. RAG最小可用而不是一上来上向量库全家桶5.1 知识从哪来实践里我们把可复用要点放在 Prompt 模板表中约定template_code以kb/开头例如kb/english/reading.md、kb/math/equation.mdbody 写解题要点 / 常见误区 / 步骤模板不要写状态机协议字段运维可在后台增删改讲题侧按前缀与学科路由检索。5.2 两层检索策略查询题干 ± 关键词 hint │ ▼ 向量检索优先若启用且有索引 │ ├─ 命中 → TopK 片段注入 └─ 失败/无命中 → 关键词打分检索学科前缀优先再回退 kb/原则向量不是必须没有 embedding 表 / 模型不可用时关键词路径仍可工作命中要克制TopK 要小注入块要带「必须结合当前题干」的纠偏说明防止模型照抄 KB 空话5.3 什么时候注入——节奏优先RAG 最容易犯的错是每一轮都塞知识模型变成「念教材」分步引导立刻崩。我们的策略是分层场景是否注入说明查看详细解析VIEW_DETAIL默认主战场学生主动要「讲透」适合补知识STEP / CHECK 纠偏可按开关/命中仅作错因参考禁止替代引导问句INIT 开场通常关闭开场应短别一上来堆术语Function Callingsearch_kb模型按需拉取仍受 tool loop 上限约束注入块建议带场景标签例如【RAG:查看详细解析-知识片段】 说明以下为参考要点你必须结合当前题干与当前子问生成具体解析 禁止整段照抄禁止输出状态机字段……RAG 是「参考书架」不是「替老师讲完整课」。6. 和状态机怎么分工总览图学生点击 / 输入 │ ▼ 编排器VIP/Legacy决定本轮 state、event、是否允许下一步 │ ▼ 组装 AiTutorTurnContext题干、学科、历史摘要、子问…… │ ├─可选被动 RAG 注入 Prompt ▼ LlmGateway.chatForTeachTurn ├─ 模型可调白名单工具含 search_kb └─ 最终输出 Turn JSON 候选 │ ▼ 后处理UI 契约 / 学科话术 / 死锁闸门 / next_state 校正 │ ▼ 落库 返回前端记住这条边界层可以做不可以做FC / RAG补充事实、步骤摘要、知识片段决定跳到哪一状态、改 UI 契约状态机推进、回退、多问、结束代替全部话术润色后处理纠偏 Turn、防卡死假装「又调了一次模型」7. 线上坑位我们踩过 / 提前规避的坑 1伪工具时代「模型说要工具却解析失败」Prompt 里让模型输出needTool 工具名经常半残 JSON。解法切 NATIVELEGACY 仅作回滚且模型明确needToolfalse时不要强行兜底乱调。坑 2工具无限循环模型一轮又一轮search_kb学生等半分钟。解法业务上限 工程硬帽 同参缓存 达上限强制纯文本出 Turn。坑 3RAG 把引导式讲题「讲穿」知识片段里写了标准答案步骤模型 STEP 一轮全抖完。解法KB 写「要点/误区」而非完整答案注入说明强制「结合当前子问」主路径默认少注入。坑 4工具结果泄露敏感或协议字段工具若直接拼会话内部结构模型可能复述到气泡里。解法工具返回「面向教学的摘要文本」后处理仍校验 Turn禁止工具返回next_state之类字段。坑 5旁路各调各的 HTTP ClientOCR、学科分类、讲题各写一套 DeepSeek 调用超时与鉴权行为不一致。解法统一LlmGateway旁路只用chatText不挂工具。8. 落地检查清单工具是否白名单 服务端执行禁止前端/模型「发明」新工具maxToolCallsPerTurn与硬上限是否同时存在同参工具是否本轮去重INIT/DONE 等状态是否默认不挂工具定量验算是否放后置而不是 FCKB 片段是否与状态机 Prompt 分库分区kb/前缀RAG 是否默认克制仅在「查看解析 / 纠偏 / 显式 search」打开向量失败时是否有关键词回退回滚开关是否一键能切到PROMPT_LEGACY/NONE9. 小结Function Calling 和 RAG 在 AI 家教里的正确姿势不是「让 Agent 更自由」而是用工具补齐模型看不见的会话事实子问、步骤、错因用 RAG 补齐模型不该死记的学科要点且按需、克制用上限、白名单、后处理保证它们永远抢不走方向盘对应到系列三句口诀状态机握方向盘大模型负责油门和风景工程后处理当安全带。FC / RAG 只是油箱和地图——加错油、地图念太大声车照样会翻。如果你也在教育场景里上工具调用欢迎评论区聊聊你们把哪些能力做成了 tool又刻意把哪些留在了后置流水线系列导航别再「套个大模型」了我们做 AI 家教真正难的是把老师「控住」AI 家教状态机详解从 INIT 到 DONE每一轮 Turn 如何被「管住」本文Function Calling RAG