​OpenAI全新结构化输出功能上线,LLM Agent的应用开发者狂喜!

by June 2024-08-07

本文由智领云 LeetTools 工具自动生成

原文链接:https://svc.leettools.com/#/share/leettools/research?id=bf0d8b74-4e0d-4962-b72d-efd232dc8d30

如果您想试用,请点击链接:https://svc.leettools.com?utm_source=officialwebsite

在当今快速发展的人工智能领域,OpenAI推出的结构化输出功能为开发者提供了一个强大的工具,以提高模型生成输出的可靠性和一致性。随着应用程序对结构化数据的需求不断增加,开发者们面临着从非结构化数据中提取和生成结构化数据的挑战。为了解决这一问题,OpenAI在其API中引入了结构化输出功能,使得模型生成的输出能够严格遵循开发者提供的JSON模式。这一新特性不仅提升了模型的可靠性,还简化了开发者在构建应用程序时的工作流程。

在过去,开发者们常常需要通过开源工具、提示和反复请求来确保模型输出符合所需的格式,而结构化输出功能的引入则有效地解决了这一问题。通过对模型进行训练,使其更好地理解复杂的JSON模式,OpenAI的最新模型在评估中表现出色,达到了100%的可靠性。这一研究报告将详细探讨结构化输出的实现方式、应用场景以及对开发者的潜在影响,旨在为开发者提供更高效的工具,以应对日益复杂的应用需求。

结构化输出的介绍

OpenAI最近推出的结构化输出功能旨在提高模型输出的可靠性和一致性。该功能的核心在于确保模型生成的输出能够严格遵循开发者提供的JSON模式,这一改进是基于开发者在构建应用程序时对可靠性和准确性的需求而设计的[1]。

结构化输出的主要目的是解决开发者在使用大型语言模型(LLM)时面临的挑战,尤其是在生成结构化数据方面。开发者通常需要从非结构化数据中提取信息,并将其转换为可用的格式,以便在应用程序中进行处理。通过引入结构化输出,OpenAI的模型能够更好地理解复杂的JSON模式,从而生成符合这些模式的输出。这一功能的实现使得开发者不再需要通过反复请求和调整提示来确保输出格式的正确性[1]。

结构化输出的好处包括:

  1. 提高可靠性:通过将模型的输出限制在开发者提供的模式内,结构化输出确保了生成的JSON数据的有效性。这种约束使得模型在生成输出时能够避免常见的错误,例如生成无效的JSON格式[1]。
  2. 简化开发流程:开发者可以通过简单地提供JSON模式来指导模型的输出,而不必担心模型会偏离预期的格式。这种简化的过程使得开发者能够更专注于应用程序的逻辑和功能,而不是花费大量时间在格式问题上[1]。
  3. 支持复杂数据结构:结构化输出能够处理复杂的嵌套和递归数据结构,这在许多应用场景中是至关重要的。与传统的有限状态机(FSM)方法相比,结构化输出使用上下文无关文法(CFG),能够更灵活地表达复杂的模式,从而提高了模型的适用性和准确性[1]。
  4. 安全性和拒绝机制:OpenAI在设计结构化输出时,始终将安全性放在首位。模型在面对不安全的请求时,仍然能够拒绝处理,并通过特定的返回值指示开发者。这种机制确保了在生成有效输出的同时,模型也能遵循安全政策[1]。

通过这些改进,结构化输出不仅提升了模型的输出质量,还为开发者提供了更强大的工具,以便在构建应用程序时能够更高效地处理数据。这一功能的推出标志着OpenAI在推动AI技术向更高可靠性和实用性发展的重要一步[1]。

如何使用结构化输出

开发者可以通过OpenAI API中的结构化输出功能,以多种方式利用结构化数据。这一功能确保模型生成的输出严格遵循开发者提供的JSON Schema,从而提高了应用程序的可靠性和一致性。

首先,开发者可以在函数定义中启用结构化输出。通过设置function参数,开发者可以定义一个工具,模型的输出将与该工具的定义相匹配。例如,开发者可以创建一个查询函数,帮助用户查找特定的订单信息:

def query_orders(user_id: str, month: str) -> List[Order]:
    # 查询订单的逻辑
    pass

当用户请求“查找我去年五月所有已完成但未按时交付的订单”时,模型将调用query_orders函数,并返回符合预期结构的JSON输出。

