Azure Databricks 上的结构化输出

本文介绍 Azure Databricks 上的结构化输出,以及如何将它们用作生成 AI 应用程序工作流的一部分。 结构化输出适用于支持结构化模型的 OpenAI 模型。

什么是结构化输出?

结构化输出提供了一种方法,以 JSON 对象的形式从输入数据生成结构化数据。 可以选择生成符合特定 JSON 架构的文本、非结构化 JSON 对象和 JSON 对象。 使用基础模型 API 按令牌付费和预配的吞吐量终结点提供的聊天模型支持结构化输出。

Databricks 建议对以下方案使用结构化输出:

  • 从大量文档中提取数据。 例如,将产品评审反馈识别和分类为负面、积极或中性。
  • 需要输出的批处理推理任务采用指定格式。
  • 数据处理,例如将非结构化数据转换为结构化数据。

使用结构化输出

在聊天请求中使用你的结构化输出 response_format 。 请参阅 基础模型 REST API 参考

下面是将数据提取到特定 JSON 架构的示例。

import os
import json
from openai import OpenAI

DATABRICKS_TOKEN = os.environ.get('YOUR_DATABRICKS_TOKEN')
DATABRICKS_BASE_URL = os.environ.get('YOUR_DATABRICKS_BASE_URL')

client = OpenAI(
  api_key=DATABRICKS_TOKEN,
  base_url=DATABRICKS_BASE_URL
  )

response_format = {
      "type": "json_schema",
      "json_schema": {
        "name": "research_paper_extraction",
        "schema": {
          "type": "object",
          "properties": {
            "title": { "type": "string" },
            "authors": {
              "type": "array",
              "items": { "type": "string" }
            },
            "abstract": { "type": "string" },
            "keywords": {
              "type": "array",
              "items": { "type": "string" }
            }
          },
        },
        "strict": True
      }
    }

messages = [{
        "role": "system",
        "content": "You are an expert at structured data extraction. You will be given unstructured text from a research paper and should convert it into the given structure."
      },
      {
        "role": "user",
        "content": "..."
      }]

response = client.chat.completions.create(
    model="databricks-gpt-oss-20b",
    messages=messages,
    response_format=response_format
)

print(json.dumps(response.choices[0].message.model_dump()['content'], indent=2))

下面是一个 JSON 提取示例,但手头前不知道 JSON 架构。

import os
import json
from openai import OpenAI

DATABRICKS_TOKEN = os.environ.get('YOUR_DATABRICKS_TOKEN')
DATABRICKS_BASE_URL = os.environ.get('YOUR_DATABRICKS_BASE_URL')

client = OpenAI(
  api_key=DATABRICKS_TOKEN,
  base_url=DATABRICKS_BASE_URL
  )

response_format = {
      "type": "json_object",
    }

messages = [
      {
        "role": "user",
        "content": "Extract the name, size, price, and color from this product description as a JSON object:\n<description>\nThe SmartHome Mini is a compact smart home assistant available in black or white for only $49.99. It's 5 inches wide.\n</description>"
      }]

response = client.chat.completions.create(
    model="databricks-gpt-oss-20b",
    messages=messages,
    response_format=response_format
)

print(json.dumps(response.choices[0].message.model_dump()['content'], indent=2))

JSON 架构

基础模型 API 广泛支持 OpenAI 接受的结构化输出。 但是,将更简单的 JSON 架构用于 JSON 架构定义会导致生成更高质量的 JSON。 为了提高生成质量,基础模型 API 仅支持 JSON 架构规范的子集。

不支持以下函数调用定义键:

  • 使用 pattern 的正则表达式。
  • 使用以下方法进行复杂的嵌套或架构组合和验证:anyOfoneOfallOfprefixItems$ref
  • 类型列表,但 [type, “null”] 的特殊情况除外,其中列表中的一种类型是有效的 JSON 类型,另一种类型是 "null"

令牌使用情况

提示注入和其他技术用于提高结构化输出的质量。 这样做会影响模型消耗的输入和输出令牌数量,进而导致计费问题。

限制

  • JSON 架构中指定的最大键数为 64
  • 基础模型 API 不强制执行对象和数组的长度或大小约束。
    • 这包括 maxPropertiesminPropertiesmaxLength 等关键字。
  • 大量嵌套的 JSON 架构会导致质量较低的生成。 如果可能,请尝试平展 JSON 架构以获得更好的结果。
  • 人类 Claude 模型只能接受 json_schema 结构化输出。 不支持 json_object