通过 JSON 输出增强 AI 模型的提示工程

通过 JSON 输出增强 AI 模型的提示工程

关键亮点

JSON 对于 LLM 应用至关重要,能够提供结构化输出,确保一致性、数据提取和无缝集成。像 Pydantic 和 API 这样的工具增强了模式验证和可维护性。

尽管有诸多好处,JSON 也存在部分模式支持、令牌限制和潜在的内容幻觉等局限。理解其优势和约束对于构建高效、智能的系统至关重要。

Novita AI 即将为每个 LLM 推出能力描述,您可以直接在模型库中查看。

在现代应用开发中——尤其是随着先进大语言模型(LLM)的兴起——可预测且结构化的数据交换变得越来越重要。尽管 LLM 擅长生成自然语言,但许多用例要求其输出符合特定格式,以确保与其它系统、数据库或流程的平滑集成。这就引出了结构化输出的概念,其中 JSON(JavaScript 对象表示法)已成为定义和强制这些结构的首选格式。本文将深入探讨用于结构化数据的 JSON 输出的本质,突出其优势、应用和局限性。

什么是结构化输出的 JSON 输出?

json output

来自 Langchain

JSON 简介

JSON 结构化输出是一种与大语言模型(LLM)配合使用的技术,用于确保模型的响应符合预定义的模式(通常以 JSON 格式表示)。

  • 向 LLM 提供 期望输出结构的详细描述,包括:
    • 字段
    • 数据类型
    • 约束条件

利用工具进行实现

Pydantic(一个 Python 库)这样的工具可用于:

  • 使用类型提示定义模式。
  • 将这些模式转换为 JSON 模式。

使用 Pydantic 等工具的好处:

  • 确保结构化输出。
  • 提高代码的可读性和可维护性。

利用 API 进行实现

  • 一些 API(如 OpenAI 的 ChatCompletions API)允许开发人员通过支持 JSON 模式功能来强制结构化输出。
  • 这些 API 可以提供不同级别的功能:
    • 例如,OpenAI 的 API 支持 JSON 模式功能的有限子集
    • 其他 API 可能提供更广泛的模式支持。

OpenAI 示例

输入:

from pydantic import BaseModel
from openai import OpenAI

client = OpenAI()

class Step(BaseModel):
    explanation: str
    output: str

class MathReasoning(BaseModel):
    steps: list[Step]
    final_answer: str

