You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gemini/Vertex结构化输出中确保默认值生效?

解决Gemini/Vertex API返回JSON时自动填充Pydantic默认值的可靠方案

方法1:用Pydantic的model_validate兜底补全默认值

这是最可靠的方案,完全不依赖大模型输出质量,默认值由Pydantic直接处理,避免幻觉且维护成本低。

  • 核心逻辑:不管API返回的JSON是否包含带默认值的字段,直接用定义好的Pydantic模型验证并实例化,框架会自动填充所有未提供的默认值。
  • 示例代码:
from pydantic import BaseModel
import google.genai as genai

# 定义带默认值的Pydantic模型
class MyModel(BaseModel):
    name: str  # 必填字段
    max_value: int  # 必填字段
    flag: bool = False
    op: str = "all"
    min_value: int = 42

# 调用Gemini API获取原始JSON结果(仅包含必填字段)
response = genai.generate_content(
    model="gemini-1.5-pro",
    contents="返回符合MyModel结构的JSON,仅填写name和max_value",
    generation_config={"response_mime_type": "application/json"}
)
raw_json = response.text

# 用Pydantic验证并自动补全默认值
validated_model = MyModel.model_validate_json(raw_json)
# 输出包含所有字段的JSON
print(validated_model.model_dump_json(indent=2))
  • 优势:无需修改提示词或Schema,模型字段更新时仅需修改Pydantic定义,彻底杜绝幻觉问题。

方法2:自定义带默认值的JSON Schema传给API

通过手动修改Pydantic生成的Schema,将默认值嵌入其中,引导大模型返回完整字段,再配合Pydantic验证兜底。

  • 核心逻辑:重写Schema生成逻辑,把Pydantic字段的默认值添加到JSON Schema的default属性中,让大模型生成时参考这些默认值。
  • 示例代码:
from pydantic import BaseModel
import google.genai as genai
from google.genai.types import GenerationConfig

class MyModel(BaseModel):
    name: str
    max_value: int
    flag: bool = False
    op: str = "all"
    min_value: int = 42

# 生成包含默认值的自定义JSON Schema
def get_schema_with_defaults(model: BaseModel):
    schema = model.model_json_schema()
    for field_name, field in model.model_fields.items():
        if field.default is not None and field_name in schema["properties"]:
            schema["properties"][field_name]["default"] = field.default
    return schema

custom_schema = get_schema_with_defaults(MyModel)

# 调用API时传入自定义Schema
response = genai.generate_content(
    model="gemini-1.5-pro",
    contents="返回符合指定Schema的JSON数据",
    generation_config=GenerationConfig(
        response_mime_type="application/json",
        response_schema=custom_schema
    )
)
# 再用Pydantic验证确保默认值完整
validated_model = MyModel.model_validate_json(response.text)
print(validated_model.model_dump_json(indent=2))
  • 优势:引导大模型返回更完整的结构,减少后续补全压力,同时保留Pydantic的兜底能力。

方法3:Vertex API启用严格结构化输出模式(仅限Vertex)

如果使用Vertex AI,可以开启STRICT模式强制模型遵循Schema结构,结合带默认值的Schema,进一步降低字段缺失概率。

  • 核心逻辑:通过structured_output_config启用严格模式,要求模型必须返回Schema中定义的所有字段,配合Schema中的默认值定义,让模型直接生成完整结果。
  • 示例代码:
from vertexai.generative_models import GenerativeModel, GenerationConfig
from pydantic import BaseModel

class MyModel(BaseModel):
    name: str
    max_value: int
    flag: bool = False
    op: str = "all"
    min_value: int = 42

model = GenerativeModel("gemini-1.5-pro-001")
# 生成带默认值的Schema
schema = MyModel.model_json_schema()
for field in MyModel.model_fields.values():
    if field.default is not None:
        schema["properties"][field.name]["default"] = field.default

# 调用Vertex API并启用严格结构化输出
response = model.generate_content(
    "返回符合Schema的JSON数据",
    generation_config=GenerationConfig(
        response_mime_type="application/json",
        response_schema=schema,
        structured_output_config={"mode": "STRICT"}
    )
)
# 最后用Pydantic验证兜底
validated_model = MyModel.model_validate_json(response.text)
print(validated_model.model_dump_json(indent=2))
  • 优势:利用Vertex的结构化输出强制能力,让模型更严格遵循Schema,减少字段遗漏,配合Pydantic实现双重保障。

内容的提问来源于stack exchange,提问作者solisoares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:43:12