结构化输出及其使用方法
在 LLM 应用程序中构建稳健性和确定性
图片来自作者
欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术,要么使用第三方工具。
在本文中,我们将解释什么是结构化输出、它们如何工作以及如何将它们应用于您自己的基于 LLM 的应用程序中。尽管 OpenAI 的公告使得使用他们的 API 实现起来非常容易(正如我们将在此处演示的那样),但您可能希望选择开源Outlines包(由dottxt上的可爱人员维护),因为它可以应用于自托管开放权重模型(例如 Mistral 和 LLaMA)以及专有 API(免责声明:由于此问题, Outlines 在撰写本文时不支持通过 OpenAI API 生成结构化 JSON;但这很快就会改变!)。
什么是结构化输出?
如果RedPajama 数据集有任何指示,那么绝大多数预训练数据都是人类文本。因此,“自然语言”是 LLM 的原生领域——无论是在输入中,还是在输出中。然而,当我们构建应用程序时,我们希望使用机器可读的形式结构或模式来封装我们的数据输入/输出。这样我们就可以在应用程序中构建稳健性和确定性。
结构化输出是一种机制,通过该机制,我们可以在 LLM 输出上强制执行预定义模式。这通常意味着我们强制执行 JSON 模式,但它不仅限于 JSON — 原则上我们可以强制执行 XML、Markdown 或完全定制的模式。结构化输出的好处有两方面:
-
更简单的提示设计——在指定输出应该是什么样子时,我们不需要过于冗长
-
确定性名称和类型——我们可以保证在 LLM 响应中获得age具有Number JSON 类型的属性
实现 JSON 模式
在这个例子中,我们将使用Sam Altman 的维基百科条目的第一句话……
塞缪尔·哈里斯·奥特曼 (Samuel Harris Altman,1985 年 4 月 22 日出生) 是一位美国企业家和投资者,自 2019 年起担任 OpenAI 的首席执行官(他曾短暂被解雇并于 2023 年 11 月复职)。
…我们将使用最新的 GPT-4o 检查点作为命名实体识别 (NER) 系统。我们将强制执行以下 JSON 模式:
json_schema = { "name": "NamedEntities","name" : "NamedEntities" , "schema" : { "type" : "object" , "properties" : { "entities" : { "type" : "array" , "description" : "实体名称及其对应类型的列表" , "items" : { "type" : "object" , "properties" : { " name" : { "type" : "string" , "description" : "文本中指定的实际名称,例如人名或国家名称"}, "type" : { "type" : "string" , "description" : "实体类型,例如'Person'或'Organization'" , "enum" : [ "Person" , "Organization" , "Location" , "DateTime" ] } }, "required" : [ "name" , "type" ], “additionalProperties” : False} } }, “required” : [ “entities” ], “additionalProperties” : False}, “strict” : True}
本质上,我们的 LLM 响应应该包含一个NamedEntities对象,该对象由一个数组组成entities,每个数组包含一个name和type。这里有几点需要注意。例如,我们可以强制使用枚举类型,这在 NER 中非常有用,因为我们可以将输出限制为一组固定的实体类型。我们必须指定数组中的所有字段required:但是,我们也可以通过将类型设置为例如来模拟“可选”字段["string", null]。
现在,我们可以将模式连同数据和指令一起传递给 API。我们需要response_format用一个字典填充参数,然后提供相应的模式。type"json_schema”
完成 = 客户端。beta.chat.completions.parse( model="gpt-4o-2024-08-06",“gpt-4o-2024-08-06”,消息=[ { “role”:“system”,“content”:“”“您是命名实体识别 (NER) 助理。您的工作是识别并返回给定文本的所有实体名称及其类型。您只能严格遵守以下实体类型:人员、位置、组织和日期时间。如果不确定实体类型,请忽略它。请小心某些首字母缩略词,例如角色头衔“CEO”、“CTO”、“VP”等 - 这些应该被忽略。”“”,},{ “role”:“user”,“content”:s } ],response_format={ “type”:“json_schema”,“json_schema”:json_schema,} )
输出应如下所示:
{'entities': [{'name':'Samuel Harris Altman','type':'Person'},'实体':[{ '名称':'塞缪尔·哈里斯·奥特曼','类型':'人' },{ '名称':'1985 年 4 月 22 日','类型':'日期时间' },{ '名称':'美国人','类型':'地点' },{ '名称':'OpenAI','类型':'组织' },{ '名称':'2019','类型':'日期时间' },{ '名称':'2023 年 11 月','类型':'日期时间' }]}
本文使用的完整源代码可在此处获得。
工作原理
魔法在于约束采样和上下文无关语法 (CFG)的结合。我们之前提到过,绝大多数预训练数据都是“自然语言”。从统计上讲,这意味着对于每个解码/采样步骤,从学习的词汇表中抽取一些任意标记的可能性都是不可忽略的(在现代 LLM 中,词汇表通常涵盖 40 000 多个标记)。但是,在处理形式模式时,我们确实希望快速消除所有不可能的标记。
在前面的例子中,如果我们已经生成了……
{'实体':[{'名称':'Samuel Harris Altman',‘实体’:[{ ‘名称’:‘塞缪尔·哈里斯·奥特曼’,
...那么理想情况下,我们希望'typ在下一个解码步骤中对标记放置非常高的逻辑偏差,而对词汇表中所有其他标记放置非常低的概率。
本质上就是这种情况。当我们提供模式时,它会被转换成形式语法或 CFG,用于在解码步骤中指导逻辑偏差值。CFG 是那些正在卷土重来的老式计算机科学和自然语言处理 (NLP) 机制之一。这个 StackOverflow 答案实际上对 CFG 进行了非常好的介绍,但本质上它是一种描述符号集合的转换规则的方式。
结论
结构化输出并不是什么新鲜事物,但随着专有 API 和 LLM 服务的出现,它无疑正成为人们最关心的问题。它们在 LLM 不稳定且不可预测的“自然语言”领域与软件工程确定性和结构化领域之间架起了一座桥梁。结构化输出对于任何设计复杂 LLM 应用程序的人来说都是必不可少的,因为LLM 输出必须在各种组件中共享或“呈现”。虽然 API 原生支持终于到来了,但构建者也应该考虑使用 Outlines 等库,因为它们提供了一种与 LLM/API 无关的方法来处理结构化输出。
感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)
相关文章:

结构化输出及其使用方法
在 LLM 应用程序中构建稳健性和确定性 图片来自作者 欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术,要么使用第三方工具。 在本文…...

yolov8人脸识别案例
GitHub - wangWEI201901/YOLOv8-Detection-Project: 🛣️基于YOLOv8的智慧校园人脸识别和公路汽车检测...
成员变量在Java中的定义与使用
成员变量在Java中的定义与使用 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在本文中,我们将详细探讨Java中的成员变量,包括其定义、使用以及各种类型的成员变量示例。 成员…...

Python开发工具PyCharm入门指南 - 用户界面主题更改
JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 界面主题定义了窗口、对话框、按钮和用户界面的所有可视元素的外观…...
TCP网络套接字
一、创建套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 参数: domain:指定使用的协议族。常见的取值有AF_INET(IPv4)和AF_INET6(IPv6&a…...

Element学习(axios异步加载数据、案例操作)(5)
1、这次学习的是上次还未完成好的恶element案例,对列表数据的异步加载,并渲染展示。 ——>axios来发送异步请求 (1) (2)在vue当中安装axios (注意在当前的项目目录,并且安装完之后…...

大数据-65 Kafka 高级特性 分区 Broker自动再平衡 ISR 副本 宕机恢复再重平衡 实测
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

html+css+js网页设计 软通动力网站2个页面(带js)首页轮播图+置顶导航
htmlcssjs网页设计 软通动力网站2个页面(带js)首页轮播图置顶导航 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及…...

【经验分享】ShardingSphere+Springboot-04:自定义分片算法(COMPLEX/STANDARD)
文章目录 3.4 CLASS_BASED 自定义类分片算法3.4.1 复杂分片自定义算法(strategyCOMPLEX )3.4.2 STANDARD 标准分片自定义算法## 进阶:star: 自定义算法范围查询优化 3.4 CLASS_BASED 自定义类分片算法 3.4.1 复杂分片自定义算法(strategyCOM…...
如何设置RabbitMQ和Redis消息队列系统
设置RabbitMQ和Redis作为消息队列系统时,需要分别进行安装、配置和测试,以确保它们能够正常工作并满足你的应用需求。以下是一个基于这两个系统的设置指南: RabbitMQ的设置 1. 安装Erlang 由于RabbitMQ是用Erlang语言编写的,因…...
白骑士的Matlab教学高级篇 3.3 工具箱与扩展
MATLAB 提供了丰富的工具箱(Toolbox)和扩展功能,这些工具箱涵盖了各个领域的专业计算需求,如信号处理、图像处理、统计与机器学习等。利用工具箱,用户可以快速实现复杂的计算和分析任务。本文将介绍常用的工具箱及其使…...

bug: 配置flyway.locations多个脚本位置不生效
文章目录 业务场景场景一场景二 业务场景 随着项目版本迭代,数据库结构也会变动。如果一个项目引用其他项目的jar包,并且需要执行对应jar包的flyway脚本,就需要配置flyway.locations 场景一 正常情况下,在一个项目中可以在yml文件…...
8月5日SpringBoot学习笔记
今日内容:搭建mybatis ORM 配置数据源 $#的区别 增删改查 搭建mybatis 在原有maven项目基础配置上进行: pom文件添加依赖 <!-- Mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-…...

Java学习笔记(二十):反射、动态代理、日志、类加载器、xml、单元测试Junit、注解
目录 一、反射 1.1 反射的概述: 1.2 学习反射到底学什么? 1.3 获取字节码文件对象的三种方式 1.4 字节码文件和字节码文件对象 1.5 获取构造方法 1.6 获取构造方法并创建对象 1.7 获取成员变量 1.8 获取成员变量并获取值和修改值 1.9 获取成员…...

如何快速从文本中找到需要的信息,字典和正则灵活运用
import re #打开文本文件 f open("stock_data.txt",encoding"utf-8") #单独读取第一行数据处理进行分割,末尾换行符去掉 headers f.readline().strip().split(,) print(headers) #定义一个字典,以股标代码做为KEY,每个行做为值 st…...

springboot3整合redis
来源于https://www.bilibili.com/video/BV1UC41187PR/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source865f32e12aef524afb83863069b036aa 一、整合redis 1.创建项目文件 2.添加依赖 <dependencies><dependency><groupId>…...

VUE基础快速入门
VUE 和 VUE-Cli VUE 是一种流行的渐进式JavaScript框架,用于构建Web用户界面它具有易学、轻量级、灵活性强、高效率等特点,并且可以与其他库和项目集成是目前最流行的前端框架之一VUE-Cli 称为“VUE脚手架”,它是由VUE官方提供的客户端,专门为…...
用Python实现特征工程之特征提取——数值特征提取、类别特征提取、文本特征提取、时间特征提取
特征提取是特征工程中的关键步骤,它从原始数据中提取有意义的特征,以便机器学习模型能够更好地理解和学习数据。根据数据类型,特征提取可以分为数值特征提取、类别特征提取、文本特征提取和时间特征提取。下面详细讲解每种特征提取方法&#…...

按图搜索新体验:阿里巴巴拍立淘API返回值详解
阿里巴巴拍立淘API是一项基于图片搜索的商品搜索服务,它允许用户通过上传商品图片,系统自动识别图片中的商品信息,并返回与之相关的搜索结果。以下是对阿里巴巴拍立淘API返回值的详细解析: 一、主要返回值内容 商品信息 商品列表…...
vue跨域问题
本地调试 可以通过在vue.config.js中配置devServer来实现跨域请求。 module.exports {publicPath: ./,productionSourceMap: false, // 生产环境是否生成 sourceMap 文件devServer: {proxy: {/bi: {target: http://1.11.113.20:1234/bi, // 后台接口域名ws: false, //…...

华为OD机试 - 猴子吃桃 - 二分查找(Java 2025 B卷 200分)
public class Test14 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String[] s = sc.nextLine().split(" ");int[] arr = new int[s.length-1];int count = Integer.parseInt(s[s...

OpenCV CUDA模块图像处理------双边滤波的GPU版本函数bilateralFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数在 GPU 上执行双边滤波操作,是一种非线性平滑滤波器,能够在 保留边缘的同时去除噪声。 函数原型 void cv::cuda:…...

动力电池点焊机:驱动电池焊接高效与可靠的核心力量|比斯特自动化
在新能源汽车与储能设备需求激增的背景下,动力电池的制造工艺直接影响产品性能与安全性。作为电芯与极耳连接的核心设备,点焊机如何平衡效率、精度与可靠性,成为电池企业关注的重点。 动力电池点焊机的核心功能是确保电芯与极耳的稳固连接。…...
Android学习总结-GetX库常见问题和解决方案
GetX库的常见问题 路由管理:Get.to() 后页面不跳转或卡顿? 问题: 明明调用了 Get.to(NextPage()),但页面没反应,或者感觉有延迟卡顿。这可能发生在较复杂的页面树或低端设备上。原因: …...

容器安全最佳实践:云原生环境下的零信任架构实施
📋 目录 引言:容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…...
录制mp4
目录 单线程保存mp4 多线程保存mp4 rtsp ffmpeg录制mp4 单线程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖动,1自适应 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…...

LabVIEW实时系统数据监控与本地存储
基于LabVIEW Real-Time 模块,面向工业自动化、嵌入式测控等场景,提供实时数据采集、监控与本地存储的完整实现路径。通过分层任务调度、TDMS 文件格式应用及跨平台兼容性设计,确保系统在实时性、可靠性与数据管理效率间达到平衡。文中以 Comp…...

最新Spring Security实战教程(十七)企业级安全方案设计 - 多因素认证(MFA)实现
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...
1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server
以下为本次问题的解决办法: 1、暂停mysql容器: docker stop mysql 2、删除mysql容器:docker rm mysql 3、查看mysql容器是否被删除:docker ps -a #没有mysql容器就是删除成功 4、run mysql容器: docker run -d --…...

YOLO在QT中的完整训练、验证与部署方案
以下是YOLO在QT中的完整训练、验证与部署方案: 训练方案 准备数据集: 收集数据:收集与目标检测任务相关的图像数据集,可以是公开数据集如COCO、Pascal VOC,也可以是自定义数据集。标注数据:使用标注工具如…...