结构化输出允许智能体以特定、可预测的格式返回数据。您无需解析自然语言响应,而是可以直接获得 JSON 对象、Pydantic 模型或数据类形式的结构化数据,您的应用程序可以直接使用这些数据。
本页介绍使用 create_agent 的智能体的结构化输出。若要在模型上直接使用结构化输出(在智能体之外),请参阅模型 - 结构化输出。
LangChain 的 create_agent 会自动处理结构化输出。用户设置他们期望的结构化输出模式,当模型生成结构化数据时,它会被捕获、验证,并在智能体状态的 'structured_response' 键中返回。

响应格式

使用 response_format 来控制智能体如何返回结构化数据:
  • ToolStrategy[StructuredResponseT]:使用工具调用来实现结构化输出
  • ProviderStrategy[StructuredResponseT]:使用提供商原生的结构化输出
  • type[StructuredResponseT]:模式类型 - 根据模型功能自动选择最佳策略
  • None:未明确请求结构化输出
当直接提供模式类型时,LangChain 会自动选择:
  • 如果所选模型和提供商支持原生结构化输出(例如 OpenAI、Anthropic (Claude) 或 xAI (Grok)),则使用 ProviderStrategy。
  • 对于所有其他模型,使用 ToolStrategy。
如果使用 langchain>=1.1,对原生结构化输出功能的支持会从模型的配置数据中动态读取。如果数据不可用,请使用其他条件或手动指定:
如果指定了工具,模型必须支持同时使用工具和结构化输出。
结构化响应在智能体的最终状态中的 structured_response 键下返回。

提供商策略

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

工具调用策略

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

自定义工具消息内容

tool_message_content 参数允许您自定义当生成结构化输出时出现在对话历史记录中的消息:
如果不设置 tool_message_content,我们最终的 ToolMessage 将是:

错误处理

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

多个结构化输出错误

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

模式验证错误

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

错误处理策略

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