A Microsoft adicionou à biblioteca Microsoft.Extensions.AI quatro tipos experimentais para gerenciar o roteamento e o failover de solicitações de IA entre modelos ou provedores de serviços. Todos esses tipos funcionam como implementações da interface IChatClient, permitindo seu uso na arquitetura atual da biblioteca para lidar com limitações de custo, disponibilidade e tempo de resposta.
Ferramentas de roteamento e failover
RoutingChatClient representa a classe básica que escolhe um cliente adequado para cada solicitação e então encaminha a chamada a ele. Ele pode ser criado por meio de uma simples função de retorno de chamada ou estendido redefinindo SelectClientAsync para aplicar políticas de roteamento mais complexas ou baseadas no estado da aplicação.
Já o SemanticRoutingChatClient roteia as solicitações com base em seu significado. O desenvolvedor fornece à biblioteca exemplos de frases associadas a cada cliente; em seguida, a última mensagem do usuário é convertida em um embedding e comparada aos exemplos para escolher o cliente com a maior similaridade acima do limite definido. Se nenhuma correspondência ultrapassar o limite, o cliente padrão será usado.
Os embeddings dos exemplos de rotas são criados sob demanda e armazenados em cache. Configurações como scoreThreshold, topK e scoreAggregation permitem controlar a similaridade mínima e o número de exemplos usados para agregar o resultado, com a possibilidade de usar a média ou a soma. Por padrão, o tipo também descarta os clientes e o gerador de embeddings quando é descartado, comportamento que pode ser desativado por meio de leaveOpen.
Failover e monitoramento das tentativas
O FailoverChatClient amplia os recursos de roteamento adicionando um loop de novas tentativas. Se o cliente escolhido falhar antes que qualquer saída de streaming chegue ao chamador, o tipo chama novamente SelectClientAsync para escolher outro cliente. Depois que o envio das saídas começa, a falha é considerada definitiva e o sistema não realiza recuperação durante o streaming.
A classe fornece OnRoutingUpdateAsync para monitorar cada tentativa, independentemente de ela terminar com sucesso, falha ou ser abandonada. O registro da tentativa inclui o cliente chamado, a duração da execução, a exceção, se houver, e se a resposta foi concluída ou se uma saída de streaming chegou ao chamador, além do tempo até a primeira atualização quando aplicável. Esses dados podem ser usados para avaliar o desempenho dos provedores ou criar políticas como circuit breaker e ordenar os clientes de acordo com o tempo de resposta.
O OrderedFailoverChatClient oferece uma implementação pronta desse mecanismo: ele recebe uma lista ordenada de clientes e os testa em sequência. Quando todas as opções falham, a última exceção é propagada novamente. MaximumAttemptsPerRequest define o número máximo de chamadas por solicitação, e a seleção de um novo cliente também é interrompida quando o token de cancelamento da solicitação é cancelado.
Considerações para criar políticas de roteamento
A publicação alerta contra o redirecionamento em cada turno da conversa sem considerar sua natureza. Modelos de raciocínio podem depender de conteúdo codificado ou de tokens de continuação associados a um provedor específico, e a mudança para outro modelo ou provedor pode fazer perder o benefício do cache do prompt e refazer o custo de computá-lo.
Para conversas com múltiplos turnos, a publicação sugere fixar a rota usando um identificador de sessão controlado pelo próprio serviço, em vez de depender do ConversationId específico do provedor. A rota escolhida pode ser armazenada no estado da sessão ou em IDistributedCache, e só deve ser fixada depois que a resposta for concluída com sucesso.
Outras políticas que podem ser criadas incluem roteamento com base em tempo de resposta, integridade, custo, capacidades e região geográfica, além da composição de vários roteadores, já que cada um deles funciona como um IChatClient. No entanto, essas ferramentas não executam roteamento sequencial com base na qualidade de uma resposta bem-sucedida, não executam vários clientes e combinam seus resultados, nem competem entre clientes para escolher a primeira resposta; esses cenários exigem um cliente que execute mais de uma chamada.
Disponibilidade e status experimental
Os tipos RoutingChatClient, RoutingContext, FailoverChatClient, FailoverChatClientAttempt, OrderedFailoverChatClient e SemanticRoutingChatClient ficaram disponíveis na versão 10.9.0 do Microsoft.Extensions.AI. Todos estão marcados como experimentais usando o identificador de diagnóstico MEAI001. O pacote pode ser adicionado com o comando dotnet add package Microsoft.Extensions.AI.