news 2026/10/16 11:32:57

Python + JSON Schema 实现工单结构化输出与本地复核

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python + JSON Schema 实现工单结构化输出与本地复核

客服系统最危险的自动化,不是模型答错一句话,而是把“退款 9999 元”当成真指令一路执行。结构化输出(Structured Outputs)能要求模型按 JSON Schema 返回字段;但它不是业务真相。你还需要第二道本地门:金额、枚举值和缺失字段必须由程序复核。本篇用一个可复制的 Python 骨架完成这件事。

官方 Responses API 参考说明,json_schema可用于受约束的 JSON 输出,且较旧的json_object不推荐优先使用。模型、权限与配额以你的账号为准。示例为了可离线验证,先用模拟响应;接入时只替换call_model,密钥仅从环境变量读取。

通过

拒绝

用户文本

模型按 JSON Schema 提取

JSON 对象

本地字段/金额校验

进入人工队列

记录原因并回问

环境准备

需要 Python 3.10+。演示没有第三方依赖;真实请求可安装pip install openai,并设置export OPENAI_API_KEY='...'。不要把密钥写进源码。下面代码的超时参数放在真实调用处,避免网络问题无限等待。

importjson,osfromdecimalimportDecimal ALLOWED={"refund","shipping","other"}MAX_REFUND=Decimal("500.00")SCHEMA={"type":"object","properties":{"category":{"type":"string"},"amount":{"type":"string"},"summary":{"type":"string"}},"required":["category","summary"]}defcall_model(text:str)->dict:# 真实接入:确认 os.getenv("OPENAI_API_KEY") 非空,# 使用客户端 timeout=20,并传 text.format={type: "json_schema", ...}。ifnotos.getenv("OPENAI_API_KEY"):return{"category":"refund","amount":"128.50","summary":text}raiseRuntimeError("示例未在本次任务中实际调用线上 API")defvalidate(ticket:dict)->tuple[bool,str]:ifnotisinstance(ticket.get("summary"),str)ornotticket["summary"].strip():returnFalse,"缺少摘要"ifticket.get("category")notinALLOWED:returnFalse,"未知分类"ifticket.get("category")=="refund":try:amount=Decimal(ticket.get("amount","-1"))exceptException:returnFalse,"金额不是十进制数"ifnot(Decimal("0")<amount<=MAX_REFUND):returnFalse,"金额超出自动队列范围"returnTrue,"QUEUED_FOR_REVIEW"if__name__=="__main__":ticket=call_model("订单 A12 重复扣款,请退 128.50 元")ok,reason=validate(ticket)print(json.dumps({"ticket":ticket,"ok":ok,"reason":reason},ensure_ascii=False))

运行python ticket.py,在未设置密钥时预期看到ok: true和QUEUED_FOR_REVIEW;它只进入人工队列,不会退款。关键点是 Schema 解决形状,本地validate解决业务边界。常见失败有三类:模型漏字段,要求 Schema 的 required 字段并回问;金额带“元”或逗号,拒绝后让模型只输出数字字符串;网络慢或 429,真实调用设 20 秒超时并指数退避,不要在超时后盲目重试有副作用的动作。

适合把自由文本变成工单、表单和审核草稿;不适合拿模型结果直接放款、删库或处理医疗结论。工程化时,为每条记录保存原文、模型版本、Schema 版本和校验结果;再用脱敏历史样本统计拒绝率。5 分钟实践:新增priority枚举,只让high工单走人工复核,写一个断言验证未知优先级会被拒绝。

你的工单系统里,哪一个字段绝不能只相信模型输出?

关注「蜗牛聊AI」,一起看懂技术变化背后的真正机会。


本文首发于 java4u.cn,转载请注明出处。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 10:12:12

声发射信号离散程度分析:用MATLAB滑窗计算变异系数CV的工程实践

手里有一批声发射检测数据&#xff0c;需要快速评估材料在不同加载阶段信号的离散程度&#xff0c;我第一个想到的就是算变异系数CV值。声发射&#xff08;Acoustic Emission&#xff0c;AE&#xff09;信号的振铃计数、幅值、能量这些参数&#xff0c;单看均值只能反映“平均水…

作者头像 李华
网站建设 2026/10/17 4:18:47

BrewUI 装不上?先别重装系统,90% 的报错都藏在这 5 个地方

BrewUI 装不上&#xff1f;先别重装系统&#xff0c;90% 的报错都藏在这 5 个地方 【免费下载链接】BrewUI &#x1f4fa; Homebrews official macOS GUI 项目地址: https://gitcode.com/GitHub_Trending/br/BrewUI BrewUI 是 Homebrew 官方的 macOS 原生图形界面&#…

作者头像 李华
网站建设 2026/10/16 15:41:31

Kubernetes内存驱逐工具:智能检测与Pod驱逐实战

1. 项目缘起&#xff1a;为什么需要一套内存驱逐工具干过K8s生产运维的兄弟应该都有这种经历&#xff1a;半夜被告警电话叫醒&#xff0c;打开监控一看&#xff0c;某个节点Memory Pressure持续亮红&#xff0c;Pod各种EvictionFailed、OOMKilled&#xff0c;业务方在群里疯狂刷…

作者头像 李华
网站建设 2026/10/16 6:08:10

编译原理NFA转DFA实现:Python子集构造法详解与避坑指南

简介&#xff1a;这份资源面向学习编译原理、需要动手实践词法分析环节的高校学生与自学者&#xff0c;聚焦非确定有限自动机&#xff08;NFA&#xff09;到确定有限自动机&#xff08;DFA&#xff09;的转换这一编译器设计关键步骤。压缩包共3个文件&#xff0c;以py脚本、txt…

作者头像 李华
网站建设 2026/10/16 7:41:44

SpringBoot小区健身房管理系统毕设:源码、论文与部署全解析

每年这个时候&#xff0c;后台咨询里最多的就是“SpringBoot毕设怎么做”。尤其是那种“功能不能太简单、页面上要拿得出手、最好能把论文一起带出来”的需求&#xff0c;几乎都指向同一条路线。今天我想认真聊一聊“基于SpringBoot的小区健身房管理系统”这个项目&#xff0c;…

作者头像 李华
网站建设 2026/10/16 5:33:20

Kettle(PDI)安装与启动实战:从下载到跑通第一个转换

简介&#xff1a;Kettle&#xff08;Pentaho Data Integration&#xff0c;简称 PDI&#xff09;是一款开源 ETL 工具&#xff0c;面向需要进行数据抽取、转换与加载的开发者&#xff0c;重点解决该工具在 Windows、Linux、macOS 等平台下的获取、安装与基础配置难题。资料以单…

作者头像 李华