メインコンテンツまでスキップ

構造化された出力を生成します

備考

ベータ版

この機能はベータ版です。アカウント管理者は、アカウント コンソールの [プレビュー] ページからこの機能へのアクセスを制御できます。 Databricksのプレビューを管理するを参照してください。

この記事では、Databricksの構造化出力と、それを生成AIアプリケーションワークフローの一部として使用する方法について説明します。構造化出力は、構造化モデルをサポートするOpenAIモデルで動作します。

構造化出力とは何ですか?

構造化出力は、入力データから JSON オブジェクトの形式で構造化データを生成する方法を提供します。テキスト、非構造化 JSON オブジェクト、および特定の JSON スキーマに準拠する JSON オブジェクトを生成することを選択できます。構造化出力は、Unity AI Gateway のモデル サービスによって提供されるチャット モデルでサポートされています。

Databricks では、以下のシナリオで構造化された出力を使用することをお勧めします。

  • 大量のドキュメントからデータを抽出する。例えば、製品レビューのフィードバックを否定的、肯定的、または中立として識別および分類する。
  • 出力を指定した形式にする必要があるバッチ推論タスク。
  • データ処理 (非構造化データを構造化データに変換するなど)。

構造化された出力を使用する

チャットリクエストでresponse_formatを使用して、構造化された出力を指定してください。「基盤モデル REST API リファレンス」を参照してください。

特定のJSONスキーマへの研究論文のデータ抽出の例を以下に示します。

Python
import os
import json
from openai import OpenAI

client = OpenAI(
api_key=os.environ.get('DATABRICKS_TOKEN'),
base_url="https://<workspace-url>/ai-gateway/mlflow/v1"
)

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="system.ai.gpt-oss-20b",
messages=messages,
response_format=response_format
)

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

以下はJSON抽出の例ですが、JSONスキーマは事前にわかっていません。

Python
import os
import json
from openai import OpenAI

client = OpenAI(
api_key=os.environ.get('DATABRICKS_TOKEN'),
base_url="https://<workspace-url>/ai-gateway/mlflow/v1"
)

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="system.ai.gpt-oss-20b",
messages=messages,
response_format=response_format
)

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

JSONスキーマ

モデルサービスは、OpenAI が受け入れる構造化された出力を広くサポートしています。ただし、JSON スキーマ定義に単純な JSON スキーマを使用すると、より高品質な JSON 生成が可能になります。より高品質な生成を促進するために、モデルサービスは JSON スキーマの仕様のサブセットのみをサポートしています。

次の関数呼び出し定義キーはサポートされていません:

  • patternを用いた正規表現。
  • 次の項目を使用した複雑なネストまたはスキーマの構成と検証: anyOfoneOfallOfprefixItems、または$ref
  • 型のリスト (ただし、リスト内の 1 つの型が有効な JSON 型で、もう 1 つが"null"である [type, “null”] の特殊なケースを除く) "null"

トークンの使用量

プロンプトインジェクションなどの手法は、構造化された出力の品質を向上させるために使用されます。そうすることで、モデルが消費する入出力トークンの数に影響を与え、その結果、課金に影響します。

制限事項

  • JSON schemaで指定できるキーの最大数は64です。

  • モデルサービスは、オブジェクトと配列の長さまたはサイズの制約を適用しません。

    • これには、maxPropertiesminPropertiesmaxLengthのようなキーワードが含まれます。
  • 深くネストされた JSON スキーマは、生成品質を低下させます。可能であれば、より良い結果を得るために JSON スキーマをフラット化してみてください。

  • Anthropic Claude モデルは、json_schema の構造化出力をのみ受け入れることができます。json_object はサポートされていません。