Azure Databricks での関数呼び出し
重要
この機能はパブリック プレビュー段階にあり、Foundation Model API のペイパートークンまたはプロビジョニングされたスループット エンドポイントでのみサポートされます。
この記事では、関数呼び出しと、それを生成 AI アプリケーション ワークフローの一部として使用する方法について説明します。 Databricks 関数呼び出しは OpenAI と互換性があり、Foundation Model API の一部としてモデル サービング中にのみ使用できます。
関数呼び出しとは
関数呼び出しは、LLM の出力を制御する方法を提供し、構造化された応答をより確実に生成します。 関数呼び出しを使用する場合は、JSON スキーマを使用して関数の引数を記述することにより、API 呼び出しで関数を記述します。 LLM 自体はこれらの関数を呼び出すのではなく、ユーザーがコード内の関数を呼び出すために使用できる JSON オブジェクトを作成します。
Databricks での関数呼び出しの場合、基本的なステップは次のとおりです。
- 送信されたクエリと
tools
パラメーターで定義された一連の関数を使用してモデルを呼び出します。 - モデルは、定義された関数を呼び出すかどうかを決定します。 関数が呼び出されると、そのコンテンツはカスタム スキーマに準拠した文字列の JSON オブジェクトになります。
- コード内で文字列を JSON に解析し、指定された引数が存在する場合はその引数を使用して関数を呼び出します。
- 構造化された応答を新しいメッセージとして追加して、モデルを再度呼び出します。 応答の構造は、以前に
tools
で指定した関数によって定義されます。 ここから、モデルは結果を集計し、その概要をユーザーに送信します。
関数呼び出しを使用するタイミング
以下は、関数呼び出しのユース ケースの例です。
- 他の API を呼び出して質問に回答できるアシスタントを作成します。 たとえば、
send_email(to: string, body: string)
やcurrent_weather(location: string, unit: 'celsius' | 'fahrenheit')
などの関数を定義できます。 - 自然言語に基づいて API 呼び出しを定義して使用します。 「私の主な顧客は誰ですか?」という質問を例に挙げてみましょう。 それを
get_customers(min_revenue: int, created_before: string, limit: int)
という名前の API 呼び出しにして、その API を呼び出します。 - 非構造化データを構造化データに変換します。 たとえば、製品レビューのフィードバックを否定的、肯定的、中立的として識別し、分類するなどです。
サポートされているモデル
重要
DBRX は、Databricks Open Model License (Copyright © Databricks, Inc.) の下で提供され、その対象となります。All rights reserved. お客様は、Databricks 利用規約を含む、該当するモデル ライセンスへのコンプライアンスを遵守する責任を負います。
Meta Llama 3.1 は LLAMA 3.1 Community License の下でライセンスされています (Copyright © Meta Platforms, Inc. All Rights Reserved.)。 お客様は、該当するモデル ライセンスへのコンプライアンスを遵守する責任を負います。
Databricks での関数呼び出しでは、トークンごとの支払いおよびプロビジョニングされたスループット ワークロードで次の Foundation Model API モデルがサポートされています。
リージョンの可用性については、「Foundation Model API の制限」を参照してください。
Databricks での関数呼び出しでは、プロビジョニングされたスループット ワークロードでのみ以下がサポートされます。
関数呼び出しを使用する
生成 AI アプリケーションで関数呼び出しを使用するには、関数 parameters
と description
を指定する必要があります。
tool_choice
のデフォルトの動作は ""auto"
" です。 これにより、モデルは、どの関数を呼び出すか、およびそれらを呼び出すかどうかを決定できます。
ユース ケースに応じてデフォルトの動作をカスタマイズできます。 オプションは次のとおりです。
tool_choice: "required"
を設定します。 このシナリオでは、モデルは常に 1 つ以上の関数を呼び出します。 モデルは、呼び出す関数を選択します。tool_choice: {"type": "function", "function": {"name": "my_function"}}
を設定します。 このシナリオでは、モデルは特定の関数のみを呼び出します。tool_choice: "none"
を設定して関数呼び出しを無効にし、モデルがユーザー向けのメッセージのみを生成するようにします。
以下は、OpenAI SDK とその tools
を使用した単一ターンの例です。 その他の構文の詳細については、「チャット タスク」を参照してください。
重要
パブリック プレビュー中、Databricks での関数呼び出しは、単一ターン関数呼び出し用に最適化されます。
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
)
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
]
}
}
}
}
}
]
messages = [{"role": "user", "content": "What is the current temperature of Chicago?"}]
response = client.chat.completions.create(
model="databricks-meta-llama-3-1-70b-instruct",
messages=messages,
tools=tools,
tool_choice="auto",
)
print(json.dumps(response.choices[0].message.model_dump()['tool_calls'], indent=2))
JSON スキーマ
基盤モデル API は、OpenAI で受け入れられる関数定義を幅広くサポートします。 ただし、関数呼び出し定義に単純な JSON スキーマを使用すると、より高品質の関数呼び出し JSON が生成されます。 より高品質な生成を促進するために、基盤モデル API では JSON スキーマ仕様のサブセットのみがサポートされています。
次の関数呼び出し定義キーはサポートされていません。
pattern
を使用した正規表現。- 次を使用した複雑な入れ子になった構成、またはスキーマの構成と検証:
anyOf
、oneOf
、allOf
、prefixItems
、または$ref
。 - リスト内の1つのタイプが有効な JSON タイプで、もう1つのタイプが
"null"
である[type, “null”]
という特殊なケースを除いたタイプのリスト。
さらに、次の制限が適用されます。
- JSON スキーマで指定されたキーの最大数が
16
。 - 基盤モデル API では、オブジェクトと配列の長さやサイズの制約は適用されません。
- これには、
maxProperties
、minProperties
、maxLength
などのキーワードが含まれます。
- これには、
- 入れ子になった JSON スキーマが多いと、生成されるデータの品質が低下します。 可能であれば、より良い結果を得るために、JSON スキーマをフラット化してみてください。
トークンの使用法
プロンプト インジェクションやその他の手法を使用して、ツール呼び出しの品質を向上させます。 これを行うと、モデルによって消費される入力トークンと出力トークンの数に影響し、結果として課金に影響が生じます。 使用するツールが多いほど、入力トークンが増加します。
制限事項
以下は、パブリック プレビュー中の関数呼び出しに関する制限事項です。
- 現在の関数呼び出しソリューションは、単一ターン関数呼び出し用に最適化されています。 複数ターンの関数呼び出しはプレビュー中に使用できますが、開発中です。
- DBRX Instruct および Meta Llama 3.1 8B Instruct モデルでは、マルチターン関数呼び出しはサポートされていません。
- 並列関数呼び出しはサポートされていません。
tools
で定義できる関数の最大数は 32 個です。- プロビジョニング済みスループットのサポートでは、関数呼び出しは新しいエンドポイントでのみサポートされます。 以前に作成したエンドポイントに関数呼び出しを追加することはできません。
ノートブックの例
関数呼び出しの詳細な例については、次のノートブックを参照してください