Roteamento de Chains
Roteamento de Chains
O que é Roteamento?
O roteamento permite direcionar diferentes tipos de entrada para chains especializadas, criando um sistema inteligente que escolhe automaticamente a melhor abordagem para cada situação.
Resumo: Sistema que direciona inputs para chains especializadas baseado em critérios de categorização
Configuração das Chains Especializadas
Criando Chains por Área de Conhecimento
Primeiro, criamos chains especializadas para diferentes domínios:
from langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatemodel = ChatOpenAI(model="gpt-4o-mini")# Chain para matemáticaprompt_matematica = ChatPromptTemplate.from_template('''Você é um professor de matemática de ensino fundamentalcapaz de dar respostas muito detalhadas e didáticas. Responda a seguinte pergunta de um aluno:Pergunta: {pergunta}''')chain_matematica = prompt_matematica | model# Chain para físicaprompt_fisica = ChatPromptTemplate.from_template('''Você é um professor de física de ensino fundamentalcapaz de dar respostas muito detalhadas e didáticas. Responda a seguinte pergunta de um aluno:Pergunta: {pergunta}''')chain_fisica = prompt_fisica | model# Chain para históriaprompt_historia = ChatPromptTemplate.from_template('''Você é um professor de história de ensino fundamentalcapaz de dar respostas muito detalhadas e didáticas. Responda a seguinte pergunta de um aluno:Pergunta: {pergunta}''')chain_historia = prompt_historia | model# Chain para outras áreasprompt_outro = ChatPromptTemplate.from_template('''Você é um professor de outras áreas de conhecimento de ensino fundamentalcapaz de dar respostas muito detalhadas e didáticas. Responda a seguinte pergunta de um aluno:Pergunta: {pergunta}''')chain_outro = prompt_outro | model
Sistema de Categorização
Definindo o Categorizador com Pydantic
Utilizamos structured output para categorizar automaticamente as perguntas:
Resumo: Classifica perguntas automaticamente usando structured output e Pydantic
from pydantic import BaseModel, Fieldclass Categorizador(BaseModel):"""Categoriza as perguntas de alunos do ensino fundamental"""area_conhecimento: str = Field(description="A área de conhecimento da pergunta feita pelo aluno. ""Deve ser 'física', 'matemática' ou 'história'. ""Caso não se encaixe em nenhuma das três, responda 'outro'.")# Prompt para categorizaçãoprompt_categorizacao = ChatPromptTemplate.from_template('Você deve categorizar a seguinte pergunta de um aluno do ensino fundamental: {pergunta}')# Model com saída estruturadamodel_estruturado = prompt_categorizacao | model.with_structured_output(Categorizador)
Testando o Categorizador
# Exemplo de categorizaçãoresultado = model_estruturado.invoke({"pergunta": "Qual a fórmula da aceleração?"})print(resultado) # Output: Categorizador(area_conhecimento='física')
Implementando o Roteamento
Adicionando Categorização ao Pipeline
Primeiro, adicionamos a categorização mantendo a pergunta original:
Resumo: Mantém dados originais while adiciona categoria para roteamento
from langchain_core.runnables import RunnablePassthrough# Adiciona categoria mantendo a pergunta originalchain_com_categoria = RunnablePassthrough.assign(categoria=model_estruturado)resultado = chain_com_categoria.invoke({"pergunta": "Qual a fórmula da aceleração?"})
Resultado:
{'pergunta': 'Qual a fórmula da aceleração?','categoria': Categorizador(area_conhecimento='física')}
Função de Roteamento
Criamos uma função que decide qual chain usar baseada na categoria:
Resumo: Função que seleciona a chain apropriada baseada na categorização
def route(input):"""Roteia a pergunta para a chain apropriada baseada na categoria"""if input['categoria'].area_conhecimento == 'física':return chain_fisicaelif input['categoria'].area_conhecimento == 'matemática':return chain_matematicaelif input['categoria'].area_conhecimento == 'história':return chain_historiaelse:return chain_outro
Sistema Completo de Roteamento
Chain Final com Roteamento Automático
Combinamos categorização e roteamento em uma única chain:
# Chain completa: categorização + roteamentochain_completa = RunnablePassthrough.assign(categoria=model_estruturado) | route
Exemplos de Uso
Pergunta de História
resposta = chain_completa.invoke({'pergunta': 'Quando foi o ano da independência do Brasil?'})
Fluxo de execução:
- Pergunta é categorizada como "história"
- Roteamento direciona para
chain_historia
- Professor de história responde detalhadamente
Pergunta de Matemática
resposta = chain_completa.invoke({'pergunta': 'Qual o valor exato de pi?'})
Fluxo de execução:
- Pergunta é categorizada como "matemática"
- Roteamento direciona para
chain_matematica
- Professor de matemática responde com detalhes técnicos
Fluxo de Roteamento
Pergunta do Usuário↓Categorização(Structured Output)↓Função de Route↓┌─────────────────┐│ Física? │ → Chain Física│ Matemática? │ → Chain Matemática│ História? │ → Chain História│ Outro? │ → Chain Genérica└─────────────────┘↓Resposta Especializada
Vantagens do Roteamento
Especialização
- Respostas mais precisas e contextualizadas
- Prompts otimizados para cada domínio
- Melhor experiência do usuário
Flexibilidade
- Fácil adição de novas categorias
- Modificação de critérios de roteamento
- Extensível para diferentes casos de uso
Eficiência
- Processamento direcionado
- Reduz ambiguidade nas respostas
- Otimiza uso de tokens
Casos de Uso Avançados
Roteamento Múltiplo
class CategorizadorAvancado(BaseModel):"""Categorização mais detalhada"""area_principal: str = Field(description="Área principal da pergunta")nivel_complexidade: str = Field(description="Básico, intermediário ou avançado")requer_calculo: bool = Field(description="Se a pergunta requer cálculos")
Roteamento Condicional
def route_avancado(input):"""Roteamento baseado em múltiplos critérios"""categoria = input['categoria']if categoria.requer_calculo:return chain_matematica_avancadaelif categoria.nivel_complexidade == 'avançado':return chain_especializadaelse:return route_basico(input)
Boas Práticas
Design de Categorias
- Categorias mutuamente exclusivas
- Critérios claros de classificação
- Categoria padrão para casos não cobertos
Manutenção
- Monitorar acurácia da categorização
- Ajustar prompts baseado em feedback
- Testar com diferentes tipos de entrada
Performance
- Cache de categorizações frequentes
- Otimização de prompts especializados
- Monitoramento de latência
O roteamento de chains permite criar sistemas inteligentes que adaptam automaticamente suas respostas baseadas no contexto e tipo da pergunta, proporcionando experiências mais personalizadas e eficazes.