结构化输出及其使用方法

news2024/11/15 21:32:02

在 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 或完全定制的模式。结构化输出的好处有两方面:

  1. 更简单的提示设计——在指定输出应该是什么样子时,我们不需要过于冗长

  2. 确定性名称和类型——我们可以保证在 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,每个数组包含一个nametype。这里有几点需要注意。例如,我们可以强制使用枚举类型,这在 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开发人员)

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

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

相关文章

异质性空间自回归模型 (HSAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 七、代码运行结果 一、引言 在空间计量经济学中,异质性空间自回归模型(Heterogeneous Spatial Autoregressive Model,HSAR)是一种…

深度优化Nginx负载均衡策略,携手Keepalived打造高可用服务架构新纪元

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

什么是数据仓库ODS层?为什么需要ODS层?

在大数据时代,数据仓库的重要性不言而喻。它不仅是企业数据存储与管理的核心,更是数据分析与决策支持的重要基础。而在数据仓库的各个层次中,ODS层(Operational Data Store,操作型数据存储)作为关键一环&am…

NVDLA专题4:具体模块介绍——Convolution DMA

概述 Convolution DMA Module的定义在NV_NVDLA_cmda.v中&#xff0c;其module的定义如下&#xff1a; module NV_NVDLA_cdma (cdma_dat2cvif_rd_req_ready //|< i,cdma_dat2mcif_rd_req_ready //|< i,cdma_wt2cvif_rd_req_ready //|< i,cdma_wt2mcif_rd_r…

【Nacos】docker部署nacos服务

docker部署nacos服务 1.直接执行命令2.如果网络出现问题 1.直接执行命令 docker run -e JVM_XMS256m -e JVM_XMX256m --env MODEstandalone \ --name mynacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 \ docker.io/nacos/nacos-server:v2.1.12.如果网络出现问题 执行如下命…

计算机系统基础知识:计算机组成和基本原理

文章目录 1. 总线1.1 系统总线1.2 外总线 2. 中央处理单元2.1 CPU组成运算器控制器寄存器组内部总线 2.2 多核处理器 3. 存储系统3.1 分类3.2 层次结构3.3 主存储器3.4 高速缓存3.5 外存储器3.6 云存储 4. 输入/输出技术4.1 接口的功能和分类4.2 主机和外设间的连接方式4.3 编址…

定制化三防平板:满足个性化需求

定制化服务的核心在于理解并满足用户的个性化需求。对于三防平板而言&#xff0c;这意味着设备不仅需要具备防水、防尘、防摔的基本特性&#xff0c;更需根据用户的特定工作环境和使用习惯&#xff0c;进行功能和设计上的优化。 例如&#xff0c;对于在极端温度环境下作业的人…

51单片机-LED灯蜂鸣器数码管按键DS18B20温度传感器

LDE灯的相关程序 LED灯闪烁 LED流水灯 方法1 方法二&#xff1a; 因为P1口可以直接控制P1^0~P1^7的8个led灯&#xff0c;利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。 蜂鸣器的使用 什么是蜂鸣器&#xff1f; 蜂鸣器是一种一…

【C++】类和对象 ——中

1. 赋值运算符重载 1.1 运算符重载 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 •…

Leetcode—1143. 最长公共子序列【中等】

2024每日刷题&#xff08;155&#xff09; Leetcode—1143. 最长公共子序列 实现代码 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int m text1.length();int n text2.length();vector<vector<int>> dp(m 1, vector&…

sadtalker推理的时候报错:IndexError: Cannot choose from an empty sequence

问题描述 在进行推理的时候&#xff0c;报错IndexError: Cannot choose from an empty sequence&#xff0c;如下图 解决办法&#xff1a; 这个报错是因为你输入的音频太短了&#xff0c;不到1秒就会报这个错。你可以输入个大于1秒的视频试一下。 也可以修改代码解决这个问题…

Python教程(十四):Requests模块详解

目录 专栏列表前言&#xff1a;安装 Requests查看包安装情况&#xff1a; RESTful 介绍RESTful API设计原则示例 基本用法1. 查询ID为1的用户&#xff08;GET&#xff09;2. 创建新用户&#xff08;POST&#xff09;3. 更新ID 为 1 的用户&#xff08;PUT&#xff09;4. 删除ID…

Haproxy讲解

Haproxy: haproxy是一个开源的高性能反向代理和负载均衡器&#xff0c;主要用于‌TCP和‌HTTP流量管理。 功能和特点&#xff1a;haproxy能够处理大量的并发连接&#xff0c;支持TCP和HTTP协议&#xff0c;具有高可用性和负载均衡功能。它特别适用于需要处理大量流量的网站&am…

AI终于会画手了,Flux.1一出世就直接碾压Stable Diffusion(SD)和Midjourney(MJ)

Flux.1模型一发布&#xff0c;AI文生图终于会画手了&#xff0c;Flux.1模型比Stable Diffusion&#xff08;SD&#xff09;和Midjourney&#xff08;MJ&#xff09;更能将手部和长文本生成得更好更合理。 Flux.1模型生成的图&#xff0c;现在手部不再有畸形了。 同时&#xff…

hfs通过stunnel实现https访问

hfs通过stunnel实现https访问 REF:官方文档&#xff0c;有点老旧 https://blog.51cto.com/u_15015155/2554641 步骤 下载stunnel工具 download (笔者用的是windows的) 下载stunnel途中会进行本地证书的制作&#xff08;也可以用openssl自定义证书&#xff09;&#xff0c;如…

C++ 适配器

适配器 适配器是一种设计模式&#xff0c;我们最终实现的功能可以通过不同的路径来实现&#xff0c;那么这个路径就可以称作适配器。 例如下面的例子&#xff1a; 那么在c中也有适配器&#xff0c;例如stack、queue、priority_queue&#xff0c;它们并不是使用了什么新的内存…

【python爬虫】利用Python爬取天气数据,并做可视化分析

首先登录网站&#xff0c;查看网页内容及数据格式(使用代码查看内容)&#xff0c;选择两个城市及对应月份&#xff0c;爬取对应天气数据&#xff0c;进行数据预处理(如缺失值处理、数据类型转换、字符串截取等)&#xff0c;数据的初步探索性分析(如描述性统计、数据可视化查看数…

应对猫咪掉毛挑战,希喂、小米热门宠物空气净化器实测功效PK

随着养宠人群的增多&#xff0c;铲屎官们的需求日益增长&#xff0c;市场上出现了很多品牌的宠物空气净化器。然而&#xff0c;产品质量参差不齐&#xff0c;给消费者选择带来不少困难。劣质宠物空气净化器不仅无法有效去除宠物毛发、皮屑、异味及空气中的有害微粒&#xff0c;…

启动虚拟机:另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘xxx或它所依赖的某个快照磁盘

theme: nico 你们好&#xff0c;我是金金金。 场景 启动虚拟机时报错如下 造成error的原因 这是一种虚拟机的保护机制 虚拟机在运行时&#xff0c;为了防止数据被篡改&#xff0c;会将所运行的文件保护起来。 当虚拟机突然崩溃或强制结束导致异常退出&#xff08;我昨天是直接…

【C++】设计模式 — 从零开始认识单例模式

人的一生本来就是一场有来无回的冒险。 --- priest 《残次品》--- 设计模式 — 单例模式 1 设计模式2 单例模式2.1 饿汉模式2.2 懒汉模式 3 总结 1 设计模式 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结…