关于GPT API与Pydantic模型的技术问询及发票表格优化
问题解答
1. OpenAI API调用方式与response_format机制
调用方式正确性
代码存在一处语法错误:class quantity_code: str = Field(...)这行写法无效,应将quantity_code字段归入TableRow类中,修正后的代码如下:
class TableRow(BaseModel): net_amount: float = Field(..., description="The amount before taxes of the line item") gross_amount: float = Field(..., description="The amount after taxes of the line item") quantity: int = Field(..., description="The quantity of the line item bought") quantity_code: str = Field(..., description="The code associated with the line item")
排除上述语法错误后,使用llm_client.beta.chat.completions.parse()并传入Pydantic模型作为response_format的调用方式是正确的,这是OpenAI官方支持的结构化输出方案,仅适用于gpt-4o及以上支持结构化输出的模型。
response_format的处理逻辑
OpenAI不会将Pydantic BaseModel直接注入提示词,而是会自动将模型结构转换为对应的JSON Schema,后台基于该Schema约束模型输出,确保返回内容严格匹配指定结构,无需开发者手动在提示词中描述结构规则。
2. 提升GPT处理发票表格数据性能的方法
- 优化图像输入质量
- 上传高分辨率、清晰对焦的发票图像,避免模糊、倾斜;扫描件需去除阴影、噪点等干扰元素。
- 裁剪发票的表格区域,仅保留有效内容,减少模型处理的冗余信息。
- 精准设计提示词
- 明确提取规则,例如“忽略合计行”“空字段返回null”“严格按指定字段输出,不得添加额外内容”。
- 补充发票背景信息,比如“这是餐饮行业增值税普通发票,表格每行对应一个消费条目”。
- 强化结构化约束
- 细化Pydantic模型的字段描述,消除歧义,例如将
quantity的描述明确为“购买商品的实际数量”。 - 为数值型字段添加校验规则,比如
net_amount: float = Field(..., gt=0, description="税前金额,必须大于0"),确保输出符合业务逻辑。
- 细化Pydantic模型的字段描述,消除歧义,例如将
- 合理选择模型与参数
- 优先选用gpt-4o或gpt-4o-mini,二者在多模态表格提取场景下的性能显著优于旧模型;对成本敏感时可选择gpt-4o-mini。
- 将
temperature参数设置为0.1-0.2,在保证输出稳定性的同时,适配少量格式特殊的发票。
- 优化处理流程
- 批量发票采用异步处理方式,避免同步调用的超时问题。
- 对提取失败或不符合结构的结果设置重试逻辑,重试时补充更明确的提示词引导模型输出。
内容的提问来源于stack exchange,提问作者mndl
相关产品推荐
相关产品推荐

