この記事では、Azure Databricks の構造化された出力と、それらを生成 AI アプリケーション ワークフローの一部として使用する方法について説明します。 構造化出力は、構造化モデルをサポートする OpenAI モデルで動作します。
構造化された出力とは
構造化出力は、入力データから JSON オブジェクトの形式で構造化データを生成する方法を提供します。 テキスト、非構造化 JSON オブジェクト、および特定の JSON スキーマに準拠する JSON オブジェクトを生成することを選択できます。 構造化された出力は、Foundation Model API の従量課金制とプロビジョニング済みスループット エンドポイントを使用して提供されるチャット モデルでサポートされます。
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-3-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-3-70b-instruct",
messages=messages,
response_format=response_format
)
print(json.dumps(response.choices[0].message.model_dump()['content'], indent=2))
JSON スキーマ
Foundation Model API は、OpenAI によって受け入れられる構造化された出力を幅広くサポートします。 ただし、JSON スキーマ定義に対してより単純な JSON スキーマを使用すると、高品質の JSON 生成が行われます。 より高品質な生成を促進するために、基盤モデル API では JSON スキーマ仕様のサブセットのみがサポートされています。
次の関数呼び出し定義キーはサポートされていません。
-
pattern
を使用した正規表現。 - 次を使用した複雑なネストやスキーマの構成と検証:
anyOf
、oneOf
、allOf
、prefixItems
、または$ref
。 - リスト内の1つのタイプが有効な JSON タイプで、もう1つのタイプが
[type, “null”]
である"null"
という特殊なケースを除いたタイプのリスト。
トークンの使用法
迅速な挿入やその他の手法を使用して、構造化された出力の品質を向上させます。 これを行うと、モデルによって消費される入力トークンと出力トークンの数に影響し、結果として課金に影響が生じます。
制限事項
- JSON スキーマで指定されたキーの最大数が
64
。 - 基盤モデル API では、オブジェクトと配列の長さやサイズの制約は適用されません。
- これには、
maxProperties
、minProperties
、maxLength
などのキーワードが含まれます。
- これには、
- 入れ子になった JSON スキーマが多く、結果として品質が低下します。 可能であれば、より良い結果を得るために、JSON スキーマをフラット化してみてください。