
大模型技术发展到 2026 年,单纯的“聊天”能力已经严重溢出,开发者的核心痛点转移到了“如何让 AI 稳定地对接后端业务系统”。
大模型返回的文本,如果是感性的段落,后端代码是无法直接读取的。我们需要 100% 格式准确的 JSON,以便程序能直接解析并写入数据库。
以往,为了防止模型在 JSON 里多加一个逗号、漏掉一个闭合括号,或者把数字写成字符串,我们只能在提示词里拼命打补丁。
“必须返回 JSON!”、“绝对不要带 Markdown 格式!”这类提示词不仅占用大量 Token,而且遇到高并发、长文本或边缘输入时,格式崩溃的概率依然很高。后端解析一旦报错,整个业务流就会直接挂掉。
Gemini 3.5 引入的原生结构化输出,其底层技术是约束性解码(Constrained Decoding)。
简单来说,它不是在模型生成完文本后去做后处理,而是在模型生成每一个 Token(字符片段)的瞬间,API 引擎根据你传入的 JSON Schema 规则,动态调整下一个 Token 的概率分布。
任何不符合 JSON 语法和 Schema 要求的 Token 都会被概率归零,直接在生成阶段被过滤掉。这从物理底层保证了输出格式的 100% 正确。
为了测试 Gemini 3.5 在实际复杂业务场景下的表现,我设计了一个典型的“智能工单分类与情感分析”场景。
输入文本(口语化、逻辑略显混乱):
“系统故障报告:用户反馈,昨天下午三点左右,他在使用我们的 SaaS 平台时,尝试支付一笔 299 元的年费账单,订单号我记得是 TX20260504_99 吧。点击提交后系统卡死,钱扣了但账户没升级。他现在情绪非常激动,要求今天必须处理完毕并退款,不然就去投诉。”
我们期望大模型把这段话转化为标准的 JSON 工单。我们在 API 中定义的 JSON Schema 如下:
json
{ "type": "object", "properties": { "order_id": {"type": "string"}, "refund_amount": {"type": "number"}, "issue_severity": {"type": "string", "enum": ["low", "medium", "high"]}, "is_refund_requested": {"type": "boolean"}, "user_emotion": {"type": "string"} }, "required": ["order_id", "refund_amount", "issue_severity", "is_refund_requested"]}在连续调用 100 次的压力测试中,Gemini 3.5 展现出了极高的工程可用性,但也暴露出了一些不容忽视的“坑”。
测试期间,返回的数据完美符合 JSON 规范。最关键的是,API 返回的是纯净的 JSON 字符串,不再带有 ```json 等 Markdown 渲染标记,后端用 json.loads() 一次通过,没有出现任何解析异常。
对于复杂语义的判定,模型表现亮眼。比如,“要求今天必须处理并退款”被准确识别,is_refund_requested 被输出为布尔值 true(注意,不是带双引号的 "true" 字符串)。枚举字段 issue_severity 也稳稳落在了 high 的区间内。
这是本次测试发现的最大工程陷阱:强约束无法阻挡数据缺失带来的逻辑幻觉。
当我们在测试中,故意把输入文本里的订单号(TX20260504_99)抹去,而 Schema 中 order_id 依然是 required(必填)时,Gemini 3.5 为了满足“必填”的硬性条件,会强行把退款金额 299 或者日期 20260504 填入 order_id 字段中。
这表明,约束解码只能管住“皮囊”(格式),管不住“灵魂”(逻辑)。
放眼 2026 年的主流模型生态,Gemini 3.5 与行业标杆 GPT-4o 在结构化输出上各有胜负:
oneOf 语法)时,GPT-4o 依然表现得更为细腻和稳定。而 Gemini 3.5 在极深嵌套下,偶发性地会出现个别非必填属性漏掉的情况。因此,针对 Gemini 3.5 的 Schema 设计,建议尽量保持扁平化。要在生产环境中规避上述问题,建议开发者在工程实现上采用“API层约束 + 后端运行时校验”的双重保险机制。
不要盲目把所有字段都设为 required。如果不确定输入文本中是否一定包含某项信息,可以将其设为可选,或者使用 Pydantic 做二次数据校验:
python
from pydantic import BaseModel, Field, ValidationErrorfrom typing import Optional
class TicketDetail(BaseModel): order_id: Optional[str] = None # 允许为空,避免模型被迫胡编 refund_amount: float = Field(..., ge=0) issue_severity: str is_refund_requested: bool
# 接收模型返回数据后,进行安全解析try: ticket = TicketDetail.model_validate_json(api_response_text)except ValidationError as e: # 捕获逻辑幻觉或异常,进行降级处理 print(f"数据校验失败: {e}")2026 年大模型的工程化落地,拼的就是“确定性”。
Gemini 3.5 在结构化输出方面的表现,已经证明了它具备支撑核心业务系统调用的能力。开发者只需在 Schema 设计上避开“过度嵌套”和“盲目设必填”的坑,就能极大地解放后端解析代码。
大家在业务落地中,还遇到过哪些好玩的“大模型反向驯服”案例?欢迎在评论区一起讨论交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。