其次,开发者还可以通过response_format参数提供JSON Schema。这在模型不调用工具,而是以结构化方式响应用户时特别有用。例如,开发者可以定义一个数学问题的响应格式:

{
  "reasoning": "string",
  "final_answer": "number"
}

当用户询问“解决8x + 31 = 2”时,模型将根据提供的Schema返回结构化的输出,包括推理过程和最终答案。

此外,结构化输出还可以用于动态生成用户界面。开发者可以根据用户的意图生成不同的UI组件。例如,开发者可以定义一个UI组件的Schema,并根据用户输入生成相应的界面元素:

{
  "type": "UIComponent",
  "label": "string",
  "attributes": {
    "onClick": "string",
    "className": "string"
  }
}

通过这种方式,开发者可以创建一个“为园丁设计的登陆页面”或“电影评论的注册页面”,并根据用户的需求动态调整内容。

结构化输出还可以帮助开发者将最终答案与支持性推理或附加评论分开。这种方法可以提高响应的质量。例如,模型可以在回答“9.11和9.9,哪个更大?”时,提供推理步骤和最终答案的分离字段,从而使用户更容易理解。

最后,开发者可以利用结构化输出从非结构化数据中提取结构化信息。例如,模型可以被指示从会议记录中提取待办事项、截止日期和责任人。通过定义相应的Schema,开发者可以确保提取的数据符合预期格式。

总之,OpenAI API中的结构化输出功能为开发者提供了强大的工具,能够在多种场景下生成和处理结构化数据,从而提升应用程序的可靠性和用户体验。

动态生成用户界面

通过使用结构化输出,开发者可以根据用户的意图动态生成用户界面。这一功能的引入使得开发者能够创建更为灵活和响应迅速的应用程序,能够根据用户的具体需求生成相应的界面元素。例如,开发者可以利用结构化输出来构建代码或用户界面生成应用程序,这些应用程序能够根据用户输入的不同生成多种不同的用户界面。

一个具体的例子是,开发者可以创建一个用户界面助手,帮助用户可视化他们的网站和应用程序创意。当用户输入“为园丁设计一个登陆页面”时,系统可以生成一个包含园艺主题的登陆页面的HTML和CSS代码。这个页面可能包括标题、描述、服务项目等元素,所有这些都可以根据用户的输入动态生成[1]。

另一个用例是,当用户请求“为电影评论应用程序设计一个注册屏幕”时,系统可以生成一个包含注册表单的用户界面,表单中可能包括公司名称、输入框、按钮等元素。通过结构化输出,开发者可以确保生成的界面符合预设的JSON模式,从而保证输出的有效性和一致性[1]。

此外,结构化输出还可以用于将最终答案与支持性推理或附加评论分开。例如,在数学辅导的场景中,用户可能会询问“解决8x + 31 = 2”。系统不仅可以提供最终答案,还可以分步骤展示推理过程,帮助用户理解每一步的逻辑。这种分离的方式不仅提高了回答的质量,也使得用户界面更加清晰和易于理解[1]。

通过提取非结构化数据中的结构化信息,开发者还可以从会议记录中提取待办事项、截止日期和责任人等信息。这种能力使得用户能够快速获取关键信息,并在用户界面中以结构化的方式展示出来,提升了信息的可读性和可操作性[1]。

总之,结构化输出的引入为动态生成用户界面提供了强大的支持,使得开发者能够根据用户的意图灵活地创建各种界面,提升了用户体验和应用程序的响应能力。

从非结构化数据中提取结构化数据

在提取结构化数据的过程中,OpenAI的新结构化输出功能为开发者提供了强大的工具,能够从非结构化输入中生成符合特定JSON模式的结构化数据。这一功能的引入,旨在解决开发者在使用大型语言模型(LLMs)时所面临的输出不一致性问题[1]。

结构化输出的一个重要应用是动态生成用户界面。开发者可以根据用户的意图,利用结构化输出创建代码或用户界面生成应用。例如,开发者可以设计一个用户界面助手,帮助用户可视化他们的网站和应用想法。用户输入“为园丁创建一个登录页面”,模型可以生成相应的HTML和CSS代码,确保输出符合预设的结构化格式[1]。

