ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python调用Gemini Structured Outputs实现工单路由门禁

Python调用Gemini Structured Outputs实现工单路由门禁 客服工单最怕的不是模型“答错一句话”而是它给出一段看起来合理的说明程序却从中猜错优先级。通俗做法是要求模型只交 JSONJavaScript Object Notation轻量数据格式再让代码验证它。Gemini API 的 Structured Outputs 能按 JSON Schema 生成结果本篇用 Python 把退款、账号和普通咨询分流并在模型输出越界时拒绝自动流转。你会得到一条能复制、能超时、能降级的最小链路。为什么不直接解析一段自然语言结构化输出的作用是规定“输出长什么样”不是保证事实正确。Schema 让字段和枚举更稳定业务规则仍要由服务端负责。本文把priority限在 low、normal、high把queue限在三个队列。模型若返回未知值程序转到人工队列。当前官方文档把它用于抽取、分类和 Agent 工作流并通过response_format的application/json与 schema 配置。通过失败/超时工单文本Gemini JSON Schema解析JSON枚举与业务规则进入对应队列人工复核队列环境准备使用 Python 3.10。安装依赖python -m pip install google-genai。把密钥放入环境变量export GEMINI_API_KEY你的密钥。模型名示例为文档中的gemini-3.8-flash你的账号可用模型与配额仍需在控制台确认。保存为ticket_router.py运行python ticket_router.py。示例未在本次任务中实际调用线上 API本地仅完成语法检查目标环境安装依赖后应再作一次无敏感数据的联调。importjsonimportosfromgoogleimportgenai ALLOWED_QUEUES{refund,account,general}ALLOWED_PRIORITY{low,normal,high}SCHEMA{type:object,properties:{queue:{type:string,enum:sorted(ALLOWED_QUEUES)},priority:{type:string,enum:sorted(ALLOWED_PRIORITY)},reason:{type:string}},required:[queue,priority,reason]}defsafe_route(raw:str)-dict:try:datajson.loads(raw)exceptjson.JSONDecodeError:return{queue:human_review,reason:JSON无法解析}ifdata.get(queue)notinALLOWED_QUEUES:return{queue:human_review,reason:未知队列}ifdata.get(priority)notinALLOWED_PRIORITY:return{queue:human_review,reason:未知优先级}returndatadefclassify(ticket:str)-dict:ifnotos.getenv(GEMINI_API_KEY):return{queue:human_review,reason:缺少GEMINI_API_KEY}clientgenai.Client()try:resultclient.interactions.create(modelgemini-3.8-flash,inputticket,response_format{type:text,mime_type:application/json,schema:SCHEMA},timeout20)returnsafe_route(result.output_text)exceptExceptionasexc:return{queue:human_review,reason:f调用失败:{type(exc).__name__}}if__name____main__:print(classify(订单重复扣款请尽快退款))assertsafe_route({queue:refund,priority:high,reason:重复扣款})[queue]refund代码分两层SCHEMA提前缩小模型输出空间safe_route再做独立验证不能因为 API 承诺 JSON 就省略它。timeout20是为了不让一个慢请求占住 Web 工作线程生产环境还应设置 HTTP 客户端级超时、重试次数和熔断。genai.Client()从环境读取密钥不要把密钥写进仓库。预期输出有密钥且调用成功时类似{queue: refund, priority: high, reason: ...}没配密钥则是人工复核。最常见的坑有一Schema 只约束格式不会自动核验订单真伪二枚举改了却没同步服务端白名单三超时后盲目重试造成同一工单被重复创建四把模型理由直接展示给用户而泄露内部规则。适合把“先分给谁处理”自动化不适合直接批准退款或关闭投诉。工程化时把原始文本、模型版本、schema 版本、路由结果和人工改判一起记录每周抽样计算错分率。5分钟实践新增security队列并写一个断言确保模型返回delete_database时永远进入human_review。你的工单里哪一个字段一旦分类错就不该自动流转关注「蜗牛聊AI」一起看懂技术变化背后的真正机会。本文首发于 java4u.cn转载请注明出处。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进