1. 引言

在现代 AI 应用开发中,大语言模型 (LLM) 的输出往往需要以结构化格式返回,例如 JSON 对象或特定数据模型,以便下游程序轻松解析和处理。这不仅提高了系统的可靠性和效率,还便于集成数据库、API 或其他自动化流程。LangChain v1.0 作为一款强大的开源框架,提供了一系列内置工具和方法来实现 LLM 的结构化输出,帮助开发者从模型的自由文本响应中提取可预测、可验证的数据。

本文将深入介绍 LangChain v1.0 的结构化输出功能,包括核心机制、Schema 定义、实现方法、输出解析器、错误处理以及实际应用案例。目标读者为 Python 开发者,通过代码示例和最佳实践,帮助你快速上手并应用于实际项目中。

2. 结构化输出的核心机制

LangChain v1.0 的结构化输出主要依赖两种策略:ProviderStrategy 和 ToolStrategy。这些策略确保模型输出符合预定义的格式,同时兼容不同 LLM 提供商。

  • ProviderStrategy:这是最可靠的策略,利用模型原生支持的结构化输出功能(如 OpenAI、Grok 或 Gemini 的内置 JSON 模式)。它直接强制模型生成符合 Schema 的响应,避免了额外的解析步骤。优点是高效且严格验证,但仅限于支持该功能的模型。
  • ToolStrategy:当模型不支持原生结构化输出时,使用工具调用(Tool Calling)机制来模拟。该策略兼容几乎所有现代 LLM(如支持工具调用的 GPT 系列)。它通过定义一个虚拟工具来引导模型输出结构化数据,灵活性更高,但可能需要额外配置以处理错误。

LangChain 提供了 with_structured_output() 方法(或等效的 response_format 参数)作为入口点。它会自动选择最佳策略:如果模型支持 ProviderStrategy,则优先使用;否则回落到 ToolStrategy。你可以通过显式指定策略来覆盖默认行为。

例如,在创建代理时,可以这样配置:

from langchain.agents import create_agentfrom langchain.agents.structured_output import ProviderStrategy, ToolStrategy# 使用 ProviderStrategy(如果模型支持)agent = create_agent(model="gpt-4o", response_format=ProviderStrategy(MySchema))# 或者使用 ToolStrategyagent = create_agent(model="gpt-3.5-turbo", response_format=ToolStrategy(MySchema))

这两种策略的兼容性取决于模型:ProviderStrategy 适用于 OpenAI、Grok 等;ToolStrategy 适用于任何支持工具调用的模型。选择时需考虑模型的可靠性和应用场景。

3. 定义输出 Schema

Schema 是结构化输出的基础,它定义了输出的数据结构、类型和约束。LangChain 支持多种 Schema 类型,确保灵活性。

  • Pydantic BaseModel:最推荐的类型,使用 Pydantic 库定义模型。每个字段可指定类型、描述和验证规则(如最小/最大值)。
  • Dataclass:Python 内置的 dataclass,支持类型注解,适合简单结构。
  • TypedDict:类型化的字典,适用于动态或简单键值对。
  • JSON Schema:纯字典形式,描述 JSON 结构,兼容非 Python 环境。

在定义时,使用 Field 添加描述(description),这有助于模型理解字段含义。还支持 Union 类型,让模型选择合适的 Schema。

示例:使用 Pydantic 定义一个联系人信息 Schema。

from pydantic import BaseModel, Fieldclass ContactInfo(BaseModel):    name: str = Field(description="联系人的姓名")    email: str = Field(description="联系人的电子邮件地址")    phone: str = Field(description="联系人的电话号码", pattern=r"^\(\d{3}\) \d{3}-\d{4}$")  # 添加正则验证

这种定义确保输出严格符合规则,如果违反(如 phone 格式错误),LangChain 会自动处理。

4. 实现结构化输出

实现结构化输出通常涉及模型集成和链式调用。核心步骤:

  1. 定义 Schema。
  2. 创建代理或链,使用 .with_structured_output()(或 response_format)指定 Schema 和策略。
  3. 调用代理,获取结构化响应。

简单示例:提取联系人信息。

from langchain.agents import create_agentfrom pydantic import BaseModel, Fieldclass ContactInfo(BaseModel):    name: str = Field(description="The name of the person")    email: str = Field(description="The email address of the person")    phone: str = Field(description="The phone number of the person")agent = create_agent(model="gpt-4o", response_format=ContactInfo)  # 自动选择策略result = agent.invoke({    "messages": [{"role": "user", "content": "Extract from: Alice Smith, alice@example.com, (123) 456-7890"}]})print(result["structured_response"])# 输出: ContactInfo(name='Alice Smith', email='alice@example.com', phone='(123) 456-7890')

