Databricks での関数呼び出し
プレビュー
この機能は パブリック プレビュー 段階であり、基盤モデル エンドポイント APIs トークン単位の従量課金エンドポイントまたはプロビジョニング スループット エンドポイントの両方でサポートされています。
この記事では、関数の呼び出しと、それを生成AIアプリケーション ワークフローの一部として使用する方法について説明します。 Databricks関数呼び出しは OpenAI と互換性があり、基盤モデルAPIの一部としてモデルサービング中にのみ使用できます。
関数呼び出しとは
関数呼び出しは、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 では、構造化された出力を使用することをお勧めします。
サポートされるモデル
重要
DBRX は、 Databricks Open Model Licenseに基づいて提供され、これに従います。Copyright © Databricks, Inc. 無断転載を禁じます。 お客様は、 Databricks許容使用ポリシーを含む、該当するモデル ライセンスに準拠することを保証する責任を負います。
Meta Llama 3.1 は、LLAMA 3.1 コミュニティ ライセンス、著作権 © Meta Platforms, Inc. に基づいてライセンスされています。 全著作権所有。 顧客は、該当するモデル ライセンスによるコンプライアンスを確保する責任があります。
Databricks での関数呼び出しでは、トークン単位の従量課金ワークロードとプロビジョニング スループット ワークロードで次の基盤モデル APIs モデルがサポートされています。
リージョンの可用性については、基盤モデル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型であり、
[type, “null”]
1つが"null"
さらに、次の制限が適用されます。
JSON スキーマで指定されるキーの最大数は
16
です。基盤モデルAPIオブジェクトと配列の長さやサイズの制約を強制しません。
これには、
maxProperties
、minProperties
、maxLength
などのキーワードが含まれます。
ネストされた JSON スキーマが多いと、生成されるデータの品質が低下します。 可能であれば、より良い結果を得るために JSON スキーマをフラット化してみてください。
トークンの使用
プロンプトインジェクションやその他の手法を使用して、ツール呼び出しの品質を向上させます。 これを行うと、モデルによって消費される入力トークンと出力トークンの数に影響し、結果として課金に影響が生じます。 使用するツールが増えるほど、入力トークンが増加します。
制限事項
パブリック プレビュー中の関数呼び出しの制限事項を次に示します。
現在の関数呼び出しソリューションは、単一ターン関数呼び出し用に最適化されています。 複数ターンの関数呼び出しはプレビュー中にサポートされていますが、開発中です。
DBRX Instruct モデルと Meta Llama 3.1 8B Instruct モデルは、マルチターン関数呼び出しをサポートしていません。
並列関数呼び出しはサポートされていません。
tools
で定義できる関数の最大数は 32 関数です。プロビジョニングされたスループットのサポートの場合、関数呼び出しは新しいエンドポイントでのみサポートされます。 以前に作成したエンドポイントに関数呼び出しを追加することはできません。