LangChain 结构化输出指南

LangChain 结构化输出指南

概述

对于许多应用程序(如聊天机器人),模型需要直接用自然语言回应用户。然而,在某些场景下,我们需要模型以结构化格式输出。例如,我们可能希望将模型输出存储在数据库中,并确保输出符合数据库模式。这种需求促成了结构化输出的概念,即可以指示模型以特定的输出结构进行响应。

核心概念

(1) 模式定义: 输出结构表示为模式,可以通过多种方式定义。

(2) 返回结构化输出: 模型被给予此模式,并被指示返回符合该模式的输出。

推荐用法

以下伪代码说明了使用结构化输出时的推荐工作流程。LangChain 提供了一个方法 with_structured_output(),它自动化了将模式绑定到模型和解析输出的过程。此辅助函数适用于所有支持结构化输出的模型提供商。

# 定义模式
schema = {"foo": "bar"}
# 将模式绑定到模型
model_with_structure = model.with_structured_output(schema)
# 调用模型以产生符合模式的结构化输出
structured_output = model_with_structure.invoke(user_input)

模式定义

核心概念是模型响应的输出结构需要以某种方式表示。虽然您可以使用的对象类型取决于您使用的模型,但在Python中通常允许或推荐用于结构化输出的常见对象类型。

1. JSON格式(字典/列表)

结构化输出最简单和最常见的格式是类似JSON的结构,在Python中可以表示为字典(dict)或列表(list)。当工具需要原始、灵活和最小开销的结构化数据时,通常直接使用JSON对象(或Python中的字典)。

{"answer": "用户问题的答案","followup_question": "用户可以询问的后续问题"
}

2. Pydantic模式

Pydantic特别适用于定义结构化输出模式,因为它提供类型提示和验证。以下是Pydantic模式的示例:

from pydantic import BaseModel, Fieldclass ResponseFormatter(BaseModel):"""始终使用此工具来构建对用户的响应。"""answer: str = Field(description="用户问题的答案")followup_question: str = Field(description="用户可以询问的后续问题")

返回结构化输出

定义了模式后,我们需要一种方法来指示模型使用它。虽然一种方法是在提示中包含此模式并友好地要求模型使用它,但这不是推荐的做法。有几种更强大的方法可以利用模型提供商API中的原生功能。

使用工具调用

许多模型提供商支持工具调用,这个概念在我们的工具调用指南中有更详细的讨论。简而言之,工具调用涉及将工具绑定到模型,在适当的时候,模型可以决定调用此工具并确保其响应符合工具的模式。考虑到这一点,核心概念很简单:只需将我们的模式作为工具绑定到模型!

以下是使用上面定义的 ResponseFormatter 模式的示例:

from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o", temperature=0)
# 将ResponseFormatter模式作为工具绑定到模型
model_with_tools = model.bind_tools([ResponseFormatter])
# 调用模型
ai_msg = model_with_tools.invoke("细胞的动力工厂是什么?")

工具调用的参数已经被提取为字典。此字典可以选择性地解析为Pydantic对象,匹配我们原始的 ResponseFormatter 模式。

# 获取工具调用参数
ai_msg.tool_calls[0]["args"]
{'answer': "细胞的动力工厂是线粒体。线粒体是产生细胞大部分三磷酸腺苷(ATP)供应的细胞器,ATP用作化学能源。",'followup_question': 'ATP在细胞中的功能是什么?'
}# 将字典解析为pydantic对象
pydantic_object = ResponseFormatter.model_validate(ai_msg.tool_calls[0]["args"])

JSON模式

除了工具调用,一些模型提供商还支持称为 JSON模式 的功能。这支持JSON模式定义作为输入,并强制模型产生符合要求的JSON输出。您可以在这里找到支持JSON模式的模型提供商表格。

以下是如何在OpenAI中使用JSON模式的示例:

from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o").with_structured_output(method="json_mode")
ai_msg = model.invoke("返回一个JSON对象,键为'random_ints',值为[0-99]范围内的10个随机整数")
ai_msg
# 输出: {'random_ints': [45, 67, 12, 34, 89, 23, 78, 56, 90, 11]}

结构化输出方法

使用上述方法产生结构化输出时存在一些挑战:

  1. 解析挑战: 当使用工具调用时,工具调用参数需要从字典解析回原始模式。

  2. 强制使用工具: 此外,当我们想要强制结构化输出时,需要指示模型始终使用工具,这是一个特定于提供商的设置。

  3. JSON解析: 当使用JSON模式时,输出需要解析为JSON对象。

考虑到这些挑战,LangChain提供了一个辅助函数(with_structured_output())来简化流程。

在这里插入图片描述

这既将模式绑定到模型作为工具,又将输出解析为指定的输出模式。