高级示例:结合代理处理产品评论分析。

from typing import Literalfrom langchain.agents import create_agentfrom langchain.agents.structured_output import ToolStrategyclass ProductReview(BaseModel):    rating: int = Field(description="产品评分 (1-5)", ge=1, le=5)    sentiment: Literal["positive", "negative", "neutral"] = Field(description="评论情感")    key_points: list[str] = Field(description="关键点,每点1-3词")agent = create_agent(model="gpt-4o", response_format=ToolStrategy(ProductReview))result = agent.invoke({    "messages": [{"role": "user", "content": "Analyze: Excellent phone, 4 stars, battery lasts long but camera is average."}]})print(result["structured_response"])# 输出: ProductReview(rating=4, sentiment='positive', key_points=['battery lasts long', 'camera average'])

这些示例展示了从输入到结构化输出的完整流程。

5. 输出解析器(Output Parsers)

LangChain 提供了多种输出解析器,用于将 LLM 的原始输出转换为特定格式。它们可分类如下:

分类 常用解析器 作用
基础解析 StrOutputParser 将输出转换为纯字符串(默认)。
JSON 结构化解析 JsonOutputParser 强制解析为 JSON 对象。
PydanticOutputParser 使用 Pydantic 模型进行结构化解析和验证。
PydanticOutputFunctionsParser 用于函数调用场景的 Pydantic 解析。
列表解析 CommaSeparatedListOutputParser 将逗号分隔字符串转换为列表,如 “a,b,c” → [“a”, “b”, “c”]。
ListOutputParser 通用列表解析,支持多种分隔符。
布尔/数值解析 BooleanOutputParser 将 “yes”/“no” 转换为 True/False。
FloatOutputParser 转换为浮点数。
IntOutputParser 转换为整数。
复杂结构化 EnumOutputParser 限制输出为枚举值之一。
DataclassOutputParser 使用 dataclass 进行结构化输出。

示例:使用 JsonOutputParser 处理响应。

from langchain.output_parsers import JsonOutputParserparser = JsonOutputParser()raw_output = '{"name": "Bob", "age": 30}'  # 来自 LLMparsed = parser.parse(raw_output)print(parsed)  # 输出: {'name': 'Bob', 'age': 30}

这些解析器可与结构化输出结合使用,进一步增强灵活性。

6. 错误处理与最佳实践

LangChain v1.0 内置错误处理机制,通过 handle_errors 参数配置:

  • True(默认):捕获所有错误并自动重试,提供反馈提示。
  • 自定义字符串:使用固定重试提示。
  • 异常类型:仅针对特定异常重试。
  • Callable:自定义错误处理器。
  • False:直接抛出异常。

常见错误包括多重输出或 Schema 验证失败,LangChain 会发送错误反馈给模型进行重试。

最佳实践:

  • 优先使用 ProviderStrategy 以获得更好可靠性。
  • 为 Schema 字段添加详细描述和约束,提高模型准确性。
  • 自定义 tool_message_content 以改善用户交互(如 “数据已提取!”)。
  • 测试不同 LLM 的兼容性,避免过度复杂 Schema。
  • 使用 Union 类型处理多变场景。
  • 调试时,监控重试日志以优化提示。

7. 实际应用案例

让我们构建一个信息抽取器:从新闻文本中提取电影信息。

Schema 定义:

from pydantic import BaseModel, Fieldclass MovieInfo(BaseModel):    title: str = Field(description="电影标题")    director: str = Field(description="导演姓名")    release_year: int = Field(description="上映年份", ge=1900)    summary: str = Field(description="简短摘要,50字以内")

实现:

from langchain.agents import create_agentfrom langchain.agents.structured_output import ProviderStrategyagent = create_agent(model="gpt-4o", response_format=ProviderStrategy(MovieInfo))result = agent.invoke({    "messages": [{"role": "user", "content": "Extract from: Inception, directed by Christopher Nolan, released in 2010. A thief who steals corporate secrets through dream-sharing technology."}]})print(result["structured_response"])# 输出: MovieInfo(title='Inception', director='Christopher Nolan', release_year=2010, summary='A thief steals secrets via dream-sharing.')

这个案例展示了端到端应用,可扩展到新闻摘要或实体提取。

8. 结论

LangChain v1.0 的结构化输出功能极大简化了 LLM 与程序化处理的集成,通过 ProviderStrategy 和 ToolStrategy 等机制,确保输出可靠且易用。结合 Pydantic 等工具,开发者可以轻松构建 robust 的 AI 系统。未来,随着更多模型支持原生结构化,LangChain 将进一步演进。建议读者立即实践这些示例,并在实际项目中应用,以提升开发效率。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