ツールの呼び出し

ツール呼び出し関数呼び出しとも呼ばれ、 LLM は、呼び出し元のアプリケーションにリクエストを送り返すことができます。マイページ モデルで使用できるようにするツールを定義します。 プロンプトのニーズを満たすために、必要に応じてアプリにツール リクエストを行う。

ツール呼び出しのユースケースは、通常、いくつかのテーマに分類されます。

トレーニングされていない情報に LLM がアクセスできるようにする

  • レストランの日替わりメニューや 店舗の在庫ステータスを確認できます
  • アプリのドメインに固有の情報(プロダクト情報など)。

なお、検索拡張生成(RAG)と重複することに注意してください。 LLM が事実情報をその世代に統合する方法です。RAG とは 大量のログがある場合に最適な あいまいな情報があいまいになる場合ですオン 一方、LLM が必要とする情報が単純な関数である場合、 ツール呼び出しの方が適切です。

LLM ワークフローにある程度の決定論を導入する

  • LLM 自体では確実に完了できない計算を実行する。
  • 次のような特定の状況で、LLM に逐語的なテキストを生成すること (アプリの利用規約に関する質問に回答する場合)

LLM から開始されたアクションの実行

  • LLM を利用したホーム アシスタントで照明をつける、消す
  • LLM を活用したレストラン エージェントによるテーブル予約

始める前に

このページのコードサンプルを実行するには、まず スタートガイドこれらすべての例は、 Genkit の依存関係がインストールされているプロジェクトがすでに設定されている。

このページでは、Genkit モデル抽象化の高度な機能の一つと、 generate() 関数を使用するため、詳しく見る前に、Terraform 構成の AI モデルを使用したコンテンツの生成ページの内容。すべきこと 入力スキーマと出力スキーマを定義するための Genkit のシステムについても詳しく これについては、フローのページをご覧ください。

ツール呼び出しの概要

大まかに言えば、LLM の一般的なツール呼び出しのインタラクションは次のとおりです。 次のようになります。

  1. 呼び出し元のアプリケーションは、LLM にリクエストを送信してプロンプトを送信します。また、 LLM が回答を生成するために使用できるツールのリスト。
  2. LLM は完全なレスポンスを生成するか、ツール呼び出しを生成する 特定の形式で返されます。
  3. 呼び出し元が完全なレスポンスを受け取ると、リクエストは処理され、 やり取りの終了呼び出し元がツール呼び出しを受け取ると、 適切なロジックを記述して新しいリクエストを LLM に送信し、 そのバリエーションと、元のプロンプトで ツール呼び出しです。
  4. LLM は新しいプロンプトをステップ 2 と同様に処理します。

これを行うには、次の要件を満たす必要があります。

  • モデルは、タスクを完了するのに必要に応じてツール リクエストを行うようにトレーニングする必要があります。 表示されます。ウェブ API を通じて提供される大規模なモデルのほとんど(Gemini など) と Claude は可能ですが、小規模で特殊なモデルでは、これができないことが多くあります。 サポートされないツールをモデルに提供しようとすると、Genkit はエラーをスローします。 サポートします。
  • 呼び出し元のアプリケーションは、 表示されます。
  • 呼び出し元のアプリケーションは、ツール呼び出しを生成するようにモデルに指示する必要がある アプリケーションが想定する形式で記述します。

Genkit によるツール呼び出し

Genkit は、ツール呼び出し用の単一のインターフェースと、それをサポートするモデルを備えています。 各モデル プラグインにより、上記の条件のうち最後の 2 つが満たされるようになります。 generate() 関数がツール呼び出しループを自動的に実行する 使用できます。

モデルのサポート

ツール呼び出しのサポートは、モデル、モデル API、Genkit プラグインによって異なります。 関連ドキュメントを参照して、ツール呼び出しを使用する可能性があるかどうかを判断する サポートされません。次の特長があります。

  • サポートされないツールをモデルに提供しようとすると、Genkit はエラーをスローします。 サポートします。
  • プラグインがモデル参照をエクスポートする場合、info.supports.tools プロパティ ツール呼び出しがサポートされているかどうかを確認できます

ツールの定義

defineTool() 関数を使用してツール定義を記述します。

const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
  {
    name: "specialTool",
    description: "Retrieves today's special for the given meal",
    inputSchema: specialToolInputSchema,
    outputSchema: z.string(),
  },
  async ({ meal }): Promise<string> => {
    // Retrieve up-to-date information and return it. Here, we just return a
    // fixed value.
    return "Baked beans on toast";
  }
);

ここでの構文は defineFlow() の構文に似ています。ですが 4 つとも namedescriptioninputSchemaoutputSchema のパラメータは、次のとおりです。 必要ありません。 ツール定義を記述するときは、表現と構成に特別な注意を パラメータの記述性が維持され、LLM が大規模言語モデルに ツールを効果的に活用する方法を学びます。

プロンプトにツールを含める

ツールを定義したら、 generate():

const llmResponse = await generate({
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
});

複数のツールを使用可能にできます。LLM は必要に応じてツールを呼び出し、 プロンプトを入力します。

ツール呼び出しの明示的な処理

デフォルトでは、Genkit はすべてのツール呼び出しが終わるまで、LLM を繰り返し呼び出します。 解決しました。このツール呼び出しループをより詳細に制御したい場合(たとえば、 より複雑なロジックを適用するには、returnToolRequests パラメータを true に設定します。 今後は、ご自身の責任において、ツール リクエストをすべて確実に満たすようにしてください。

let generateOptions: GenerateOptions = {
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
  returnToolRequests: true,
};
let llmResponse;
while (true) {
  llmResponse = await generate(generateOptions);
  const toolRequests = llmResponse.toolRequests();
  if (toolRequests.length < 1) {
    break;
  }
  const toolResponses: ToolResponsePart[] = await Promise.all(
    toolRequests.map(async (part) => {
      switch (part.toolRequest.name) {
        case "specialTool":
          return {
            toolResponse: {
              name: part.toolRequest.name,
              ref: part.toolRequest.ref,
              output: await specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
            },
          };
        default:
          throw Error('Tool not found');
        }
      }));
    generateOptions.history = llmResponse.toHistory();
    generateOptions.prompt = toolResponses;
}