Skip to main content
:::python 结构化输出允许智能体以特定的、可预测的格式返回数据。您不再需要解析自然语言响应,而是直接获得应用程序可以直接使用的 JSON 对象、Pydantic 模型 或数据类形式的结构化数据。
本页面介绍了使用 create_agent 的智能体的结构化输出。要在模型上直接使用结构化输出(智能体外部),请参阅 模型 - 结构化输出。
LangChain 的 @[create_agent] 自动处理结构化输出。用户设置所需的结构化输出模式,当模型生成结构化数据时,它会被捕获、验证,并以 'structured_response' 键的形式返回到智能体的状态中。

响应格式

使用 response_format 控制智能体如何返回结构化数据:
  • ToolStrategy[StructuredResponseT]:使用工具调用进行结构化输出
  • ProviderStrategy[StructuredResponseT]:使用提供者原生的结构化输出
  • type[StructuredResponseT]:模式类型 - 根据模型能力自动选择最佳策略
  • None:未明确请求结构化输出
当直接提供模式类型时,LangChain 会自动选择:
  • ProviderStrategy 如果所选模型和提供者支持原生结构化输出(例如 OpenAI、Anthropic (Claude) 或 xAI (Grok))。
  • ToolStrategy 对于所有其他模型。
JSON 模式字典必须用显式策略(ProviderStrategy 或 ToolStrategy)包装。当直接传递给 response_format 时,它们不会被自动检测。
如果使用 langchain>=1.1,对原生结构化输出功能的支持会动态地从模型的 配置数据 中读取。如果数据不可用,请使用其他条件或手动指定:
如果指定了工具,模型必须支持同时使用工具和结构化输出。
结构化响应会返回到智能体最终状态的 structured_response 键中。 ::: :::js 结构化输出允许智能体以特定的、可预测的格式返回数据。您不再需要解析自然语言响应,而是直接获得类型化的结构化数据。
本页面介绍了使用 createAgent 的智能体的结构化输出。要在模型上直接使用结构化输出(智能体外部),请参阅 模型 - 结构化输出。
LangChain 的预构建 ReAct 智能体 createAgent 自动处理结构化输出。用户设置所需的结构化输出模式,当模型生成结构化数据时,它会被捕获、验证,并以 structuredResponse 键的形式返回到智能体的状态中。

响应格式

控制智能体如何返回结构化数据。您可以提供一个 Zod 模式、任何 标准模式 兼容的模式,或一个 JSON 模式对象。默认情况下,智能体会使用工具调用策略,其中输出由额外的工具调用创建。某些模型支持原生结构化输出,在这种情况下,智能体会使用该策略。 您可以通过将 ResponseFormat 包裹在 toolStrategy 或 providerStrategy 函数调用中来控制行为:
结构化响应会返回到智能体最终状态的 structuredResponse 键中。
如果使用 langchain>=1.1,对原生结构化输出功能的支持会动态地从模型的 配置数据 中读取。如果数据不可用,请使用其他条件或手动指定:
如果指定了工具,模型必须支持同时使用工具和结构化输出。
:::

提供商策略

一些模型提供商通过其 API 原生支持结构化输出(例如 OpenAI、xAI (Grok)、Gemini、Anthropic (Claude))。当可用时,这是最可靠的方法。 要使用此策略,配置一个 ProviderStrategy: :::python
The strict param requires langchain>=1.2.
required
定义结构化输出格式的模式。支持:
  • Pydantic 模型:BaseModel子类,带有字段验证。返回验证后的 Pydantic 实例。
  • 数据类:带有类型注解的 Python 数据类。返回 dict。
  • TypedDict:类型化字典类。返回 dict。
  • JSON Schema:带有 JSON schema 规范的字典。必须包含顶层 title 和 description 键。返回 dict。
