1、结构化输出概述
1.1 什么是结构化输出
LangChain的结构化输出(Structured Output) 指的是:
要求模型最终返回一个符合预定义结构的数据对象,例如固定字段的JSON、Pydantic 模型、 TypedDict,而不再是无格式的自然语言文本。
它的核心目标是把“ 自然语言回答 ”变成“ 程序可以稳定消费的数据 ”。
例如,不是让模型输出: 盗梦空间在2010年上映,导演是克里斯托弗·诺兰,评分9.3。
而是让它输出成类似这样的结构:
{
"title": "盗梦空间",
"year": 2010,
"director": "克里斯托弗·诺兰",
"rating": 9.3
}
- 这样做的价值主要有三点:
- 更容易被代码处理:下游系统可以直接读字段,而不是再从自然语言里做解析。
- 结果更稳定:减少“模型说法变了但意思差不多”导致的解析失败。
- 更适合工程化:适用于表单抽取、分类、路由、调用工具参数生成、工作流状态传递等场景。
1.2 传统方式 vs 结构化输出
1、传统的几种方式(繁琐、不推荐)
# 1. 提示词要求JSON
prompt = "以JSON格式返回:{name, age, occupation}"
response = model.invoke(prompt)
# 2. 手动解析
import json
data = json.loads(response.content)
# 3. 手动验证类型
if not isinstance(data['age'], int):
raise ValueError("age must be int")
# 4. 手动创建对象
person = Person(**data)
2、结构化输出(简洁)
# 一步到位
structured_llm = model.with_structured_output(Person)
person = structured_llm.invoke("张三是一名 30 岁的软件工程师")
# ✅ 自动解析、验证、创建对象
为什么第2种结构化输出机制这么受欢迎?
在没有 Pydantic 等结构化方案之前,开发者需要写大量的 Prompt 苦口婆心地求大模型“请返回 JSON,
不要带任何解释”,然后自己写繁琐的 json.loads() 和 try…except 。
而有了 Pydantic 等结构化方案结合 .with_structured_output() 之后:
- Prompt 变干净了: 字段的 description 直接充当了 Prompt 的一部分。
- 类型安全: 编辑器能自动补全,代码运行前就能做类型检查。
- 极其稳定: 依托大模型厂商底层的 JSON 模式,输出错误率降到了极低。
1.3 结构化输出模式
目前LangChain 1.x 支持多种Schema与结构化输出方式:
- Pydantic(字段校验、描述、嵌套结构,功能最丰富)
- TypedDict(轻量类型约束)
- JSON Schema(与前后端/跨语言接口最通用)
- dataclass
模型对象可以调用with_structured_output() 绑定输出模式(schema)。
只有Pydantic 返回的是Schema类实例,其余三种方式返回的都是字典;也只有Pydantic 在类型不匹配时会抛出异常。
问题:现在所有模型都支持“本章要讲解的结构化输出方式”吗?
大部分现代模型支持(通过函数调用):
- ✅ OpenAI (gpt-4, gpt-3.5-turbo)
- ✅ Anthropic (claude-3)
- ✅ Groq (llama-3)
- ❌ 某些旧模型不支持
如果不支持,LangChain 会回退到提示词 + JSON 解析。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















请登录后查看评论内容