Dane wyjściowe ze strukturą w usłudze Azure Databricks

Ustrukturyzowane dane wyjściowe w Azure Databricks pozwalają generować odpowiedzi w określonym formacie JSON jako część workflow aplikacji AI. Pracują z dowolnym obsługiwanym modelem czatu za pomocą pola response_format. Używasz tego samego formatu żądania niezależnie od dostawcy modelu. Azure Databricks obsługuje wszelkie tłumaczenia specyficzne dla dostawcy, więc nie musisz używać natywnego formatu ustrukturyzowanych danych wyjściowych danego dostawcy.

Tip

Genie Code może to zrobić za Ciebie. Wypróbuj ten przykładowy monit:

Query the databricks-gpt-oss-20b model with a JSON schema response format to extract title, authors, abstract, and keywords from a research paper description. Note: this model returns content as a list of blocks; extract the block with type "text" and parse it.

Co to są dane wyjściowe strukturyzowane?

Dane wyjściowe ze strukturą umożliwiają generowanie danych strukturalnych w postaci obiektów JSON na podstawie danych wejściowych. Możesz wygenerować tekst, obiekty JSON bez struktury i obiekty JSON zgodne z określonym schematem JSON. Dane wyjściowe o ustalonej strukturze są obsługiwane przez modele czatu korzystające z interfejsów API modeli bazowych, które działają na zasadzie opłat za token oraz przez aprowizowane punkty końcowe wydajności.

Usługa Databricks zaleca używanie danych wyjściowych ze strukturą w następujących scenariuszach:

  • Wyodrębnianie danych z dużych ilości dokumentów. Na przykład identyfikowanie i klasyfikowanie opinii o recenzji produktu jako negatywne, pozytywne lub neutralne.
  • Zadania wnioskowania wsadowego, które wymagają danych wyjściowych w określonym formacie.
  • Przetwarzanie danych, takie jak przekształcanie danych bez struktury na dane ustrukturyzowane.

Używanie danych wyjściowych ze strukturą

Określ ustrukturyzowane dane wyjściowe przy użyciu response_format w żądaniu czatu. Zobacz Odniesienie do modelu Foundation API REST.

Poniżej przedstawiono przykład wyodrębniania danych dokumentów badawczych do określonego schematu 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))

Poniżej przedstawiono przykład wyodrębniania JSON, ale schemat JSON nie jest znany wcześniej.

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))

Schemat JSON

Interfejsy API modeli bazowych szeroko wspierają ustrukturyzowane dane wyjściowe akceptowane przez OpenAI. Jednak użycie prostszego schematu JSON dla definicji schematu JSON powoduje generowanie JSON o wyższej jakości. Aby podwyższyć jakość generowania, interfejsy API modelu fundacyjnego obsługują tylko podzestaw specyfikacji schematu JSON .

Następujące klucze definicji wywołań funkcji nie są obsługiwane:

  • Wyrażenia regularne wykorzystujące pattern.
  • Złożone zagnieżdżanie lub komponowanie schematów i ich walidacja przy użyciu: anyOf, oneOf, allOf, prefixItems lub $ref.
  • Listy typów z wyjątkiem specjalnego przypadku [type, “null”], w którym jeden typ na liście jest prawidłowym typem JSON, a drugi jest "null"

Ustrukturyzowane wyniki z modelami Anthropic Claude

Poniższy przykład wyodrębnia dane do konkretnego schematu JSON za pomocą modelu Claude'a. Jedyną zmianą względem poprzednich przykładów jest wartość model .

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-claude-sonnet-4-5",
    messages=messages,
    response_format=response_format
)

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

Modele Claude'a mają dodatkowe ograniczenia dotyczące ustrukturyzowanych danych wyjściowych. Zobacz sekcję Ograniczenia.

Użycie tokenu

Iniekcja monitów i inne techniki są używane w celu zwiększenia jakości ustrukturyzowanych danych wyjściowych. Ma to wpływ na liczbę tokenów wejściowych i wyjściowych używanych przez model, co z kolei powoduje implikacje dotyczące rozliczeń.

Ograniczenia

  • Maksymalna liczba kluczy określonych w schemacie JSON wynosi 64.
  • Interfejsy API modelu foundation nie wymuszają ograniczeń dotyczących długości ani rozmiaru obiektów i tablic.
    • Obejmuje to słowa kluczowe, takie jak maxProperties, minPropertiesi maxLength.
  • Silnie zagnieżdżone schematy JSON powodują generowanie niższej jakości. Jeśli to możliwe, spróbuj spłaszczać schemat JSON, aby uzyskać lepsze wyniki.

Modele Anthropic Claude mają następujące dodatkowe ograniczenia dla wyników strukturalnych:

  • Obsługiwany jest tylko typ json_schema ustrukturyzowanego wyjścia. json_object nie jest obsługiwana. Dla wyjścia bez ograniczeń pomijamy response_format.
  • Ustrukturyzowane dane wyjściowe nie są obsługiwane przez streaming. Ustaw stream na false, gdy określisz response_format
  • Parametr response_format dla wyjść strukturalnych Claude'a nie może być połączony ani z tools, ani z tool_choice.
  • databricks-claude-opus-5-5, databricks-claude-sonnet-5-5, databricks-claude-haiku-5-5 oraz databricks-claude-fable-5-1 nie obsługują response_format w interfejsie API Chat Completions. Żądanie określające response_format dla tych modeli zwraca błąd HTTP 400. Dla Opus 5.5, Sonnet 5.5 i Haiku 5.5 użyj zamiast tego pola formatoutput_config z API Anthropic Messages.
  • Przy databricks-claude-opus-5 żądanie może zwrócić odpowiedź z finish_reason ustawioną na content_filter, jeśli model odrzuci żądanie wyjścia strukturalnego. W takim przypadku wyjście może nie być zgodne ze schematem. Sprawdź finish_reason zanim przeanalizujesz wynik.