可选的布尔参数,用于启用严格模式遵循。由某些提供商支持(例如,OpenAI 和 xAI)。默认为 None(禁用)。
当您将模式类型直接传递给 @[create_agent.response_format][create_agent(response_format)] 且模型支持原生结构化输出时,LangChain 会自动使用 ProviderStrategy:
::: :::js
required
定义结构化输出格式的模式。支持:
  • Zod Schema:一个 zod schema
  • 标准 Schema:实现 标准 Schema 规范的任何 schema
  • JSON Schema:一个 JSON schema 对象
当您将模式类型直接传递给 createAgent.responseFormat 且模型支持原生结构化输出时,LangChain 会自动使用 ProviderStrategy:
::: 提供商原生结构化输出提供高可靠性和严格验证,因为模型提供商强制执行模式。当可用时使用它。 :::python
如果提供商原生支持您选择的模型的结构化输出,编写 response_format=ProductReview 与编写 response_format=ProviderStrategy(ProductReview) 功能等效。在任何情况下,如果结构化输出不受支持,智能体将回退到工具调用策略。
::: :::js
如果提供商原生支持您选择的模型的结构化输出,编写 responseFormat: contactInfoSchema 与编写 responseFormat: providerStrategy(contactInfoSchema) 功能等效。在任何情况下,如果结构化输出不受支持,智能体将回退到工具调用策略。
:::

工具调用策略

对于不支持原生结构化输出的模型,LangChain 使用工具调用来实现相同的结果。这适用于所有支持工具调用的模型(大多数现代模型)。 要使用此策略,配置一个 ToolStrategy: :::python
required
定义结构化输出格式的模式。支持:
  • Pydantic 模型:BaseModel子类,具有字段验证。返回验证后的 Pydantic 实例。
  • 数据类:带类型注解的 Python 数据类。返回字典。
  • TypedDict:类型化字典类。返回字典。
  • JSON Schema:带 JSON 模式规范的字典。必须包含顶层 title 和 description 键。返回字典。
  • 联合类型:多种模式选项。模型将根据上下文选择最合适的模式。
当生成结构化输出时返回的工具消息的自定义内容。 如果未提供,则默认显示结构化响应数据。
结构化输出验证失败的错误处理策略。默认为 True。
  • True:捕获所有错误并使用默认错误模板
  • str:捕获所有错误并使用此自定义消息
  • type[Exception]:仅捕获此异常类型并使用默认消息
  • tuple[type[Exception], ...]:仅捕获这些异常类型并使用默认消息
  • Callable[[Exception], str]:自定义函数,返回错误消息
  • False:不重试,让异常传播

自定义工具消息内容

tool_message_content 参数允许您自定义在生成结构化输出时出现在对话历史中的消息:
未提供 tool_message_content,我们的最终 @[ToolMessage] 将是:
::: :::js
required
定义结构化输出格式的模式。支持:
  • Zod Schema:一个 zod 模式
  • 标准模式:任何实现 标准模式 规范的模式
  • JSON Schema:一个 JSON 模式对象
当生成结构化输出时返回的工具消息的自定义内容。 如果未提供,则默认显示结构化响应数据。
包含可选 handleError 参数以自定义错误处理策略的选项参数。
  • true:捕获所有错误并使用默认错误模板(默认)
  • False:不重试,让异常传播
  • (error: ToolStrategyError) => string | Promise<string>:使用提供的消息重试或抛出错误

自定义工具消息内容

toolMessageContent 参数允许您自定义在生成结构化输出时出现在对话历史中的消息:
未提供 toolMessageContent,我们会看到:
:::

错误处理

模型在通过工具调用生成结构化输出时可能会出错。LangChain 提供智能重试机制来自动处理这些错误。

多个结构化输出错误

当模型错误地调用多个结构化输出工具时,智能体会在 @[ToolMessage] 中提供错误反馈并提示模型重试: :::python
::: :::js
:::

模式验证错误

当结构化输出与预期模式不匹配时,智能体会提供具体的错误反馈: :::python

错误处理策略

