第06章:结构化输出(Structured Output)

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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容