1. 为什么我们需要结构化输出?
在开发基于大语言模型(LLM)的应用时,我们经常遇到一个痛点:模型返回的内容格式不可控。想象一下,你让模型生成一份报告,期望得到包含"报告名称"、"报告ID"和"生成时间"三个字段的JSON数据,但实际返回的可能是:
- 纯文本描述:"这是一份关于...的报告,编号是123,生成于2024年..."
- 不完整的JSON:缺少必填字段
- 格式错误的JSON:键名拼写错误,值类型不对
这种情况在需要将LLM输出集成到自动化流程时尤为致命。我曾经在一个数据ETL项目中,因为模型偶尔返回非标准JSON,导致整个流水线崩溃,不得不加入大量异常处理代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 结构化输出的核心方案
目前最成熟的解决方案是结合Pydantic使用结构化输出功能。Pydantic是一个Python数据验证库,通过类型注解来定义数据模型。主流LLM服务商和框架都已原生支持Pydantic模型作为输出格式。
2.1 基础实现方案
让我们先看一个完整的OpenAI API示例:
python复制from openai import OpenAI
from pydantic import BaseModel, ValidationError
from datetime import datetime
class Report(BaseModel):
"""定义报告数据结构"""
title: str
report_id: int
generated_at: datetime
summary: str
is_confidential: bool = False # 默认值
client = OpenAI(api_key="your-api-key")
try:
response = client.chat.completions.parse(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一个专业的数据分析助手"},
{"role": "user", "content": "生成一份关于2024年Q2销售数据的报告"}
