モデル間でルーティングする¶
試験運用
モデルルーティングは試験運用の機能であり、今後のリリースで変更される可能性があります。 フィードバックを お待ちしています。
LlmAgent はデフォルトで単一のモデルを使用します。リクエストごとに異なる
モデルから動的に選択する必要がある場合は、どのモデルを使うかを選ぶルーティング
関数を定義できます。RoutedLlm はこの機能を提供し、エラー時のモデル
フォールバック、モデル間の A/B テスト、入力の複雑さに基づく自動ルーティングを
可能にします。選択されたモデルが出力を生成する前に失敗した場合、ルーティング
関数はエラーコンテキスト付きで再度呼び出され、別のモデルを選択できます。
RoutedLlm を LlmAgent の model パラメータとして渡します。ルートごとに
モデルだけが変わる場合は RoutedLlm を使用してください。指示、ツール、または
サブエージェントも切り替える必要がある場合は、代わりに
RoutedAgent を使用します。
ルーティングの仕組み¶
LlmRouter 関数は、利用可能なモデルのマップと現在の LlmRequest を受け取り、
使用するモデルのキーを返します。
models パラメータには、明示的なキーを持つ Record<string, BaseLlm>、または
BaseLlm インスタンスの配列を渡せます。配列を渡した場合は、各モデルの名前が
キーとして使用されます。
フェイルオーバーは RoutedAgent と同じ
ルールに従います。選択されたモデルがレスポンスを 1 つも yield する前に失敗した
場合にのみ、ルーターは errorContext 付きで再呼び出しされます。yield 後の
エラーは再試行されず、そのまま伝播します。ルーターは undefined を返して
再試行を停止し、最後のエラーを伝播できます。
ライブ接続: RoutedLlm.connect() は接続時にモデルを選択します。ライブ
接続が確立された後は、ストリームの途中でモデルを切り替えることはできません。
基本的な使用方法¶
次の例では、まずプライマリモデルを試し、プライマリモデルが失敗した場合に
セカンダリモデルへフォールバックする RoutedLlm を作成します。ルーターは
失敗したモデルを再選択しないように errorContext.failedKeys を確認します。
import {
BaseLlm,
Gemini,
LlmRequest,
LlmAgent,
RoutedLlm,
InMemoryRunner,
} from '@google/adk';
const primaryModel = new Gemini({ model: 'gemini-flash-latest' });
const fallbackModel = new Gemini({ model: 'gemini-pro-latest' });
const router = (
models: Readonly<Record<string, BaseLlm>>,
request: LlmRequest,
// errorContext is provided when a previously selected model fails
errorContext?: { failedKeys: ReadonlySet<string>; lastError: unknown },
) => {
if (!errorContext) {
return 'primary'; // Try primary first
}
if (errorContext.failedKeys.has('primary')) {
return 'fallback'; // Fall back if primary failed
}
return undefined; // No more options, propagate the error
};
const routedLlm = new RoutedLlm({
models: { primary: primaryModel, fallback: fallbackModel },
router,
});
// Use RoutedLlm as the model for an LlmAgent
const agent = new LlmAgent({
name: 'my_agent',
model: routedLlm,
instruction: 'You are a helpful assistant.',
});
const runner = new InMemoryRunner({ agent, appName: 'my_app' });
const session = await runner.sessionService.createSession({
appName: 'my_app',
userId: 'user_1',
});
const run = runner.runAsync({
userId: 'user_1',
sessionId: session.id,
newMessage: { role: 'user', parts: [{ text: 'Hello!' }] },
});
for await (const event of run) {
if (event.content?.parts?.[0]?.text) {
console.log(event.content.parts[0].text);
}
}