Databricks での関数呼び出し
プレビュー
この機能はパブリック プレビュー段階であり、基盤モデルAPIトークン単位の従量課金エンドポイントでのみサポートされます。
この記事では、関数の呼び出しと、それを生成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での関数呼び出しでは、次の基盤モデルAPIトークン単位の従量課金モデルがサポートされます。
重要
DBRX は、 Databricks Open Model Licenseに基づいて提供され、これに従います。Copyright © Databricks, Inc. 無断転載を禁じます。 お客様は、 Databricks許容使用ポリシーを含む、該当するモデル ライセンスに準拠することを保証する責任を負います。
Meta Llama 3.1 は、LLAMA 3.1 コミュニティ ライセンス、著作権 © Meta Platforms, Inc. に基づいてライセンスされています。 全著作権所有。 顧客は、該当するモデル ライセンスによるコンプライアンスを確保する責任があります。
関数呼び出しを使用する
生成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-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 スキーマをフラット化してみてください。
トークンの使用
プロンプトインジェクションやその他の手法を使用して、ツール呼び出しの品質を向上させます。 これを行うと、モデルによって消費される入力トークンと出力トークンの数に影響し、結果として課金に影響が生じます。 使用するツールが増えるほど、入力トークンが増加します。