다음을 통해 공유


Azure Databricks의 구조적 출력

Important

이 기능은 공개 미리 보기제공되며, 토큰당 종량제 및 프로비전된 처리량 엔드포인트 모두에서 지원됩니다.

이 문서에서는 Azure Databricks의 구조화된 출력과 이를 생성 AI 애플리케이션 워크플로의 일부로 사용하는 방법을 설명합니다. 구조적 출력은 OpenAI와 호환되며 파운데이션 모델 API의 일부로 사용되는 모델 중에만 사용할 수 있습니다.

구조화된 출력이란?

구조적 출력은 입력 데이터에서 JSON 개체의 형태로 구조화된 데이터를 생성하는 방법을 제공합니다. 텍스트, 구조화되지 않은 JSON 개체 및 특정 JSON 스키마를 준수하는 JSON 개체를 생성하도록 선택할 수 있습니다. 구조적 출력은 토큰당 종량제 및 프로비전된 처리량 엔드포인트를 사용하여 제공되는 채팅 모델에 대해 지원됩니다.

Databricks는 다음 시나리오에 대해 구조화된 출력을 사용하는 것이 좋습니다.

  • 대량의 문서에서 데이터를 추출합니다. 예를 들어 제품 검토 피드백을 부정, 긍정 또는 중립으로 식별하고 분류합니다.
  • 출력이 지정된 형식이어야 하는 일괄 처리 유추 작업입니다.
  • 구조화되지 않은 데이터를 구조화된 데이터로 전환하는 것과 같은 데이터 처리입니다.

구조화된 출력 사용

채팅 요청에 사용하여 response_format 구조화된 출력을 지정합니다. Foundation 모델 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 생성이 발생합니다. 더 높은 품질의 생성을 촉진하기 위해 Foundation Model API는 JSON 스키마 사양의 하위 집합만 지원합니다.

다음 함수 호출 정의 키는 지원되지 않습니다.

  • pattern을 사용한 정규식.
  • 다음을 사용하는 복합 중첩 또는 스키마 컴퍼지션 및 유효성 검사: anyOf, oneOf, allOf, prefixItems, 또는 $ref.
  • 목록의 한 형식이 유효한 JSON 형식이고 다른 형식이 "null"인 특수한 경우 [type, “null”]를 제외한 형식 목록

토큰 사용량

프롬프트 주입 및 기타 기술은 구조화된 출력의 품질을 향상시키는 데 사용됩니다. 이렇게 하면 모델에서 사용하는 입력 및 출력 토큰의 수에 영향을 미치므로 청구에 영향을 줍니다.

제한 사항

  • JSON 스키마에 지정된 최대 키 수는 64입니다.
  • 파운데이션 모델 API는 개체 및 배열에 대한 길이 또는 크기 제약 조건을 적용하지 않습니다.
    • 여기에는 maxProperties, minPropertiesmaxLength와 같은 키워드가 포함됩니다.
  • 중첩된 JSON 스키마는 품질이 저하됩니다. 가능한 경우 더 나은 결과를 위해 JSON 스키마를 평면화해 봅니다.