Databricks での関数呼び出し
この記事では、関数呼び出しと、それを生成AI アプリケーションのワークフローの一部として使用する方法について説明します。 Databricks Function Calling は OpenAI と互換性があり、 基盤モデル APIs の一部としてモデルサービング中のみ使用でき、 外部モデルを提供するサービング エンドポイントを利用できます。
関数呼び出しとは?
関数呼び出しは、LLM の出力を制御する方法を提供し、LLM が構造化された応答をより確実に生成できるようにします。 関数呼び出しを使用する場合は、JSON スキーマを使用して関数の引数を記述することで、API 呼び出しで関数を記述します。 LLM 自体はこれらの関数を呼び出さず、代わりに、ユーザーがコード内の関数を呼び出すために使用できる JSON オブジェクトを作成します。
Databricks での関数呼び出しの場合、基本的な手順は次のとおりです。
- 送信されたクエリと、
tools
パラメーターで定義された一連の関数を使用して、モデルを呼び出します。 - モデルは、定義された関数を呼び出すかどうかを決定します。 関数が呼び出されると、コンテンツはカスタムスキーマに準拠する文字列のJSONオブジェクトになります。
- コード内で文字列を JSON に解析し、指定された引数が存在する場合は、その引数を使用して関数を呼び出します。
- 構造化された応答を新しいメッセージとして追加して、モデルを再度呼び出します。 レスポンスの構造は、以前に
tools
で提供した関数によって定義されます。 ここから、モデルは結果を要約し、その概要をユーザーに送信します。
関数呼び出しを使用する場合
以下は、関数呼び出しのユースケースの例です。
- 他の APIsに電話して質問に答えることができるアシスタントを作成します。 たとえば、
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を呼び出します。
バッチ推論やデータ処理タスク (非構造化データから構造化データへの変換など) の場合。 Databricks では、構造化された出力を使用することをお勧めします。
サポートされているモデル
次の表に、サポートされているモデルと、各モデルを使用可能にするモデルサービング機能を示します。
- 基盤モデル APIsによって利用可能になったモデルについては、地域の可用性に関する 基盤モデルの APIs 制限 を参照してください。
- 外部モデルによって利用可能になるモデルについては、利用可能な リージョン のリージョンを参照してください。
2024 年 12 月 11 日以降、Meta-Llama-3.3-70B-Instruct は、トークン単位の従量課金エンドポイントの基盤モデル APIs Meta-Llama-3.1-70B-Instruct のサポートを置き換えます。
Meta Llama 3.3 は、 LLAMA 3.3 コミュニティ ライセンス、Copyright © Meta Platforms, Inc. の下でライセンスされています。 全著作権所有。 お客様は、このライセンスおよび Llama 3.3 Acceptable Use ポリシーの条件に対するコンプライアンスを確保する責任があります。
Meta Llama 3.1 は 、LLAMA 3.1 コミュニティ ライセンス、Copyright © Meta Platforms, Inc. の下でライセンスされています。 全著作権所有。 お客様は、該当するモデルライセンスでコンプライアンスを確保する責任があります。
モデル | モデルサービング機能を使用して利用可能 | 注 |
---|---|---|
基盤モデルAPI | トークン単位の従量課金エンドポイントでサポートされます。 | |
基盤モデルAPI | トークン単位の従量課金とプロビジョニング スループットのワークロードでサポートされます。 | |
基盤モデルAPI | トークン単位の従量課金とプロビジョニング スループットのワークロードでサポートされます。 | |
基盤モデルAPI | トークン単位の従量課金とプロビジョニング スループットのワークロードでサポートされます。 | |
GPT-4O(英語) | 外部モデル | |
GPT-4O-2024-08-06 | 外部モデル | |
GPT-4O-2024-05-13 | 外部モデル | |
GPT-4O-ミニ | 外部モデル | |
claude-3-5-sonnet-latest | 外部モデル | Anthropic モデルプロバイダー |
claude-3-5-haiku-latest | 外部モデル | Anthropic モデルプロバイダー |
claude-3-5-opus-latest | 外部モデル | Anthropic モデルプロバイダー |
claude-3-5-sonnet-20241022 | 外部モデル | Anthropic モデル プロバイダー。 このモデルは、 コンピュータ Use (beta) を使用したツール呼び出しをサポートしています。 |
claude-3-5-haiku-20241022 | 外部モデル | Anthropic モデルプロバイダー |
claude-3-5-sonnet-20240620 | 外部モデル | Anthropic モデルプロバイダー |
claude-3-haiku-20240307 | 外部モデル | Anthropic モデルプロバイダー |
claude-3-opus-20240229 | 外部モデル | Anthropic モデルプロバイダー |
claude-3-sonnet-20240229 | 外部モデル | Anthropic モデルプロバイダー |
クロード-3-5-ソネット-20241022-v2:0 | 外部モデル | Bedrock Anthropicモデルプロバイダー。 このモデルは、 コンピュータ Use (beta) を使用したツール呼び出しをサポートしています。 |
クロード-3-5-俳句-20241022-V1:0 | 外部モデル | Bedrock Anthropicモデルプロバイダー |
クロード-3-5-ソネット-20240620-V1:0 | 外部モデル | Bedrock Anthropicモデルプロバイダー |
claude-3-sonnet-20240229-v1:0 | 外部モデル | Bedrock Anthropicモデルプロバイダー |
クロード-3-OPUS-20240229-V1:0 | 外部モデル | Bedrock Anthropicモデルプロバイダー |
関数呼び出しを使用する
生成AI アプリケーションで関数呼び出しを使用するには、関数parameters
とdescription
を指定する必要があります。
tool_choice
のデフォルトの動作は "auto"
です。これにより、モデルは呼び出す関数とそれらを呼び出すかどうかを決定できます。
デフォルトの動作は、ユースケースに応じてカスタマイズできます。 次のオプションがあります。
tool_choice: "required"
を設定します。このシナリオでは、モデルは常に 1 つ以上の関数を呼び出します。 モデルによって、呼び出す関数が選択されます。tool_choice: {"type": "function", "function": {"name": "my_function"}}
を設定します。このシナリオでは、モデルは特定の関数のみを呼び出します。tool_choice: "none"
を設定して関数呼び出しを無効にし、モデルがユーザー向けのメッセージのみを生成するようにします。
以下は、OpenAI SDK とその tools
パラメーターを使用した 1 ターンの例です。 構文の詳細については、 チャットタスク を参照してください。
パブリック プレビュー期間中、Databricks での関数呼び出しは 1 ターンの関数呼び出し用に最適化されています。
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-3-70b-instruct",
messages=messages,
tools=tools,
tool_choice="auto",
)
print(json.dumps(response.choices[0].message.model_dump()['tool_calls'], indent=2))
このパラメーターは、 Claude モデルのコンピュータ Use (beta) もサポートしています。
JSON スキーマ
基盤モデルAPI 、OpenAI が受け入れる関数定義を幅広くサポートします。 ただし、関数呼び出し定義に単純な JSON スキーマを使用すると、より高品質な関数呼び出し JSON が生成されます。 より高品質な生成を促進するために、基盤モデルAPI JSONスキーマ仕様のサブセットのみをサポートします。
次の関数呼び出し定義キーはサポートされていません。
pattern
.anyOf
、oneOf
、allOf
、prefixItems
、または$ref
を使用した複雑なネストまたはスキーマの構成と検証。- 型のリスト (ただし、リスト内の 1 つの型が有効な JSON 型で、もう 1 つの型が有効な JSON 型である
[type, “null”]
の特殊なケースを除く)"null"
さらに、次の制限が適用されます。
-
JSON スキーマで指定されるキーの最大数は
16
です。 -
基盤モデルAPIオブジェクトと配列の長さやサイズの制約を強制しません。
- これには、
maxProperties
、minProperties
、maxLength
などのキーワードが含まれます。
- これには、
-
ネストされた JSON スキーマが多いと、生成の品質が低下します。 可能であれば、より良い結果を得るために JSON スキーマをフラット化してみてください。
トークンの使用量
プロンプトインジェクションやその他の手法を使用して、ツールコールの品質を向上させます。 これを行うと、モデルによって消費される入力トークンと出力トークンの数に影響が及び、課金に影響が及びます。 使用するツールが多いほど、入力トークンが増えます。
制限
パブリック プレビュー中の関数呼び出しの制限事項は次のとおりです。
- 現在の関数呼び出しソリューションは、シングル ターン関数呼び出し用に最適化されています。 マルチターン関数呼び出しはプレビュー期間中もサポートされていますが、開発中です。
- 並列関数呼び出しはサポートされていません。
tools
で定義できる関数の最大数は 32 関数です。- プロビジョニングされたスループットのサポートの場合、関数呼び出しは新しいエンドポイントでのみサポートされます。 以前に作成したエンドポイントに関数呼び出しを追加することはできません。
ノートブックの例
詳細な関数呼び出しの例については、次のノートブックを参照してください