在人工智能和大语言模型(LLM)的应用中,如何高效、可靠地从模型输出中提取结构化数据,成为了一个至关重要的课题。本篇文章将介绍 GitHub 高星开源库 Outlines,并分析它如何帮助开发者解决大模型在生成结构化数据时面临的挑战。我们将探讨大模型的非结构化输出给 AI 应用带来的问题、结构化输出的好处,以及 Outlines 如何有效地提升模型的可靠性和性能。
1. 大模型的非结构化输出带来的问题
1.1 问题
大语言模型(LLM)具有强大的文本生成能力,但在生成结构化数据时表现不够可靠。这对以 Agent 为核心的 AI 应用造成了严重的困扰。
核心问题
- 输出不一致性:当从邮件中提取航班信息时,理想情况是输出一致的 JSON 对象,但 LLM 往往失败,导致诸如 “JSON decode errors” 的问题。
- 缺乏可靠性:这种不可预测性使得基于 LLM 构建复杂模块化系统变得困难。
影响
没有可靠的结构化输出,开发者需要通过繁琐的后处理(如正则表达式)提取信息,导致开发效率低下且易出错。
1.2 结构化输出的好处
数据的普遍结构性
即使是看似无结构的数据(如 GSM 数据集),也常常有内在的结构可利用。
保证输出格式
通过定义特定的结构(如 JSON 或正则表达式),可以保证输出的有效性,避免繁琐的后处理。
提升性能与效率
- 提升 JSON 有效率:使用结构化生成后,JSON 有效率从 17.7% 提升至 99.9%。
- 减少示例需求:在 GSM8K 基准测试中,一次性结构化生成的性能几乎与八次非结构化生成相当。
- 提升开放模型性能:在函数调用基准测试中,性能从 86% 提升至 96.5%,甚至超越 GPT-4。
1.3 结构化输出与非结构化输出的对比
为了更好地理解结构化输出的优势,我们可以通过以下例子来对比结构化与非结构化输出的差异。
假设我们需要从一封电子邮件中提取航班信息:
非结构化输出
当大模型生成的输出没有严格的格式时,可能会得到如下文本:
飞往巴黎的航班在下周二,可能是早上10点,飞机是法国航空。
这个输出虽然包含了我们需要的信息(目的地、日期、时间、航空公司等),但它并没有明确的结构。要从中提取这些信息,开发者需要使用正则表达式或其他文本处理方法来解析每个字段,这既繁琐又容易出错。例如,模型有可能在不同的输入中给出不同格式的输出,导致系统处理时出错或出现“JSON decode errors”。
结构化输出
如果使用结构化生成,模型将返回符合预定义格式的数据,例如:
{