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

发布时间:2026/10/11 0:02:13

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转载请注明出处。
延伸阅读

更多相关文章

2026/10/10 23:57:12

YOLOv5 OBB旋转框训练实战:从水平框到带角度检测的完整指南

简介:本资源为YOLOv5 OBB旋转框训练DEMO,面向具备一定深度学习基础、希望掌握倾斜目标检测的开发者与算法学习者,解决常规轴对齐边界框难以精确表示树木、车辆等有角度物体的问题。压缩包共583个文件,约445.58MB,涵盖7…

2026/10/10 23:57:12

玉米数据集1960张VOC+YOLO:从标注转换到YOLOv8训练与避坑指南

简介:这份资源是面向计算机视觉初学者与农业图像分析研究者的玉米目标检测数据集,采用Pascal VOC与YOLO双格式标注,可直接用于模型训练、验证与算法对比实验。压缩包共2000个文件,包含1960张jpg图片及一一对应的1960个xml标注文件…

2026/10/11 1:27:28

面向对象程序设计-第一阶段补充-师生友谊

作者 GONG单位 哈尔滨华德学院以下程序分别定义了学生类和教师类,学生有N个课程成绩,可以打印成绩单,任课教师负责为学生填报相应课程的成绩。类的声明已经给出,请按各类成员函数的功能说明完成相应的完整定义。并满足主函数的测试…

2026/10/11 1:27:28

环形补给站算法:从前缀和到单调栈的线性优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 1:27:28

AI翻译神器高效助力多语言沟通 精准便捷满足各类翻译需求

构建一个高质量的国外参考文献库,听起来很宏大,但其实就是把“找、管、用”这三件事做对。整个过程最关键的一步,是选对一个能陪你走完全程的“智能伙伴”。我强烈推荐 切问学术,它能让这件事从杂乱无序变得井井有条。 第一步&am…

2026/10/11 1:27:28

AI导论教案:从感知机到LLM的可验证教学实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 1:27:28

链表找环:Floyd 判圈算法(LeetCode 141 142 )

在链表相关的算法题中,「判断链表是否有环」以及「寻找入环点」是两道极其经典的题目。它们不仅考察了对指针的操作,更蕴含了一个巧妙的数学原理——Floyd 判圈算法(龟兔赛跑算法)。 一、 LeetCode 141:判断链表中是否…

2026/10/11 1:22:28

智能工厂建设方案全解析:从架构到落地避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 0:02:13

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

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

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

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