Hugging Face 統合ツール使用 API

Hugging Face は、Mistral、Cohere、NousResearch、Llama などの複数の人気モデルファミリー間でツール呼び出しをポータブルにすることを目的とした統合ツール使用 API をリリースしました。このアップデートにより、チャットでツールを実装する際のモデル固有の変更が減り、ツールの渡し方とチャット履歴の管理を標準化された方法で提供します。

チャットテンプレートによるツール定義の標準化

統合 API は既存のチャットテンプレートシステムの拡張を活用しています。Jinja テンプレートを使用することで、システムは特定のモデルが要求する正しい制御トークンやフォーマットでチャットをレンダリングでき、開発者はモデルに依存しない形式でチャットを書くことができます。

ツールをテンプレートに渡す

異なるプログラミング言語間で API が直感的であることを保証するため、Hugging Face はツール定義に対して二重アプローチを実装しました:

  • JSON Schema: 基本的なチャットテンプレートはツールが JSON スキーマとして定義されることを期待しています。
  • Python Integration: Python ユーザー向けに、API は Python 関数を自動的に JSON スキーマに変換します。これを容易にするため、開発者は明確な関数名、正確な型ヒント、完全な docstring(引数の docstring を含む)を提供すべきです。これらはモデルが読み取るスキーマ生成に使用されます。

ツール呼び出しワークフローの実装

ツール使用を実装するには、モデルがコンテキストを維持できるように、チャット履歴に特定のメッセージシーケンスを追加する必要があります。

二段階メッセージプロセス

ツール呼び出しは単一のイベントではなく、チャット履歴に2つの異なるメッセージが必要です。

  1. The Tool Call: アシスタントメッセージで、tool_calls フィールドに関数名と使用する引数を指定します。
  2. The Tool Response: 役割が tool のメッセージで、関数名とコンテンツ(呼び出された関数の出力)を指定します。

両方のメッセージがなければ、モデルはツールレスポンスを元のリクエストや渡された引数と関連付けることができません。

実践的な実行

LLM はコードを実行するのではなくテキストを生成するため、開発者が手動で実行を処理する必要があります。プロセスは以下の流れです:

  1. Prompt Generation: チャットとツールは tokenizer.apply_chat_template に渡され、プロンプトが作成されます。
  2. Model Generation: モデルはツール呼び出しリクエストを生成します(例: <tool_call> のようなタグを使用)。
  3. Manual Execution: 開発者はモデルのリクエストを解析し、対応する Python 関数を実行し、ツール呼び出しとツールレスポンスの両方をチャット履歴に追加します。
  4. Final Response: 更新されたチャットがモデルに再度渡され、ユーザーへの最終的な自然言語応答が生成されます。

現在の制限と今後の方向性

入力フォーマットは統一されましたが、出力フォーマットは依然としてモデル固有です。モデルがツール呼び出しを出力する際は独自のネイティブ形式で行われるため、開発者は json.loads() や正規表現を使用してリクエストを解析し、ユニバーサルチャット形式に追加する必要があります。

Hugging Face は現在、これらのレスポンスフォーマットをさらに統一し、プロセスを簡素化するためのソリューションに取り組んでいます。

Sources