ツール呼び出しは関数呼び出しとも呼ばれ、 LLM は、呼び出し元のアプリケーションにリクエストを送り返すことができます。マイページ モデルで使用できるようにするツールを定義します。 プロンプトのニーズを満たすために、必要に応じてアプリにツール リクエストを行う。
ツール呼び出しのユースケースは、通常、いくつかのテーマに分類されます。
トレーニングされていない情報に LLM がアクセスできるようにする
- レストランの日替わりメニューや 店舗の在庫ステータスを確認できます
- アプリのドメインに固有の情報(プロダクト情報など)。
なお、検索拡張生成(RAG)と重複することに注意してください。 LLM が事実情報をその世代に統合する方法です。RAG とは 大量のログがある場合に最適な あいまいな情報があいまいになる場合ですオン 一方、LLM が必要とする情報が単純な関数である場合、 ツール呼び出しの方が適切です。
LLM ワークフローにある程度の決定論を導入する
- LLM 自体では確実に完了できない計算を実行する。
- 次のような特定の状況で、LLM に逐語的なテキストを生成すること (アプリの利用規約に関する質問に回答する場合)
LLM から開始されたアクションの実行
- LLM を利用したホーム アシスタントで照明をつける、消す
- LLM を活用したレストラン エージェントによるテーブル予約
始める前に
このページのコードサンプルを実行するには、まず スタートガイドこれらすべての例は、 Genkit の依存関係がインストールされているプロジェクトがすでに設定されている。
このページでは、Genkit モデル抽象化の高度な機能の一つと、 generate() 関数を使用するため、詳しく見る前に、Terraform 構成の AI モデルを使用したコンテンツの生成ページの内容。すべきこと 入力スキーマと出力スキーマを定義するための Genkit のシステムについても詳しく これについては、フローのページをご覧ください。
ツール呼び出しの概要
大まかに言えば、LLM の一般的なツール呼び出しのインタラクションは次のとおりです。 次のようになります。
- 呼び出し元のアプリケーションは、LLM にリクエストを送信してプロンプトを送信します。また、 LLM が回答を生成するために使用できるツールのリスト。
- LLM は完全なレスポンスを生成するか、ツール呼び出しを生成する 特定の形式で返されます。
- 呼び出し元が完全なレスポンスを受け取ると、リクエストは処理され、 やり取りの終了呼び出し元がツール呼び出しを受け取ると、 適切なロジックを記述して新しいリクエストを LLM に送信し、 そのバリエーションと、元のプロンプトで ツール呼び出しです。
- 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 つとも
name
、description
、inputSchema
、outputSchema
のパラメータは、次のとおりです。
必要ありません。
ツール定義を記述するときは、表現と構成に特別な注意を
パラメータの記述性が維持され、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;
}