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

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

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

flowchart LR I[用户文本] --> M[模型按 JSON Schema 提取] M --> J[JSON 对象] J --> V[本地字段/金额校验] V -->|通过| Q[进入人工队列] V -->|拒绝| E[记录原因并回问]

环境准备

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

python 复制代码
import json, os
from decimal import Decimal

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"]}

def call_model(text: str) -> dict:
    # 真实接入:确认 os.getenv("OPENAI_API_KEY") 非空,
    # 使用客户端 timeout=20,并传 text.format={type: "json_schema", ...}。
    if not os.getenv("OPENAI_API_KEY"):
        return {"category": "refund", "amount": "128.50", "summary": text}
    raise RuntimeError("示例未在本次任务中实际调用线上 API")

def validate(ticket: dict) -> tuple[bool, str]:
    if not isinstance(ticket.get("summary"), str) or not ticket["summary"].strip():
        return False, "缺少摘要"
    if ticket.get("category") not in ALLOWED:
        return False, "未知分类"
    if ticket.get("category") == "refund":
        try:
            amount = Decimal(ticket.get("amount", "-1"))
        except Exception:
            return False, "金额不是十进制数"
        if not (Decimal("0") < amount <= MAX_REFUND):
            return False, "金额超出自动队列范围"
    return True, "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,转载请注明出处。

相关推荐
十铭忘3 分钟前
Orin新系统常用软件安装教程
人工智能
云和恩墨17 分钟前
Mopheus Runtime深度剖析:如何将Provider CLI变成企业级智能体运行时
人工智能
X54先生(人文科技)18 分钟前
百度智能对 X54 先生学科底色评估
人工智能·深度学习·百度·架构
LaughingZhu20 分钟前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
西瓜拿铁好喝26 分钟前
AI 办公和 RPA 不是一回事:自动化与智能化的分工
人工智能·自动化·rpa
Margrop26 分钟前
下载错一个包,服务器直接崩了?别再让 x64 与 ARM64 搞崩你的环境!小学生都能懂的 CPU 架构大比方与跨三大系统(Linux/macOS/Win)一键秒级识别指南(附全自动检测脚本与避坑秘籍)
人工智能
_冷眸_27 分钟前
Python 调用大模型 API:最小请求、Base URL 和 401/404 排查
开发语言·人工智能·python
Raas10029 分钟前
AI网关怎么部署?MAI Gateway部署实操教程
人工智能·开源·gateway·mai gateway·企业级ai产品
alonglong34 分钟前
本地把 Chrome 会话复用跑通:cookie 解密 + Playwright 注入的工程实录
人工智能
摩羯123035 分钟前
AI署名论文场景下,引用存在性校验如何支撑学术科研诚信
人工智能·aigc