Azure Databricks 上的结构化输出

重要

此功能以公共预览版提供,在基础模型 API 按令牌付费和预配的吞吐量终结点上都受支持。

本文介绍 Azure Databricks 上的结构化输出,以及如何将它们用作生成 AI 应用程序工作流的一部分。 结构化输出与 OpenAI 兼容,仅在作为基础模型 API一部分的模型服务期间可用。

什么是结构化输出?

结构化输出提供了一种方法,以 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-meta-llama-3-1-70b-instruct",
    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-meta-llama-3-1-70b-instruct",
    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 架构以获得更好的结果。