# 将模式绑定到模型
model_with_structure = model.with_structured_output(ResponseFormatter)
# 调用模型
structured_output = model_with_structure.invoke("细胞的动力工厂是什么?")
# 获取pydantic对象
structured_output
# 输出: ResponseFormatter(
#     answer="细胞的动力工厂是线粒体。线粒体是产生细胞大部分三磷酸腺苷(ATP)供应的细胞器,ATP用作化学能源。", 
#     followup_question='ATP在细胞中的功能是什么?'
# )

实际应用场景

结构化输出在以下场景中特别有用:

  1. 数据库存储: 确保模型输出符合数据库模式
  2. API集成: 生成符合特定API要求的响应格式
  3. 数据提取: 从非结构化文本中提取结构化信息
  4. 表单填充: 自动填充具有特定字段的表单
  5. 报告生成: 创建具有一致格式的报告

最佳实践

  1. 明确的模式定义: 使用清晰的字段描述和类型提示
  2. 验证机制: 利用Pydantic的验证功能确保数据质量
  3. 错误处理: 实现适当的错误处理机制
  4. 性能考虑: 选择适合您用例的最高效方法

总结

LangChain的结构化输出功能为开发者提供了一种强大而灵活的方式来确保模型输出符合特定格式。通过使用 with_structured_output() 方法,您可以轻松地将模式绑定到模型并获得结构化的响应,这对于构建生产级应用程序至关重要。


参考资料:

  • LangChain官方文档 - 结构化输出
    方法,您可以轻松地将模式绑定到模型并获得结构化的响应,这对于构建生产级应用程序至关重要。

参考资料:

  • LangChain官方文档 - 结构化输出
  • 更多详细用法请参见官方使用指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84039.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探究webView与html的通讯

最近出来个新需求: 需求描述: 将uniapp的代码打包成一个app,并实现原本的功能。 原uniapp是一个H5项目,主要的步骤流程是上传用户的身份证进行二要素认证,成功后再进行三方活体认证,然后三方回跳到项目中的…

高级定时器TIM1、TIM8

高级定时器在通用定时器的基础上增加了一些功能,如:重复计数器、带死区控制的互补输出通道、断路输入等。 捕获/比较通道的输出部分(通道1至3) 捕获/比较通道的输出部分(通道4) ①重复计数器RCR 基本和通用定时器发生溢出时,会直接生成更新时…

搭建简易采购系统:从需求分析到供应商数据库设计

一、需求分析框架(4大核心模块) 关键需求清单: 需求提报(含审批流) 供应商准入与评估 比价与订单生成 基础报表功能 二、技术选型方案 组件推荐方案替代方案前端框架Vue.js ElementUIReact Ant Design后端语言P…

基于LSTM-GARCH混合模型的“获利了结”量化解析:黄金单日1.27%跌幅的技术性归因

摘要:本文通过多维度量化指标、结合地缘风险溢价因子、货币政策预期指数及贸易摩擦不确定性指数,构建动态情景分析框架。 一、黄金价格技术面解析 周一(6月16日)现货黄金呈现"冲高回落-获利了结"典型特征,日…

【AI】Spring AI Alibaba 的介绍