另一个实际应用是从会议记录中提取结构化数据。开发者可以指示模型提取待办事项、截止日期和责任人等信息。例如,用户可以输入“从会议记录中提取行动项、截止日期和负责人”,模型将分析会议记录并返回一个结构化的JSON对象,列出所有行动项及其相关信息。这种方法不仅提高了数据处理的效率,还减少了人工干预的需要[1]。

为了确保模型生成的输出与开发者提供的JSON模式完全匹配,OpenAI采用了一种称为“约束采样”的技术。这种方法通过限制模型在生成输出时可选择的令牌,确保生成的内容始终符合预定的结构。这种动态约束解码的实现,使得模型能够在每一步生成后,实时判断哪些令牌是有效的,从而避免生成无效的JSON格式[1]。

此外,结构化输出还可以用于将最终答案与支持性推理或附加评论分开。这种方法可以提高响应的质量,使得用户不仅能获得最终答案,还能理解得出该答案的推理过程。例如,用户询问“9.11和9.9,哪个更大?”模型可以提供详细的推理步骤,并在最后给出明确的答案[1]。

总之,OpenAI的结构化输出功能通过提供可靠的JSON模式支持,极大地增强了从非结构化数据中提取结构化数据的能力。这一功能的应用范围广泛,从用户界面生成到数据提取,均展现了其在现代应用中的重要性和实用性。

模型输出的可靠性与安全性

OpenAI的新结构化输出功能在可靠性和安全性方面采取了多项措施,以确保生成的输出符合开发者提供的JSON模式。根据OpenAI的介绍,结构化输出功能的引入旨在解决模型输出与开发者需求之间的匹配问题,确保生成的结构化数据能够准确反映所需的格式[1]。通过对模型进行训练,使其更好地理解复杂的JSON模式,OpenAI的最新模型在评估中达到了100%的可靠性,显著提高了输出的准确性[1]。

在安全性方面,OpenAI始终将安全放在首位。结构化输出功能遵循现有的安全政策,能够拒绝不安全的请求。当模型拒绝处理某个请求时,API响应中会包含一个特定的字符串值,开发者可以通过该值程序化地检测到模型是否生成了拒绝,而不是输出符合模式的内容[1]。如果响应中没有拒绝信息,并且模型的响应没有被提前中断,那么模型的输出将可靠地产生符合所提供模式的有效JSON[1]。

为了确保输出的完整性,OpenAI采用了一种称为“约束采样”的技术。这种方法通过限制模型只能选择符合所提供模式的有效令牌,从而避免生成无效的JSON输出。这种动态约束解码的实现方式使得模型在生成每个令牌后,能够实时判断哪些令牌是有效的,从而降低生成无效令牌的概率[1]。此外,OpenAI还将JSON模式转换为上下文无关文法(CFG),以便在模型采样时高效地确定有效令牌[1]。

尽管结构化输出功能在提高可靠性和安全性方面取得了显著进展,但仍需注意一些限制。例如,模型在拒绝不安全请求时可能无法遵循模式,且在生成过程中可能会因达到停止条件而未能完成输出[1]]。此外,结构化输出不支持并行函数调用,这可能导致生成的输出与提供的模式不匹配[1]。因此,开发者在使用该功能时应考虑这些因素,以确保最佳的应用效果。

动态约束解码技术

动态约束解码技术在结构化输出中的应用,确保了生成的输出符合开发者提供的JSON模式。这一技术的核心在于通过动态约束来限制模型的输出,使其仅能选择符合特定模式的有效令牌,从而避免生成无效的JSON格式。

在传统的模型输出中,生成的内容是完全不受限制的,模型可以从词汇表中选择任何令牌作为下一个输出。这种灵活性虽然在某些情况下是有益的,但也容易导致错误,例如模型可能在不合适的时机生成大括号,从而导致输出不符合JSON格式。为了解决这一问题,动态约束解码技术通过将开发者提供的JSON模式转换为上下文无关文法(CFG),来动态地确定每个生成令牌后哪些令牌是有效的。

具体来说,在每次生成令牌后,推理引擎会根据已生成的令牌和文法规则,判断下一个有效的令牌。这种方法的优势在于,它能够处理复杂的嵌套或递归数据结构,而传统的有限状态机(FSM)方法在这方面存在局限性。例如,FSM通常无法表达递归类型,这使得在处理深度嵌套的JSON时可能会遇到困难。

