Azure Databricks での構造化された出力
重要
この機能は Public Preview であり、Foundation Model API のトークンごとの支払いエンドポイントとプロビジョニング済みスループット エンドポイントの両方でサポートされています。
この記事では、Azure Databricks の構造化された出力と、それらを生成 AI アプリケーション ワークフローの一部として使用する方法について説明します。 構造化された出力は OpenAI 互換であり、 Foundation Model API の一部として機能するモデル中にのみ使用できます。
構造化された出力とは
構造化出力は、入力データから 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-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 スキーマ
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 スキーマをフラット化してみてください。