应广大用户需求,OpenAI 终于发布重量级新功能。
JavaScript 对象表示法(JSON)的文件与数据交换格式已然成为行业标准,因为其既适合人类阅读,又可轻松被机器解析处理。
然而,众所周知大语言模型(LLM)在 JSON 这边出了不少问题——最重要的就是经常产生幻觉,即生成仅部分遵循指令的奇怪响应,或者无法完全解析 JSON 内容。面对此类情况,开发者往往需要借助开源工具、多种不同提示词组合或者重复请求等方法以保证输出的互操作性。
如今,OpenAI 已经通过在 API 中发布其结构化输出来帮助缓解上述问题。此项功能已经于今天正式发布,旨在确保模型生成的输出与 JSON 模式相匹配。这些模式之所以如此重要,就是因为其描述了给定 JSON 文档中的内容、结构、数据类型以及预期约束。
OpenAI 表示,这也是开发者们长期呼吁开放的头号功能,允许在各类应用程序之间保持一致性。OpenAI 公司 CEO Sam Altman 也在 X 上发帖表示,此次发布“迎合了广大用户的迫切需求”。
该公司还强调,其最新 GPT-4o 模型的结构化输出获得了“100% 的完美”评估得分。
从开源项目中汲取灵感
JSON 是一种用于数据存储和交换的文本类格式,凭借着突出的简单性、灵活性以及与多种编程语言的兼容性而在开发者中成为最具人气的数据格式之一。OpenAI 在去年的 DevDay 上就为其模型发布了 JSON 模式,迅速满足了开发者提出的诉求。
借助 API 中的结构化输出,开发人员可以约束 OpenAI 模型以匹配数据模式。OpenAI 方面表示,这项功能还使得模型能够更好地理解较为复杂的数据模式。
该公司在博文中写道,“结构化输出代表着 JSON 模式的演变。虽然两者都能保证生成有效的 JSON,但只有结构化输出能够确保遵循数据模式。”也就是说,开发人员“不必担心模型会遗漏掉必要的键,或者以幻觉的形式生成无效的枚举值。”(枚举值是一种在语言当中命名常量的过程,旨在改善代码的可读性和可维护性。)
开发人员可以要求结构化输出以分步方式生成答案,用以引导输出按照预期路线前进。根据 OpenAI 的介绍,开发人员无需验证或者重试格式不正确的响应,该功能还支持更简单的提示词,同时提供明确的拒绝表述。
该公司还在博文中强调,“安全是 OpenAI 的首要任务——新的结构化输出功能也将遵循我们的现有安全政策,且依然允许模型拒绝不安全的请求。”
结构化输出适用于 GPT-4o-mini、GPT-4o 以及这些模型的微调版本,同时可用于 Chat Completions API、Assistant API 和 Batch API,而且兼容视觉输入。
OpenAI 方面强调,这项新功能“是从开源社区的优秀工作中汲取到的灵感,包括 outlines、jsonformer、instructor、guidance 以及 lark 库。”
OpenAI 提到的这些开源项目基本都是专门做大模型结构化输出的,其中 outlines 目前有 7.5k 星,作者在 GitHub 页面称已经“创办了一家公司,不断突破结构化生成的界限。”另外,jsonformer 有 4.1k 星、instructor 有 7k 星......
OpenAI 在其 API 中引入原生结构化输出支持,通过原生实现此项功能,OpenAI 可以在生成过程中严格控制大模型,从而保证其 100% 符合所指定的模式。以往,用户必须使用开放模式并对生成过程加以干预才能达成这个目标。值得注意的是,Cohere 最近同样将结构化生成引入其 API。
此前,虽然很多人还没有意识到这就是使用大模型的最佳技术,但他们在日常应用时已经在不知不觉中依赖相应的社区库。
因此有网友认为这些社区项目基本上可能等于“白做了”,“理解大模型的能力边界真的很重要,不然很有可能做很多无用功。”
但同时需要提醒各位,目前 OpenAI 的这套 beta 测试版恐怕满足不了大多数实际应用需求,理由如下:
生成首个 token 的速度太太太慢了。由于 OpenAI 需要将模式编译为语法以用于生成,因此初始开销导致每次调用都会耗费大量时间。OpenAI 后续其实也可以通过更快的编译和对重复使用的模式加以缓存来克服这个问题,但至少目前这项功能在很大程度上还不可用。其 API 能够接受的 JSON 模式仍然有限。OpenAI 声称他们专注于核心用例,而忽略掉了不必要的“长尾”附加功能。有网友尝试把现有代码迁移到这种新格式时,发现很多模式都不被接受。至少大家还需要调整习惯,才能配合 JSON 子集正常使用具备此项功能。此次发布的 Python SDK 实际上并不包含文档当中宣传的所有变更。具体来讲,其目前还不支持将 Pydantic BaseModel 子类定义为模式并进行传递。相信未来的版本将有所改进。但这再次提醒我们,OpenAI 发布的仍然只是一项 beta 测试版功能。
那我们到底该怎么办?有开发者认为 Instructor + Pydantic 的组合仍然是在 OpenAI 乃至其他大模型方案之上实现结构化输出的最简单方法。虽然无法保证生成结果的合规性(如果无法控制大模型本身,就不可能实现这种合规性),但其会使用响应模型的定义来验证结果,甚至能够在遇到验证错误时根据提示信息进行重试。
很高兴看到 OpenAI 能意识到结构化输出的强大功能,并将其纳入 API 当中,相信在未来一段时间内,这也将成为软件开发者们将大模型集成至自有代码中的主要方式。只是从前期探索到最终落地,中间恐怕还需要再观察一段时间。
参考链接:
https://venturebeat.com/business/transform-2024-dont-miss-the-6th-annual-women-in-ai-breakfast-women-in-ai-awards/
https://everything.intellectronica.net/p/structured-outputs-big-time