用Gemini Structured Outputs實現(xiàn)工單路由門禁)
客服工單最怕的不是模型“答錯一句話”而是它給出一段看起來合理的說明程序卻從中猜錯優(yōu)先級。通俗做法是要求模型只交 JSONJavaScript Object Notation輕量數(shù)據(jù)格式再讓代碼驗證它。Gemini API 的 Structured Outputs 能按 JSON Schema 生成結(jié)果本篇用 Python 把退款、賬號和普通咨詢分流并在模型輸出越界時拒絕自動流轉(zhuǎn)。你會得到一條能復(fù)制、能超時、能降級的最小鏈路。為什么不直接解析一段自然語言結(jié)構(gòu)化輸出的作用是規(guī)定“輸出長什么樣”不是保證事實正確。Schema 讓字段和枚舉更穩(wěn)定業(yè)務(wù)規(guī)則仍要由服務(wù)端負(fù)責(zé)。本文把priority限在 low、normal、high把queue限在三個隊列。模型若返回未知值程序轉(zhuǎn)到人工隊列。當(dāng)前官方文檔把它用于抽取、分類和 Agent 工作流并通過response_format的application/json與 schema 配置。通過失敗/超時工單文本Gemini JSON Schema解析JSON枚舉與業(yè)務(wù)規(guī)則進(jìn)入對應(yīng)隊列人工復(fù)核隊列環(huán)境準(zhǔn)備使用 Python 3.10。安裝依賴python -m pip install google-genai。把密鑰放入環(huán)境變量export GEMINI_API_KEY你的密鑰。模型名示例為文檔中的gemini-3.8-flash你的賬號可用模型與配額仍需在控制臺確認(rèn)。保存為ticket_router.py運行python ticket_router.py。示例未在本次任務(wù)中實際調(diào)用線上 API本地僅完成語法檢查目標(biāo)環(huán)境安裝依賴后應(yīng)再作一次無敏感數(shù)據(jù)的聯(lián)調(diào)。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:未知優(yōu)先級}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調(diào)用失敗:{type(exc).__name__}}if__name____main__:print(classify(訂單重復(fù)扣款請盡快退款))assertsafe_route({queue:refund,priority:high,reason:重復(fù)扣款})[queue]refund代碼分兩層SCHEMA提前縮小模型輸出空間safe_route再做獨立驗證不能因為 API 承諾 JSON 就省略它。timeout20是為了不讓一個慢請求占住 Web 工作線程生產(chǎn)環(huán)境還應(yīng)設(shè)置 HTTP 客戶端級超時、重試次數(shù)和熔斷。genai.Client()從環(huán)境讀取密鑰不要把密鑰寫進(jìn)倉庫。預(yù)期輸出有密鑰且調(diào)用成功時類似{queue: refund, priority: high, reason: ...}沒配密鑰則是人工復(fù)核。最常見的坑有一Schema 只約束格式不會自動核驗訂單真?zhèn)味杜e改了卻沒同步服務(wù)端白名單三超時后盲目重試造成同一工單被重復(fù)創(chuàng)建四把模型理由直接展示給用戶而泄露內(nèi)部規(guī)則。適合把“先分給誰處理”自動化不適合直接批準(zhǔn)退款或關(guān)閉投訴。工程化時把原始文本、模型版本、schema 版本、路由結(jié)果和人工改判一起記錄每周抽樣計算錯分率。5分鐘實踐新增security隊列并寫一個斷言確保模型返回delete_database時永遠(yuǎn)進(jìn)入human_review。你的工單里哪一個字段一旦分類錯就不該自動流轉(zhuǎn)關(guān)注「蝸牛聊AI」一起看懂技術(shù)變化背后的真正機(jī)會。本文首發(fā)于 java4u.cn轉(zhuǎn)載請注明出處。