Roteador
src.roteador
Roteador de intencoes do Pede AI.
Classifica mensagens do usuario em intencoes pre-definidas utilizando cadeia de estrategias: lookup direto, RAG com embeddings e LLM como fallback.
Example
ResultadoClassificacao(intent: str, confidence: float, caminho: Literal['lookup', 'rag_forte', 'llm_rag', 'llm_fixo'], top1_texto: str, top1_intencao: str, mensagem_norm: str, metadados: dict = dict())
dataclass
Resultado completo da classificacao de intencao.
Attributes:
| Name | Type | Description |
|---|---|---|
intent |
str
|
Nome da intencao classificada. |
confidence |
float
|
Nivel de confianca (0.0 a 1.0). |
caminho |
Literal['lookup', 'rag_forte', 'llm_rag', 'llm_fixo']
|
Estrategia usada ('lookup', 'rag_forte', 'llm_rag', 'llm_fixo'). |
top1_texto |
str
|
Texto do exemplo mais similar. |
top1_intencao |
str
|
Intencao do exemplo mais similar. |
mensagem_norm |
str
|
Mensagem original normalizada. |
metadados |
dict
|
Rastro de cada camada para debug (opcional). |
__hash__() -> int
Hash baseado em campos hashable (ignora metadados dict).
Source code in src/roteador/modelos.py
ClassificadorIntencoes(llm: LLMProvider, embedding_service: EmbeddingService, config: RoteadorConfig, prompt_template: str, intencoes_validas: list[str])
Classificador de intencoes com cadeia lookup -> RAG -> LLM.
Orquestra tres estrategias de classificacao em ordem de confianca: 1. Lookup direto de tokens unicos (exato, confianca 1.0) 2. RAG com similaridade de embeddings (probabilistico) 3. LLM puro como fallback definitivo (sempre retorna algo)
Inicializa o classificador com todos os componentes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
llm
|
LLMProvider
|
Provider concreto de LLM para validacao e fallback. |
required |
embedding_service
|
EmbeddingService
|
Servico de embeddings para busca RAG. |
required |
config
|
RoteadorConfig
|
Configuracao com thresholds e prioridades. |
required |
prompt_template
|
str
|
Template do prompt de classificacao LLM. |
required |
intencoes_validas
|
list[str]
|
Lista de intents validas para validacao. |
required |
Source code in src/roteador/service.py
classificar(mensagem: str) -> ResultadoClassificacao
Classifica a intencao da mensagem usando cadeia de estrategias.
Tenta lookup direto, depois RAG, e por fim LLM como fallback.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto bruto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
ResultadoClassificacao
|
ResultadoClassificacao com intent, confianca e metadata. |
Example
Source code in src/roteador/service.py
classificar_simples(mensagem: str) -> str
API compativel — retorna so a intent.
Mantem compatibilidade com a API antiga classificar_intencao(mensagem) -> str.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto bruto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
str
|
Nome da intencao classificada. |
Source code in src/roteador/service.py
src.roteador.service
Orquestrador do classificador de intencoes.
Coordena a cadeia de classificadores: lookup -> RAG -> LLM fallback. Ponto de entrada principal para classificacao de intencoes.
Example
ClassificadorIntencoes(llm: LLMProvider, embedding_service: EmbeddingService, config: RoteadorConfig, prompt_template: str, intencoes_validas: list[str])
Classificador de intencoes com cadeia lookup -> RAG -> LLM.
Orquestra tres estrategias de classificacao em ordem de confianca: 1. Lookup direto de tokens unicos (exato, confianca 1.0) 2. RAG com similaridade de embeddings (probabilistico) 3. LLM puro como fallback definitivo (sempre retorna algo)
Inicializa o classificador com todos os componentes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
llm
|
LLMProvider
|
Provider concreto de LLM para validacao e fallback. |
required |
embedding_service
|
EmbeddingService
|
Servico de embeddings para busca RAG. |
required |
config
|
RoteadorConfig
|
Configuracao com thresholds e prioridades. |
required |
prompt_template
|
str
|
Template do prompt de classificacao LLM. |
required |
intencoes_validas
|
list[str]
|
Lista de intents validas para validacao. |
required |
Source code in src/roteador/service.py
classificar(mensagem: str) -> ResultadoClassificacao
Classifica a intencao da mensagem usando cadeia de estrategias.
Tenta lookup direto, depois RAG, e por fim LLM como fallback.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto bruto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
ResultadoClassificacao
|
ResultadoClassificacao com intent, confianca e metadata. |
Example
Source code in src/roteador/service.py
classificar_simples(mensagem: str) -> str
API compativel — retorna so a intent.
Mantem compatibilidade com a API antiga classificar_intencao(mensagem) -> str.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto bruto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
str
|
Nome da intencao classificada. |
Source code in src/roteador/service.py
src.roteador.modelos
Value objects imutaveis para classificacao de intencoes.
Todos os models sao frozen dataclasses — representam valores, nao entidades.
Example
ResultadoClassificacao(intent: str, confidence: float, caminho: Literal['lookup', 'rag_forte', 'llm_rag', 'llm_fixo'], top1_texto: str, top1_intencao: str, mensagem_norm: str, metadados: dict = dict())
dataclass
Resultado completo da classificacao de intencao.
Attributes:
| Name | Type | Description |
|---|---|---|
intent |
str
|
Nome da intencao classificada. |
confidence |
float
|
Nivel de confianca (0.0 a 1.0). |
caminho |
Literal['lookup', 'rag_forte', 'llm_rag', 'llm_fixo']
|
Estrategia usada ('lookup', 'rag_forte', 'llm_rag', 'llm_fixo'). |
top1_texto |
str
|
Texto do exemplo mais similar. |
top1_intencao |
str
|
Intencao do exemplo mais similar. |
mensagem_norm |
str
|
Mensagem original normalizada. |
metadados |
dict
|
Rastro de cada camada para debug (opcional). |
__hash__() -> int
Hash baseado em campos hashable (ignora metadados dict).
Source code in src/roteador/modelos.py
ExemploClassificacao(texto: str, intencao: str)
dataclass
Exemplo de treinamento para RAG.
Attributes:
| Name | Type | Description |
|---|---|---|
texto |
str
|
Texto da mensagem de exemplo. |
intencao |
str
|
Intencao correta rotulada. |
ExemploSimilar(texto: str, intencao: str, similaridade: float)
dataclass
Exemplo similar encontrado via embedding.
Attributes:
| Name | Type | Description |
|---|---|---|
texto |
str
|
Texto da mensagem de exemplo. |
intencao |
str
|
Intencao rotulada do exemplo. |
similaridade |
float
|
Similaridade cosseno com a query (0.0 a 1.0). |
src.roteador.protocolos
Protocolos (interfaces) para providers de LLM e Embedding.
Define contratos que qualquer implementacao concreta deve seguir. Usa typing.Protocol para duck typing — nao requer heranca.
Example
LLMProvider
Bases: Protocol
Interface para qualquer provedor de LLM.
Qualquer classe com o metodo 'completar' e compativel, independente de heranca (duck typing via Protocol).
completar(prompt: str, max_tokens: int = 10) -> str
Envia prompt ao LLM e retorna resposta texto.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
prompt
|
str
|
Texto do prompt para o LLM. |
required |
max_tokens
|
int
|
Maximo de tokens na resposta. |
10
|
Returns:
| Type | Description |
|---|---|
str
|
Texto da resposta do LLM. |
Source code in src/roteador/protocolos.py
EmbeddingProvider
Bases: Protocol
Interface para qualquer servico de embeddings.
Qualquer classe com os metodos 'embed' e 'embed_batch' e compativel, independente de heranca.
embed(texto: str) -> list[float]
Gera embedding para um texto.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto para gerar embedding. |
required |
Returns:
| Type | Description |
|---|---|
list[float]
|
Lista de floats representando o embedding. |
embed_batch(textos: list[str]) -> list[list[float]]
Gera embeddings para multiplos textos.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
textos
|
list[str]
|
Lista de textos para gerar embeddings. |
required |
Returns:
| Type | Description |
|---|---|
list[list[float]]
|
Lista de embeddings (lista de listas de floats). |
src.roteador.embedding_service
Servico de embeddings com cache e busca por similaridade.
Gerencia exemplos, embeddings cacheados e busca por similaridade cosseno via numpy.
Example
EmbeddingService(provider: EmbeddingProvider, exemplos_path: Path, cache_path: Path)
Gerencia exemplos, embeddings e busca por similaridade.
Carrega exemplos de JSON e embeddings do cache na inicializacao. Gera embeddings sob demanda via provider injetado.
Inicializa o servico de embeddings.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
provider
|
EmbeddingProvider
|
Provider concreto de embeddings. |
required |
exemplos_path
|
Path
|
Caminho do arquivo JSON de exemplos. |
required |
cache_path
|
Path
|
Caminho do arquivo JSON de embeddings cacheados. |
required |
Source code in src/roteador/embedding_service.py
exemplos: list[ExemploClassificacao]
property
Retorna lista de exemplos carregados.
tem_embeddings: bool
property
Retorna True se ha embeddings carregados.
buscar_similares(mensagem: str, top_k: int = 5, min_similarity: float = 0.55) -> list[ExemploSimilar]
Busca top-k exemplos mais similares a mensagem.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
top_k
|
int
|
Numero de resultados a retornar. |
5
|
min_similarity
|
float
|
Similaridade minima para incluir exemplo. |
0.55
|
Returns:
| Type | Description |
|---|---|
list[ExemploSimilar]
|
Lista de ExemploSimilar ordenada por similaridade decrescente. |
Source code in src/roteador/embedding_service.py
gerar_embedding(texto: str) -> list[float]
Gera embedding para um texto via provider.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto para gerar embedding. |
required |
Returns:
| Type | Description |
|---|---|
list[float]
|
Lista de floats representando o embedding. |
Source code in src/roteador/embedding_service.py
atualizar_cache() -> None
Regenera embeddings faltando e salva cache.
Gera embeddings apenas para exemplos cujos hashes nao estao no cache,
e salva no formato 2: {"format": 2, "embeddings": {hash: emb, ...}}.
Source code in src/roteador/embedding_service.py
src.roteador.voting
Estrategia de votacao consolidada para classificacao RAG.
Consolida as 4 funcoes antigas (votacao_max, hybrid, com_prioridade, wrapper) em uma unica funcao com logica clara.
Example
votar_com_prioridade(exemplos: list[ExemploSimilar], alta_prioridade: frozenset[str], min_similarity: float = 0.55) -> str
Votacao com prioridade de intents no top-K.
Regras (em ordem): 1. Se top-1 >= 0.98: confia direto no top-1 (match quase identico). 2. Se ha intent de alta prioridade no top-K com similaridade >= min_similarity: retorna a de maior similaridade entre as prioritarias. 3. Fallback: maioria simples (voto majoritario).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
exemplos
|
list[ExemploSimilar]
|
Lista de exemplos similares ordenados por similaridade decrescente. |
required |
alta_prioridade
|
frozenset[str]
|
Conjunto de intents de alta prioridade. |
required |
min_similarity
|
float
|
Similaridade minima para considerar intent prioritaria. |
0.55
|
Returns:
| Type | Description |
|---|---|
str
|
Nome da intencao vencedora ou 'desconhecido' se lista vazia. |
Example
Source code in src/roteador/voting.py
src.roteador.classificadores.base
Classificadores de intencao — base abstrata.
Define a interface comum para todos os classificadores.
Example
ClassificadorBase
Bases: ABC
Base para classificadores de intencao.
Cada classificador implementa a logica de uma estrategia especifica. Retorna ResultadoClassificacao se conseguir classificar, None se a mensagem nao se encaixa nesta estrategia.
classificar(mensagem: str) -> ResultadoClassificacao | None
abstractmethod
Classifica a mensagem.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto normalizado do usuario. |
required |
Returns:
| Type | Description |
|---|---|
ResultadoClassificacao | None
|
ResultadoClassificacao se conseguir classificar, |
ResultadoClassificacao | None
|
None se nao for responsabilidade deste classificador. |
Source code in src/roteador/classificadores/base.py
src.roteador.classificadores.lookup
Classificador por lookup direto de tokens unicos.
Para palavras isoladas como 'sim', 'nao', 'oi', 'cancela' — match exato e mais confiavel que embedding.
Example
ClassificadorLookup(tokens_unicos: dict[str, str] | None = None)
Bases: ClassificadorBase
Lookup direto de tokens unicos.
Faz match exato da mensagem normalizada contra um dicionario de tokens unicos. Se encontrar, retorna com confianca 1.0.
Inicializa o classificador de lookup.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tokens_unicos
|
dict[str, str] | None
|
Dicionario token -> intencao. Usa TOKENS_UNICOS padrao se None. |
None
|
Source code in src/roteador/classificadores/lookup.py
classificar(mensagem: str) -> ResultadoClassificacao | None
Tenta classificar por match exato.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto normalizado do usuario. |
required |
Returns:
| Type | Description |
|---|---|
ResultadoClassificacao | None
|
ResultadoClassificacao se match encontrado, None caso contrario. |
Example
Source code in src/roteador/classificadores/lookup.py
src.roteador.classificadores.rag
Classificador por similaridade de embeddings (RAG).
Busca exemplos similares via embedding, vota com prioridade, e valida com LLM quando confianca e media.
Example
ClassificadorRAG(embedding_service: EmbeddingService, config: RoteadorConfig, llm: LLMProvider, prompt_template: str, intencoes_validas: list[str])
Bases: ClassificadorBase
Classificacao por similaridade de embeddings (RAG).
Fluxo: 1. Busca top-K exemplos similares via EmbeddingService. 2. Se nenhum similar >= min_similarity: retorna None (proximo classificador). 3. Se confidence >= rag_forte_threshold: vota e retorna direto. 4. Se confidence >= rag_fraco_threshold: valida com LLM e retorna. 5. Se confidence < rag_fraco_threshold: retorna None (LLM fallback assume).
Inicializa o classificador RAG.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
embedding_service
|
EmbeddingService
|
Servico de embeddings para busca. |
required |
config
|
RoteadorConfig
|
Configuracao do roteador com thresholds. |
required |
llm
|
LLMProvider
|
Provider LLM para validacao. |
required |
prompt_template
|
str
|
Template do prompt de classificacao. |
required |
intencoes_validas
|
list[str]
|
Lista de intents validas. |
required |
Source code in src/roteador/classificadores/rag.py
classificar(mensagem: str) -> ResultadoClassificacao | None
Classifica via RAG com similaridade de embeddings.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto normalizado do usuario. |
required |
Returns:
| Type | Description |
|---|---|
ResultadoClassificacao | None
|
ResultadoClassificacao se classificou, None se nao ha confianca. |
Source code in src/roteador/classificadores/rag.py
src.roteador.classificadores.llm
Classificador LLM puro — fallback definitivo.
Quando RAG e lookup nao conseguem classificar, o LLM assume. Sempre retorna um resultado — nunca retorna None.
Example
ClassificadorLLM(llm: LLMProvider, prompt_template: str, intencoes_validas: list[str])
Bases: ClassificadorBase
Fallback com LLM puro.
Usa prompt fixo para classificar a mensagem. Nunca retorna None — e o fallback definitivo.
Inicializa o classificador LLM.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
llm
|
LLMProvider
|
Provider concreto de LLM. |
required |
prompt_template
|
str
|
Template do prompt com placeholder {mensagem}. |
required |
intencoes_validas
|
list[str]
|
Lista de intents validas para validacao. |
required |
Source code in src/roteador/classificadores/llm.py
classificar(mensagem: str) -> ResultadoClassificacao
Classifica via LLM puro — sempre retorna algo.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
ResultadoClassificacao
|
ResultadoClassificacao com intent do LLM. |
ResultadoClassificacao
|
Confidence 1.0 (confianca total no fallback). |