技术实践

技术实践:怎么把 AI 的输出变成可靠数据?容错解析与行状态机

AI 输出最大的特点是不稳定:有时包着代码块围栏,有时前言不搭后语,有时冒出个不存在的题型。云帆轻工具的 AI 出题把「不稳定输出」变成「可靠入库」,靠的不是提示词祈祷,而是两层容错解析。这篇拆开讲。

第一层:JSON 怎么捞出来

意图识别返回的 JSON 经常被模型裹上 ```json 围栏或前后废话。解析前先清洗:有围栏剥围栏,没有就截取第一个 { 到最后一个 }。捞出来的字符串交给 JSON 解析器;解析失败不重试、不报错,直接降级成普通对话——用户根本感知不到中间发生了什么。

第二层:出题文本的行状态机

批量出题不让模型吐 JSON,而是吐「行格式」:题型行 [单选题]、选项行 A. 选项内容、答案行 答案: A、难度行、解析行。解析器按行扫描,用几个标志位记住当前状态——读到题型行就开新题,普通行按状态追加到题干或解析里。题干和解析都是多行文本,靠状态机逐行累积。

白名单:不认识的题型整题跳过

模型偶尔会输出已经下线的题型,比如简答题。解析器手里有一张题型白名单(单选/多选/判断),白名单外的题型不是试图转换,而是整题跳过——避免一道坏题污染相邻题目的解析状态。宁可少几道,不可坏一批。

答案归位:字母匹配与判断题特判

答案行里的字母要映射回选项:答案: AC 就把 A、C 两个选项标为正确,再剥掉选项行首的字母标识。判断题单独处理——答案行里出现「正确 / 错误 / True / False」就生成对错两个选项,而不是去匹配字母。题型不同,答案的语义完全不同。

分批生成,防跨批重复

一次要 30 道题,拆成每批最多 10 道、按题型编号,出题描述里追加「第 N 批」。批次小,模型输出更稳;编号独立,模型不容易跨批输出重复题目。每批生成完先解析、校验(单选只能一个正确答案、多选至少两个),再逐题入库;单题保存失败只跳过该题,不影响整批。

出题是异步任务:进度按实际入库题数实时更新,完成或失败都通过站内信通知结果,任务失败会标记原因而不是静默消失。
本文对应的功能是「题库中心」,打开即可开始使用;计费方式见计费规则。

常见问题

为什么出题不用 JSON?

几十道题的 JSON 长输出容易半路截断、格式漂移,一坏全坏;行文本按行独立,一道题坏了只影响它自己,解析器还能跳过白名单外的题型。

解析失败会丢数据吗?

不会静默丢。整批解析失败会标记任务失败并说明原因;单题保存失败只跳过该题,最终结果消息写明「成功生成 N 道(请求 M 道)」。

状态机比正则一把梭强在哪?

题干、解析都是多行文本,正则需要跨行匹配容易顾此失彼;状态机按行推进、用标志位切换,逻辑和题目结构一一对应,排查问题时读代码就能还原解析路径。

不写文档,直接上手试

文章里讲到的每个步骤都能在工具里直接操作,创建完把二维码发出去就能用,按实际使用量计费。

云帆轻工具微信小程序码,微信扫码立即体验微信扫码
小程序立即体验