技术实践
技术实践:怎么把 AI 的输出变成可靠数据?容错解析与行状态机
AI 输出最大的特点是不稳定:有时包着代码块围栏,有时前言不搭后语,有时冒出个不存在的题型。云帆轻工具的 AI 出题把「不稳定输出」变成「可靠入库」,靠的不是提示词祈祷,而是两层容错解析。这篇拆开讲。
第一层:JSON 怎么捞出来
意图识别返回的 JSON 经常被模型裹上 ```json 围栏或前后废话。解析前先清洗:有围栏剥围栏,没有就截取第一个 { 到最后一个 }。捞出来的字符串交给 JSON 解析器;解析失败不重试、不报错,直接降级成普通对话——用户根本感知不到中间发生了什么。
第二层:出题文本的行状态机
批量出题不让模型吐 JSON,而是吐「行格式」:题型行 [单选题]、选项行 A. 选项内容、答案行 答案: A、难度行、解析行。解析器按行扫描,用几个标志位记住当前状态——读到题型行就开新题,普通行按状态追加到题干或解析里。题干和解析都是多行文本,靠状态机逐行累积。
白名单:不认识的题型整题跳过
模型偶尔会输出已经下线的题型,比如简答题。解析器手里有一张题型白名单(单选/多选/判断),白名单外的题型不是试图转换,而是整题跳过——避免一道坏题污染相邻题目的解析状态。宁可少几道,不可坏一批。
答案归位:字母匹配与判断题特判
答案行里的字母要映射回选项:答案: AC 就把 A、C 两个选项标为正确,再剥掉选项行首的字母标识。判断题单独处理——答案行里出现「正确 / 错误 / True / False」就生成对错两个选项,而不是去匹配字母。题型不同,答案的语义完全不同。
分批生成,防跨批重复
一次要 30 道题,拆成每批最多 10 道、按题型编号,出题描述里追加「第 N 批」。批次小,模型输出更稳;编号独立,模型不容易跨批输出重复题目。每批生成完先解析、校验(单选只能一个正确答案、多选至少两个),再逐题入库;单题保存失败只跳过该题,不影响整批。
