825 字
2 分钟
LangChainlangchain
LangChain 核心组件 06:Structured Output

当你不想只拿一段自然语言,而是想拿稳定可解析的数据结构时,应该如何在 LangChain 中设计响应格式。

结构化输出我放在 Agents 前面,是因为它本质上是"让模型结果进入程序逻辑"的桥。等这个概念清楚了,再去看 Agent 里的 response_format 就不会突兀。

结构化输出使得智能体能够以特定、可预测的格式返回数据。你无需解析自然语言响应,而是可以直接获取以 JSON 对象、Pydantic 模型或数据类形式呈现的结构化数据,供应用程序直接使用。

LangChain 的create_agent可自动处理结构化输出。用户设置所需的结构化输出模式,当模型生成结构化数据时,该数据会被捕获、验证,并以structured_response为键名返回至智能体状态中。

Python3 点击展开代码
8 lines 展开代码

1. 响应格式#

使用response_format控制智能体返回结构化数据的方式:

  • ToolStrategy[StructuredResponseT]:通过工具调用实现结构化输出
  • ProviderStrategy[StructuredResponseT]:采用服务提供商原生结构化输出
  • type[StructuredResponseT]:架构类型 —— 根据模型能力自动选择最优策略
  • None:未明确请求结构化输出

当直接提供架构类型时,LangChain 会自动选择:

  • ProviderStrategy(若所选模型及服务提供商支持原生结构化输出,例如 OpenAI、Anthropic (Claude)或xAI (Grok))。
  • ToolStrategy(适用于其他所有模型)。

2. Provider strategy#

部分模型提供商通过其 API 原生支持结构化输出(例如 OpenAI、xAI(Grok)、Gemini、Anthropic(Claude))。在可用的情况下,这是最可靠的方法。

要使用此策略,请配置一个ProviderStrategy:

Python3 点击展开代码
3 lines 展开代码

定义结构化输出格式的模式。支持:

  • Pydantic 模型:带有字段验证的BaseModel子类,返回经过验证的 Pydantic 实例。
  • 数据类:带有类型注解的 Python 数据类,返回字典。
  • 类型字典:类型化字典类,返回字典。
  • JSON 模式:包含 JSON 模式规范的字典,返回字典。

下面提供这四种情况的代码

Python3 点击展开代码
21 lines 展开代码
Python3 点击展开代码
23 lines 展开代码
Python3 点击展开代码
22 lines 展开代码
Python3 点击展开代码
26 lines 展开代码

3. Tool calling strategy#

对于不支持原生结构化输出的模型,LangChain 会通过工具调用来实现相同的效果。该方法适用于所有支持工具调用的模型(大多数现代模型)。

要使用此策略,请配置ToolStrategy:

Python3 点击展开代码
10 lines 展开代码

同样,这里的schema模版支持以下:

  • Pydantic 模型:BaseModel 子类,具备字段校验功能,返回校验后的 Pydantic 实例。
  • 数据类:带有类型注解的 Python 数据类,返回字典。
  • 类型字典:类型化字典类,返回字典。
  • JSON 模式:符合 JSON 模式规范的字典,返回字典。
  • 联合类型:多种模式选项,模型会根据上下文选择最合适的模式。

这里分别提供五种情况的示例代码:

Python3 点击展开代码
23 lines 展开代码
Python3 点击展开代码
24 lines 展开代码
Python3 点击展开代码
23 lines 展开代码
Python3 点击展开代码
39 lines 展开代码
Python3 点击展开代码
39 lines 展开代码

4. Custom tool message content#

tool_message_content 参数允许你自定义生成结构化输出时,显示在对话历史中的消息内容。效果如下:

Python3 点击展开代码
24 lines 展开代码
================================ Human Message =================================
From our meeting: Sarah needs to update the project timeline as soon as possible
================================== Ai Message ==================================
Tool Calls:
MeetingAction (call_1)
Call ID: call_1
Args:
task: Update the project timeline
assignee: Sarah
priority: high
================================= Tool Message =================================
Name: MeetingAction
Action item captured and added to meeting notes!

如果没有tool_message_content,最终的ToolMessage会像这样:

================================= Tool Message =================================
Name: MeetingAction
Returning structured response: {'task': 'update the project timeline', 'assignee': 'Sarah', 'priority': 'high'}

5. 错误处理#

先skip

专题阅读

LangChain

这篇文章属于同一条阅读链。你可以直接在这里切换,不用再回到列表页重新找。

当前进度9 / 11

留言区

留言

欢迎纠错、补充、交流。昵称和评论内容必填;如果你愿意,也可以留下联系方式,仅站主可见。

0

正在加载评论...

0 / 2000

阅读导航

文章目录

当前阅读位置将在这里显示

0 节