Model Router
这是 ModelRouter 的文档。它作为路由器,将消息路由到多个 ChatModel 实例,并使用可插拔的 RoutingStrategies。
该模块提供两种默认实现:FailoverStrategy 与 LowestTokenUsageRoutingStrategy。
Maven 依赖
langchain4j-community-model-router 库可在 Maven Central 获取。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-model-router</artifactId>
<version>1.18.1-beta28</version>
</dependency>
FailoverStrategy
FailoverStrategy 按注册顺序将消息发送给第一个可用模型。如果该模型失败(发生错误),消息会立即发送给下一个模型。该策略会在冷却期内忽略失败的 ChatModel,冷却结束后再重试。默认冷却时间为 1 分钟。如果所有模型都失败,将 抛出 NoMatchingModelFoundException。
ChatModel firstModel = AzureOpenAiChatModel.builder()
...
.build();
ChatModel secondModel = OpenAiOfficialChatModel.builder()
...
.build();
ModelRouter router = ModelRouter.builder()
.addRoutes(firstModel, secondModel)
.routingStrategy(new FailoverStrategy(Duration.ofMinutes(5)))
.build();
router.chat(new UserMessage("Provide 3 short bullet points explaining why Java is awesome"));
现在,如果第一个模型失败,消息会发送给第二个模型。
备注
由于 FailoverStrategy 会在某个模型失败时将消息发送给下一个模型,该模型抛出的异常会对调用方隐藏。若要跟踪这些异常,需要注册错误监听器。
LowestTokenUsageRoutingStrategy
LowestTokenUsageRoutingStrategy 将消息发送给总体 token 消耗最少的模型。
ChatModel firstModel = AzureOpenAiChatModel.builder()
...
.build();
ChatModel secondModel = OpenAiOfficialChatModel.builder()
...
.build();
ModelRouter router = ModelRouter.builder()
.addRoutes(firstModel, secondModel)
.routingStrategy(new LowestTokenUsageRoutingStrategy())
.build();
ChatResponse first = router.chat(new UserMessage("Hello")); // uses first model
ChatResponse second = router.chat(new UserMessage("Hello")); // uses second model
ChatResponse third = router.chat(new UserMessage("Hello")); // uses first model
自定义实现
你可以通过实现函数式接口 ModelRoutingStrategy 来编写自己的策略。
interface ModelRoutingStrategy {
/**
* Determines the route key to use for the given chat messages.
*
* @param availableModels
* all configured models, including any routing metadata
* @param chatRequest
* the incoming chat request
* @return the key of the route to use
*/
ChatModelWrapper route(List<ChatModelWrapper> availableModels, ChatRequest chatRequest);
}
例如,如果你有一个上下文窗口较小的模型,以及另一个更贵但上下文窗口更大的模型,可以构建一个简单的路由器,根据消息长度进行路由。 本示例将少于 500 个字符的消息路由到小模型,其余路由到大模型。
ChatModel smallModel = AzureOpenAiChatModel.builder()
// ...
.build();
ChatModel largeModel = OpenAiOfficialChatModel.builder()
// ...
.build();
ModelRouter router = ModelRouter.builder()
.addRoutes(smallModel, largeModel)
.routingStrategy((availableModels, chatRequest) -> {
int totalChars = chatRequest.messages().stream()
.filter(UserMessage.class::isInstance)
.map(UserMessage.class::cast)
.filter(UserMessage::hasSingleText)
.mapToInt(m -> m.singleText().length())
.sum();
return totalChars < 500 ? availableModels.get(0) : availableModels.get(1);
})
.build();
ChatResponse shortMsg = router.chat(new UserMessage("Quick summary?")); // smallModel
ChatResponse longMsg = router.chat(new UserMessage("...very long prompt...")); // largeModel