目录 一、Spring AI Alibaba 的介绍 1.1 什么是 Spring AI Alibaba? 1.2 Spring AI 项目简介 二、核心概念 2.1 模型 2.2 提示(Prompt) 2.3 提示词模板(Prompt Template) 2.4 嵌入(Embedding&#x…

从main()函数的执行发散开来

大多数程序员的第一行代码可能都是从输出“Hello&#xff0c;World!开始的吧。如果请你写一个c程序&#xff0c;在屏幕上打印“Hello&#xff0c;World!”&#xff0c;下面的代码对拥有扎实编程基本功的你而言肯定so easy&#xff1a; #include <stdio.h>int main() {pr…

(16)java+ selenium->自动化测试-元素定位之By xpath下篇

1.简介 老规矩,我们还是接着前面两篇的Xpath 5.自动测试实战 以百度首页为例,将xpath的各种定位方法一一讲解和分享一下。 5.1大致步骤 1.访问百度首页。 2.通过xpath定位到元素,点击一下。 5.2模糊定位starts-with关键字 有一种特殊的情况:页面元素的属性值会被动态…

45-Oracle 索引的新建与重建

小伙们日常里有没有被业务和BOSS要求新建索引或是重建索引&#xff1f;他们都想着既快又稳&#xff0c;那么索引在在Oracle上如何实现、新建、重建。原则是什么&#xff1a; 1、新建索引&#xff0c;查询是否高频且慢&#xff0c;索引列是否高选择性&#xff0c;新增索引对写负…

使用 Rust Clippy 的详细方案

使用 Rust Clippy 的详细方案 Rust Clippy 是一个强大的静态分析工具&#xff0c;帮助开发者识别代码中的潜在问题并改善代码质量。以下是如何充分利用 Clippy 的方法&#xff1a; 安装 Clippy 确保 Rust 工具链已安装。通过以下命令安装 Clippy&#xff1a; rustup compon…

21.什么是JSBridge(1)

1.Native与H5交互的常用交互机制&#xff0c;主流选择是jsbridge 2.jsbridge是什么&#xff1f; JSBridge 是 Android 官方 WebView 提供的 addJavascriptInterface() 能力 项目方&#xff08;或三方库&#xff09;封装的桥梁通信协议。 底层机制由 Android 官方 WebView 提…

什么是Flink

Apache Flink&#xff1a;流批一体的大数据处理引擎 什么是Apache Flink&#xff1f; Apache Flink是一个开源的分布式流处理框架&#xff0c;最初由柏林工业大学开发&#xff0c;后成为Apache软件基金会的顶级项目。它能够以高吞吐、低延迟的方式处理无界数据流(流处理)和有…

区块链+智能合约如何解决上门按摩行业的信任问题?——App开发案例

你是不是觉得上门按摩市场已经人满为患&#xff1f;担心自己入局太晚或者缺乏行业经验&#xff1f;一组真实数据可能会让你改变看法&#xff1a;全国按摩服务需求正以月均8%的速度迅猛增长&#xff0c;但专业技师的供给量仅能跟上5%的增幅&#xff01;这意味着每个月都有相当于…

修改windows hosts文件的软件

修改hosts文件的软件推荐及使用教程 这个软件我用了10多年 推荐工具&#xff1a;Hosts Host软件不用安装绿色 如何使用 注意事项 如何没有安装.net 3.5 请根据提示安装就可以了 内容绑定了软件下载资源&#xff0c;在顶部有需要的自己取

Java web非Maven项目中引入EasyExcel踩坑记录

最近在帮朋友在老项目上做二次开发&#xff0c;有读取Excel的需求&#xff0c;习惯性的引入了EasyExcel&#xff0c;但是出现了很多问题&#xff0c;最主要就是jar包的问题,需要依赖的jar包版本问题 项目技术栈&#xff1a; tomcat9 Amazon Corretto JDK 8 (亚马逊的openJDK…

Flutter——数据库Drift开发详细教程(七)

目录 入门设置 漂移文件入门变量数组定义表支持的列类型漂移特有的功能 导入嵌套结果LIST子查询Dart 互操作SQL 中的 Dart 组件类型转换器现有的行类Dart 文档注释 结果类名称支持的语句 入门 Drift 提供了一个dart_api来定义表和编写 SQL 查询。尤其当您已经熟悉 SQL 时&#…

【排坑指南】MySQL初始化后,Nacos与微服务无法连接??

Date&#xff1a;2025/06/18 你好&#xff01; 今天&#xff0c;分享一个工作中遇到的一个 MySQL 问题。在这之前都不知道是 MySQL 的问题&#xff0c;特离谱&#xff01; 昨天和今天大多数时间都用来处理了这一个问题&#xff1a;《MySQL进行了数据库初始化之后&#xff0c…

springboot获取工程目录

在springboot中使用ApplicationHome获取工程所在目录的时候&#xff0c;开发环境和生产运行环境输出的目录是不同的&#xff0c;开发环境到target/classes目录&#xff0c;而生产运行则是需要的wzkj-server.jar所在目录 ApplicationHome home new ApplicationHome(CollectTas…

深入ZGC并发处理的原理

大型Java应用的核心痛点之一&#xff1a;当JVM进行垃圾回收时强制程序暂停&#xff08;STW&#xff09;的代价。在要求低延迟的应用场景——高频交易系统、实时在线服务或全球性大型平台——中&#xff0c;这种"时空静止"的成本可能极高。但JDK从16版本&#xff08;生…

配置DHCP服务(小白的“升级打怪”成长之路)

目录 项目前准备 一、DHCP服务器配置&#xff08;Rocky8&#xff09; 1&#xff0c;关闭防火墙、安全上下文 2、配置网卡文件 3、安装hdcp-server 4、配置dhcp服务 5、重启dhcp服务 二、配置路由器 1、添加两块网卡并更改网卡配置文件 2、配置路由功能 3、挂载本地镜…

云原生安全

云原生 | T Wiki 以下大部分内容参考了这篇文章 什么是云原生 云原生&#xff08;Cloud Native&#xff09; “云原生”可以从字面上拆解为“云”和“原生”两个部分来理解&#xff1a; “云”&#xff0c;是相对于“本地”而言的。传统应用部署在本地数据中心或物理服务器…