Azure Databricks での関数呼び出し

重要

この機能はパブリック プレビュー段階であり、Foundation Model API のトークン単位の支払いエンドポイントでのみサポートされています。

この記事では、関数呼び出しと、それを生成 AI アプリケーション ワークフローの一部として使用する方法について説明します。 Databricks 関数呼び出しは OpenAI と互換性があり、Foundation Model API の一部としてモデル サービング中にのみ使用できます。

関数呼び出しとは

関数呼び出しは、LLM の出力を制御する方法を提供し、構造化された応答をより確実に生成します。 関数呼び出しを使用する場合は、JSON スキーマを使用して関数の引数を記述することにより、API 呼び出しで関数を記述します。 LLM 自体はこれらの関数を呼び出すのではなく、ユーザーがコード内の関数を呼び出すために使用できる JSON オブジェクトを作成します。

Databricks での関数呼び出しの場合、基本的なステップは次のとおりです。

  1. 送信されたクエリと tools パラメーターで定義された一連の関数を使用してモデルを呼び出します。
  2. モデルは、定義された関数を呼び出すかどうかを決定します。 関数が呼び出されると、そのコンテンツはカスタム スキーマに準拠した文字列の JSON オブジェクトになります。
  3. コード内で文字列を JSON に解析し、指定された引数が存在する場合はその引数を使用して関数を呼び出します。
  4. 構造化された応答を新しいメッセージとして追加して、モデルを再度呼び出します。 応答の構造は、以前に 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 を呼び出します。
  • 非構造化データを構造化データに変換します。 たとえば、製品レビューのフィードバックを否定的、肯定的、中立的として識別し、分類するなどです。

サポートされているモデル

Databricks での関数呼び出しでは、次の基盤モデル 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.)。 お客様は、該当するモデル ライセンスへのコンプライアンスを遵守する責任を負います。

関数呼び出しを使用する

生成 AI アプリケーションで関数呼び出しを使用するには、関数 parametersdescription を指定する必要があります。

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 を使用した正規表現。
  • 次を使用した複雑な入れ子になった構成、またはスキーマの構成と検証: anyOfoneOfallOfprefixItems、または $ref
  • リスト内の1つのタイプが有効な JSON タイプで、もう1つのタイプが "null" である [type, “null”] という特殊なケースを除いたタイプのリスト。

さらに、次の制限が適用されます。

  • JSON スキーマで指定されたキーの最大数が 16
  • 基盤モデル API では、オブジェクトと配列の長さやサイズの制約は適用されません。
    • これには、maxPropertiesminPropertiesmaxLengthなどのキーワードが含まれます。
  • 入れ子になった JSON スキーマが多いと、生成されるデータの品質が低下します。 可能であれば、より良い結果を得るために、JSON スキーマをフラット化してみてください。

トークンの使用法

プロンプト インジェクションやその他の手法を使用して、ツール呼び出しの品質を向上させます。 これを行うと、モデルによって消費される入力トークンと出力トークンの数に影響し、結果として課金に影響が生じます。 使用するツールが多いほど、入力トークンが増加します。

制限事項

以下は、パブリック プレビュー中の関数呼び出しに関する制限事項です。

  • 関数呼び出しは、Foundation Model API でプロビジョニングされたスループット エンドポイントではサポートされていません。
  • 現在の関数呼び出しソリューションは、単一ターン関数呼び出し用に最適化されています。 複数ターンの関数呼び出しはプレビュー中に使用できますが、開発中です。
  • 並列関数呼び出しはサポートされていません。
  • tools で定義できる関数の最大数は 32 個です。

ノートブックの例

関数呼び出しの詳細な例については、次のノートブックを参照してください

関数呼び出し例ノートブック

ノートブックを入手