如何在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
相关产品推荐
相关产品推荐