您可以使用 handle_errors 参数自定义错误处理方式: 自定义错误消息:
如果 handle_errors 是字符串,智能体会始终提示模型使用固定的工具消息重新尝试:
仅处理特定异常:
如果 handle_errors 是异常类型,智能体仅当抛出的异常是指定类型时才会重试(使用默认错误消息)。在其他所有情况下,异常将被抛出。 处理多个异常类型:
如果 handle_errors 是异常类型的元组,智能体仅当抛出的异常是指定类型之一时才会重试(使用默认错误消息)。在其他所有情况下,异常将被抛出。 自定义错误处理函数:
在 StructuredOutputValidationError:
在 MultipleStructuredOutputsError:
在其他错误:
无错误处理:
::: :::js

错误处理策略

您可以使用 handleErrors 参数自定义错误处理方式: 自定义错误消息:
仅处理特定异常:
处理多个异常类型:
无错误处理:
:::

处理链中的解析错误

:::python 上述策略,包括 handle_errors 重试,适用于使用 @[create_agent] 创建的智能体。使用管道操作符(例如,prompt | model | parser)组成的链没有内置的输出解析失败重试机制。要在链中处理格式错误的模型输出,请使用以下方法之一:
  • 模型级别的结构化输出:使用 @[with_structured_output][BaseChatModel.with_structured_output] 将模式绑定到模型。当提供者支持原生结构化输出时,它会强制执行模式并避免大多数解析失败。参见 模型 - 结构化输出。当模型支持时使用此方法。
  • 使用模型修复格式错误的输出:将输出解析器包装在来自 langchain-classic 的 OutputFixingParser 中。在解析失败时,包装器将格式错误的输出、解析器的格式指令和错误消息发送给模型,并解析修正后的响应。
OutputFixingParser 需要 langchain-classic 包。在 v1 之前,它作为 langchain.output_parsers.OutputFixingParser 提供。
包装的解析器仅在初始解析失败时才会调用修复模型,因此格式正确的输出不会产生额外的模型调用。 max_retries 控制在抛出原始 OutputParserException 之前进行的修复尝试次数。同步(invoke)和异步(ainvoke)执行都受支持。 OutputFixingParser 发送格式错误的完成内容、解析器的格式指令和错误。它不包括原始提示词。如果修正输出需要原始提示词作为上下文,请使用 RetryOutputParser 从 langchain-classic。它通过其 parse_with_prompt(completion, prompt_value) 方法调用,而不是 parse,因此不能作为链的最终步骤直接管道化。 ::: :::js 上述策略,包括 handleError 重试,适用于使用 createAgent 创建的智能体。使用 .pipe()(例如,prompt.pipe(model).pipe(parser))组成的链没有内置的输出解析失败重试机制。要在链中处理格式错误的模型输出,请使用以下方法之一:
  • 模型级别的结构化输出:使用 @[withStructuredOutput][BaseChatModel.with_structured_output] 将模式绑定到模型。当提供者支持原生结构化输出时,它会强制执行模式并避免大多数解析失败。参见 模型 - 结构化输出。当模型支持时使用此方法。
  • 使用模型修复格式错误的输出:将输出解析器包装在来自 @langchain/classic 的 OutputFixingParser 中。在解析失败时,包装器将格式错误的输出、解析器的格式指令和错误消息发送给模型,并解析修正后的响应。
OutputFixingParser 需要 @langchain/classic 包。在 v1 之前,它从 langchain/output_parsers 提供。
包装的解析器仅在初始解析失败时才会调用修复模型,因此格式正确的输出不会产生额外的模型调用。
OutputFixingParser 仅重试作为 OutputParserException 抛出的错误。抛出原始错误的解析器不会被重试:例如,JsonOutputParser 在无效 JSON 上抛出普通的 SyntaxError,该错误会未捕获地传播。包装一个抛出 OutputParserException 的解析器,例如 StructuredOutputParser。
:::
官方原文:src/oss/langchain/structured-output.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026