此外,动态约束解码技术还通过预处理JSON模式,生成可供模型高效使用的缓存数据结构,从而在后续的输出生成中显著降低延迟。这种方法不仅提高了生成的可靠性,还确保了输出的有效性,使得开发者能够更轻松地构建与其系统兼容的应用程序。

总的来说,动态约束解码技术通过限制模型的输出选择,确保了生成的JSON输出的有效性,并在处理复杂模式时展现出明显的优势。这使得开发者能够更高效地利用OpenAI的API,构建出更为可靠和灵活的应用程序[1]。

开发者的最佳实践

在实现结构化输出时,开发者应遵循一些最佳实践,以确保应用程序的可靠性和有效性。首先,开发者应明确提供JSON Schema,以便模型生成的输出能够严格遵循该结构。这一做法可以有效避免因模型输出不符合预期格式而导致的错误[1]。

其次,开发者应注意将最终答案与支持性推理或附加评论分开。这种分离可以提高响应的质量,使得最终答案更加清晰明了。例如,可以为推理过程提供单独的字段,以便用户能够理解得出结论的步骤[1]。

在处理复杂的JSON Schema时,开发者应避免过于复杂的嵌套结构。虽然OpenAI的模型能够处理递归类型,但过于复杂的结构可能会导致模型在生成输出时出现问题。因此,简化Schema结构,确保其易于理解和处理是非常重要的[1]。

开发者还应注意,结构化输出功能在首次请求新Schema时可能会导致额外的延迟。这是因为系统需要处理Schema并生成相应的缓存数据结构。为了优化性能,建议在开发过程中尽量减少对新Schema的频繁请求,尤其是在开发初期[1]。

此外,开发者应意识到,模型可能会因拒绝不安全的请求而未能遵循Schema。在这种情况下,返回的消息中会包含一个布尔值,指示请求是否被拒绝。因此,开发者在设计应用时应考虑到这一点,并为可能的拒绝情况做好处理准备[1]。

最后,开发者应避免在并行函数调用中使用结构化输出,因为这可能导致输出不符合提供的Schema。如果需要并行处理,建议禁用并行函数调用,以确保输出的可靠性[1]。通过遵循这些最佳实践,开发者可以更有效地利用OpenAI的结构化输出功能,构建出更为可靠和高效的应用程序。

与开源社区的合作

开源社区在结构化输出的开发中发挥了重要的作用,提供了许多灵感和贡献。OpenAI的新结构化输出功能,特别是其与JSON模式的兼容性,得益于开源工具的广泛应用和开发者的反馈。开发者们长期以来一直在利用开源工具来解决大型语言模型(LLM)在生成结构化数据时的局限性,这些工具包括outlines、jsonformer、instructor、guidance和lark等库[1]。

这些开源库为开发者提供了强大的功能,使他们能够更有效地处理和生成结构化数据。例如,jsonformer库专注于将非结构化数据转换为结构化JSON格式,帮助开发者在构建应用时减少了手动处理数据的需求。通过使用这些工具,开发者能够更好地理解和利用模型的输出,从而提高应用的可靠性和效率[1]。

此外,instructor和guidance库为开发者提供了指导和示例,帮助他们更好地利用OpenAI的API进行开发。这些库的存在使得开发者能够快速上手,减少了学习曲线,促进了结构化输出功能的广泛应用[1]。开源社区的贡献不仅限于工具的开发,还包括对模型行为的深入理解和优化建议,这些都为OpenAI在结构化输出功能的实现上提供了宝贵的参考。

通过与开源社区的合作,OpenAI能够在结构化输出的实现中采用更为灵活和高效的技术方案。例如,动态约束解码技术的引入,使得模型在生成输出时能够遵循开发者提供的JSON模式,从而确保输出的有效性和一致性。这种技术的实现部分得益于开源社区在相关领域的研究和实践[1]。

总之,开源社区的贡献在结构化输出的开发中起到了不可或缺的作用,推动了这一功能的创新和完善。开发者们通过开源工具的使用,不仅提升了自身的开发效率,也为整个AI生态系统的进步做出了贡献。

留言

评论

${{item['author_name']}} 回复 ${{idToContentMap[item.parent] !== undefined ? idToContentMap[item.parent]['author_name'] : ''}} · ${{item.date.slice(0, 10)}} 回复

暂时还没有一条评论.