completion = client.beta.chat.completions.parse(
    model="gpt-4o-2024-08-06",
    messages=[
        {"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},
        {"role": "user", "content": "how can I solve 8x + 7 = -23"}
    ],
    response_format=MathReasoning,
)

math_reasoning = completion.choices[0].message.parsed

输出:

{
  "steps": [
    {
      "explanation": "Start with the equation 8x + 7 = -23.",
      "output": "8x + 7 = -23"
    },
    {
      "explanation": "Subtract 7 from both sides to isolate the term with the variable.",
      "output": "8x = -23 - 7"
    },
    {
      "explanation": "Simplify the right side of the equation.",
      "output": "8x = -30"
    },
    {
      "explanation": "Divide both sides by 8 to solve for x.",
      "output": "x = -30 / 8"
    },
    {
      "explanation": "Simplify the fraction.",
      "output": "x = -15 / 4"
    }
  ],
  "final_answer": "x = -15 / 4"
}

JSON 格式能带来哪些好处?

https://youtu.be/jw\_lL6SJQZg

JSON(JavaScript 对象表示法)广泛应用于结构化输出和数据交换,在现代应用开发中提供了诸多优势。以下是其主要好处的简要概述:

1. 可预测且一致的输出

  • JSON 确保输出严格遵循预定义模式,消除了变体,使下游系统能够更可靠地处理数据。
  • 严格的模式遵循减少了 LLM 生成意外或“幻觉”字段的可能性,确保结果一致且准确。

2. 可靠的数据提取和机器可读性

  • JSON 的结构化和层次化特性使其非常适合从输出中提取特定信息,无论是用于数据分析、报告还是集成到应用中。
  • 它易于被机器解析和处理,实现了无缝自动化和工作流。

3. 易于解析和集成

  • JSON 轻量级、基于文本的格式既便于人类阅读,也便于机器解析,增强了易用性。
  • 大多数现代编程语言原生支持 JSON 或通过库支持,简化了集成。例如:
    • Pythonjson 模块
    • Goencoding/json
    • Node.js:内置 JSON 对象
    • Java:Jackson 和 Gson 库
    • ASP.NETSystem.Text.JsonNewtonsoft.Json
    • Rubyjson

4. 模式定义和验证

  • JSON Schema 提供了定义输出预期结构和数据类型的标准化方式。
  • 验证确保输出符合预定义模式,能够自动检测错误并防止格式错误的数据。

5. 可选参数的灵活性

  • JSON 支持可选字段,允许在模式设计中保持灵活性。
  • 像 Python 中的 Pydantic 这样的工具允许开发人员使用可选类型注解定义模式,处理某些字段可能不存在的情况。

6. 高效性和性能

  • JSON 的极简语法确保了数据表示的紧凑性和高效性,使其非常适合带宽受限的环境。
  • 在像 Baseten 这样的实现中,为模式预计算令牌掩码可以最小化后续调用的延迟,进一步提高性能。

7. 互操作性和可扩展性

  • JSON 与广泛的编程语言、框架和工具兼容,确保跨不同系统和平台的无缝集成。
  • 其灵活的结构允许开发人员扩展或修改数据格式,而不会破坏现有工作流或兼容性。

8. 与 API 和数据库的集成

  • JSON 是许多现代 API 的默认数据格式,实现了客户端和服务器之间一致且可预测的通信。
  • 许多数据库(如 MongoDB、PostgreSQL)也原生支持 JSON,使其能够高效地存储和检索结构化数据。

9. 人类可读的格式

JSON 简单直观的结构使开发人员和非技术利益相关者都能轻松阅读和理解,简化了调试和协作。

通过结合 可预测性 高效性 易用性 ** 和 ** 灵活性,JSON 已成为现代应用开发的基石。它能够强制执行结构化输出、确保可靠的数据交换,并与工具、API 和数据库无缝集成,使其成为开发人员和组织不可或缺的格式。

JSON 格式的应用

JSON 结构化输出的用途广泛,并在各个领域持续增长:

1. 网页抓取

  • 从网页中提取特定元素(如标题、段落、链接和图像),并以结构化的 JSON 格式呈现。

2. 文本数据提取

  • 将非结构化文本转换为结构化的 JSON 对象,用于信息检索、数据分析或内容组织等任务。

3. 构建聊天机器人和对话代理

  • 确保聊天机器人响应符合预定义的 JSON 结构,尤其是在与后端系统或 API 集成时。

Novita AI 已为每个 LLM 推出能力描述,您可以直接在控制台文档中查看。

选择您的模型

JSON 格式的局限性

尽管 JSON 在结构化输出方面具有优势,但也存在一些局限性:

1. JSON Schema 部分支持

  • 一些 LLM API(如 OpenAI 的 ChatCompletions API)仅支持完整 JSON Schema 规范的一个子集。例如,数字的 minimummaximum 或数组的 minItemsmaxItems 等功能可能不受支持,限制了您可以施加的约束。

2. 格式化限制

  • 某些格式规范(如 Pydantic 模式中的日期时间格式)可能无法直接被 API 处理,需要额外的后验证步骤。

3. 可能出现幻觉

  • 虽然 JSON 确保输出的结构,但结构化字段中的内容仍可能产生幻觉。例如,产品 ID 可能格式正确为字符串,但 ID 本身可能是无效或无意义的。

4. 输出令牌限制

  • JSON 输出受 LLM 令牌限制(例如 OpenAI 模型有 16,384 令牌上限)。如果结构化输出超出限制,可能会被截断,导致无效的 JSON。

5. 模式复杂性限制

  • 嵌套较深且包含大量对象属性的模式可能导致 API 错误。建议保持模式相对扁平简单,以获得更好的性能并避免错误。

6. 动态模式能力有限

  • 高度动态或任意的模式(例如键值对列表,其中键未预定义)很难用结构化输出实现。在这种情况下,在系统提示中使用标准 JSON 模式并附带指令可能更有效。

7. 延迟开销

  • 处理结构化模式可能会给初始请求引入延迟,因为模式需要被处理并可能缓存。

8. 缺少原生注释

  • JSON 不支持数据中的注释,这可能会使复杂结构在没有外部文档的情况下更难理解。

JSON 是现代应用开发中使用 LLM 的基石,为结构化输出提供了一种强大且广泛采用的格式。通过强制执行预定义模式,它确保了一致性,方便了数据提取,并简化了跨系统的集成。尽管存在像 JSON Schema 部分支持和潜在内容幻觉等局限性,但其可预测性、易用性和兼容性使其成为构建智能、集成应用不可或缺的工具。清晰理解其优势和约束对于优化基于 LLM 的解决方案至关重要。

常见问题

结构化输出结合 JSON 是否保证无错误?

虽然结构化输出保证响应是一个符合模式的有效 JSON 对象,但 不能保证该结构内内容的准确性或有效性。幻觉仍可能发生。

使用结构化输出结合 JSON 是否会减慢 LLM 的响应速度?

最初处理模式时可能会有轻微的 延迟开销。然而,在某些实现中,由于缓存和其他优化,这种开销在最初几次请求后会最小化。

JSON 模式和 JSON Schema 模式有什么区别?

在 **JSON 模式 ** 中,您指示 LLM 返回一个有效的 JSON 对象,但不指定详细模式。在 JSON Schema 模式 中,您提供一个特定的 JSON 模式,LLM 被迫在其输出中遵循该结构。

Novita AI 是一个一体化云平台,助力您的 AI 雄心。集成 API、无服务器、GPU 实例——您所需的经济高效工具。消除基础设施,免费开始,让您的 AI 愿景成为现实。

推荐阅读