Model Routing(モデルルーティング)
モデルルーティングは実験的な機能であり、今後のリリースで変更される可能性があります。
リクエストによって必要なモデルは異なります。挨拶や短い事実確認の質問であれば、小さく高速で 安価なモデルで回答できますが、コードの作成や詳細な分析には、より大きなモデルが必要です。モデルルーティングを使うと、各リクエストが アプリケーションの他の部分を変更することなく、それに適したモデルに送信されます。
RoutingChatModel は ChatModel の一種で、ChatModelRouter の判断に従って、各リクエストを複数のチャットモデル(ルート)のいずれかに送信します。
ChatModel であるため、チャットモデルが使われるあらゆる場所(AI Service、エージェント、
RAG など)で使用できます。
ChatModel chatModel = RoutingChatModel.builder()
.route("simple", "Greetings, small talk and short factual questions", smallModel)
.route("complex", "Writing or debugging code, multi-step reasoning, detailed analysis", largeModel)
.router(new DecisionModelChatModelRouter(decisionModel))
.defaultRoute("complex")
.build();
Assistant assistant = AiServices.create(Assistant.class, chatModel);
smallModel と largeModel は任意の ChatModel、decisionModel は任意の DecisionModel(たとえば
TypeSafeDecisionModel。意思決定モデルを参照)です。モデルを必要としないルーターについては、
後述します。
ストリーミングの場合は、StreamingChatModel と一緒に RoutingStreamingChatModel を使用します。動作は同じです。
ルーター
ChatModelRouter は ChatModelRoutingResult を返します。いずれかのルートを選ぶ場合は ChatModelRoutingResult.route(name)、
デフォルトのルートを選ぶ場合は ChatModelRoutingResult.defaultRoute() です。
デフォルトのルートは必須です。これにより、たとえばモデルを呼び出すルーターが判断に迷ったり失敗したりしたときでも、
リクエストの送信先となるモデルが常に存在します。
意思決定モデルルーター
DecisionModelChatModelRouter は、意思決定モデルを使って、説明がリクエストに最もよく合うルートを選択します。
システムメッセージと、会話の最後の 10 件のメッセージ(
ツール呼び出しとツール結果を含む。maxMessages)、さらに最後のユーザーメッセージがそれより古い場合はそれも送信します。これにより、「yes, go ahead」のような短い
フォローアップも理解されます。2,000 文字を超えるメッセージは、途中が短縮されます
(maxMessageLength)。システムメッセージは常に全文が送信され、messageFilter(...) で、たとえばサイズの大きいツール結果などのメッセージを除外できます。画像など、テキスト以外の
コンテンツはマーカー(たとえば [attached image])で表現されるため、説明に画像が含まれているルートを、
そのリクエストに対して選択できます。
意思決定モデルは通常、チャットモデルよりもはるかに高速で安価であるため、ルーティングによる
レイテンシとコストの増加は、チャットモデルの呼び出しに比べてわずかです。各ルートの説明をしっかり書いてください。説明のないルートは、その名前が説明として使われます。
リクエストにユーザーメッセージがない場合や、選ばれたルートの確率が minProbability を下回る場合は、デフォルトのルートが選択されます。
これは、意思決定モデルが判断に自信を持てないリクエストを、
より大きなモデルに送るのに便利です。minProbability を使うには、確率を報告する意思決定モデルが必要です。そうでない場合、呼び出しは
失敗します。意思決定モデルが失敗した場合は、デフォルトのルートが使われ、警告がログに記録されます。代わりにリクエストを失敗させるには、
fallbackStrategy(FAIL) を設定します。
ChatModelRouter router = DecisionModelChatModelRouter.builder()
.decisionModel(decisionModel)
.minProbability(0.7)
.build();
互いに無関係な複数のトピックに関するリクエストを扱うルートには、複数の説明を指定できます。
ChatModel chatModel = RoutingChatModel.builder()
.route("simple", "Greetings, small talk and short factual questions", smallModel)
.route("complex", List.of("Writing or debugging code", "Legal contract analysis", "Tax planning"), largeModel)
.router(new DecisionModelChatModelRouter(decisionModel))
.defaultRoute("simple")
.build();
この場合、意思決定モデルは各説明を別々の選択肢として扱い、そのルートの確率は 各説明の確率の合計になります。すべてのトピックを列挙した 1 つの説明と比べると、 特に小さな意思決定モデルでは、判断の確信度が高まることがあります。意思決定モデルが判断に迷う場合は、 確率をすべての選択肢に分散させるため、説明が多いルートほど多くの確率を得ます。そのルートに不明確なケースを任せたい場合を除き、 各ルートの説明の数は均等に保ってください。
カスタムルーター
ルーターは、単純なルールにすることもできます。
ChatModel chatModel = RoutingChatModel.builder()
.route("simple", smallModel)
.route("complex", largeModel)
.router(request -> ChatModelRoutingResult.route(
request.chatRequest().messages().size() > 20 ? "complex" : "simple"))
.defaultRoute("simple")
.build();
ルーターは、ChatRequest、呼び出しのオプション、およびそれを処理できるルート(ChatModelRoute:
名前と説明)を受け取ります。
ルーターは、validate(...) を実装することで、ルーティングチャットモデルの作成時にルートを検証することもできます。