1. 为什么需要控制LLM的输出数据类型
在大语言模型(LLM)的实际工程应用中,我们经常遇到这样的困境:虽然模型能生成流畅的文本,但当我们需要将输出结果集成到程序中进行后续处理时,却面临着数据格式混乱的问题。比如开发一个天气查询机器人时,LLM可能返回"今天气温25度"这样的自然语言,而程序需要的是{"temperature":25}这样的结构化数据。
这个需求在以下场景尤为突出:
- 构建自动化工作流时,下游系统需要确定性的输入格式
- 开发API接口时,需要严格定义返回值的schema
- 数据ETL过程中,要求字段类型必须一致
- 与类型严格的编程语言(如Java)交互时
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流结构化输出方案对比
2.1 JSON模式直接指定
最简单的方式是在prompt中直接要求JSON格式输出:
python复制prompt = """请以JSON格式返回结果,包含以下字段:
- name (字符串类型)
- age (整数类型)
- height (浮点数类型)"""
优点:实现简单,无需额外依赖
缺点:无法保证类型严格一致,可能返回"age":"25"这样的字符串
2.2 Pydantic模型验证
更可靠的方式是结合Pydantic:
python复制from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
height: float
# 在prompt中说明需要符合Person模型
prompt = f"""你的输出必须能通过以下模型验证:
{Person.schema_json()}"""
实测效果:
- 类型错误时LLM会主动重试
- 配合retry机制可达95%+的格式正确率
- 支持嵌套复杂类型
2.3 函数调用方式
OpenAI等平台提供的function calling本质也是结构化输出:
json复制{
"name": "get_weather",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"},
