Observabilidade
src.observabilidade
Módulo de observabilidade para classificação de intents.
Este módulo fornece ferramentas para registrar e analisar eventos de classificação do Pede AI. Permite:
- Registrar eventos: Cada classificação é logada em um CSV com detalhes como confiança, caminho usado (lookup, RAG, LLM) e o exemplo mais similar.
- Analisar dados: Consultas DuckDB prontas para extrair insights dos logs, como casos de baixa confiança e distribuição de caminhos.
Componentes principais:
ObservabilidadeLogger: Logger thread-safe para registrar eventos de classificação em CSV.
Example
from src.observabilidade import ObservabilidadeLogger
from src.observabilidade.consultas import distribuicao_caminhos
# Registrar evento
logger = ObservabilidadeLogger('logs/eventos.csv')
logger.registrar(
thread_id='sessao_123',
mensagem='Quero um X-Burguer',
mensagem_norm='querer x-burguer',
intent='pedido_lanche',
confidence=0.95,
caminho='rag_forte',
top1_texto='quero um x-burguer',
top1_intencao='pedido_lanche',
)
# Analisar distribuição de caminhos
dist = distribuicao_caminhos('logs/eventos.csv')
for item in dist:
print(f'{item["caminho"]}: {item["total"]} eventos')
Note
Os logs são armazenados em CSV para facilitar análise posterior com DuckDB, pandas ou ferramentas de visualização.
See Also
ObservabilidadeLogger: Classe principal para registrar eventos.src.observabilidade.consultas: Funções de análise com DuckDB.
ClarificacaoLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar eventos de clarificacao.
Source code in src/observabilidade/base_logger.py
ExtracaoLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar eventos de extracao de itens.
Source code in src/observabilidade/base_logger.py
FunilLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar transicoes no funil.
Source code in src/observabilidade/base_logger.py
HandlerLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar execucoes de handlers.
Source code in src/observabilidade/base_logger.py
ObservabilidadeLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar eventos de classificacao.
Source code in src/observabilidade/base_logger.py
registrar(thread_id: str, mensagem: str, mensagem_norm: str, intent: str, confidence: float, caminho: str, top1_texto: str, top1_intencao: str, lookup: str = '', rag_top1: str = '', rag_sim: str = '', rag_intent: str = '', llm_raw: str = '', llm_intent: str = '') -> None
Registra um evento de classificacao no CSV.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
lookup
|
str
|
Intencao encontrada por lookup (ou vazio). |
''
|
rag_top1
|
str
|
Texto do top1 do RAG (ou vazio). |
''
|
rag_sim
|
str
|
Similaridade do top1 do RAG (ou vazio). |
''
|
rag_intent
|
str
|
Intencao do top1 do RAG (ou vazio). |
''
|
llm_raw
|
str
|
Resposta crua do LLM (ou vazio). |
''
|
llm_intent
|
str
|
Intencao extraida do LLM (ou vazio). |
''
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Se |
Source code in src/observabilidade/logger.py
get_clarificacao_logger() -> ClarificacaoLogger | None
get_extracao_logger() -> ExtracaoLogger | None
get_funil_logger() -> FunilLogger | None
get_handler_logger() -> HandlerLogger | None
get_obs_logger() -> ObservabilidadeLogger
set_clarificacao_logger(logger: ClarificacaoLogger | None) -> None
set_extracao_logger(logger: ExtracaoLogger | None) -> None
set_funil_logger(logger: FunilLogger | None) -> None
set_handler_logger(logger: HandlerLogger | None) -> None
src.observabilidade.base_logger
Classe base para loggers CSV thread-safe.
Elimina boilerplate duplicado em todos os loggers de observabilidade.
Cada logger concreto precisa implementar apenas headers e _to_row.
Example
BaseCsvLogger(csv_path: Path | str)
Bases: ABC
Classe base abstrata para loggers CSV thread-safe.
Subclasses devem implementar:
- headers: propriedade com lista de colunas do CSV.
- _to_row(**kwargs): metodo que converte kwargs em lista de valores.
Inicializa o logger criando o arquivo CSV se necessario.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
csv_path
|
Path | str
|
Caminho para o arquivo CSV. |
required |
Source code in src/observabilidade/base_logger.py
headers: list[str]
abstractmethod
property
Retorna lista de colunas do CSV.
csv_path: Path
property
Retorna caminho absoluto do arquivo CSV.
registrar(**kwargs: str | float | int | None) -> None
Registra uma linha no CSV de forma thread-safe.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
**kwargs
|
str | float | int | None
|
Dados a registrar (str, float, int ou None). Serão convertidos via _to_row(). |
{}
|
Source code in src/observabilidade/base_logger.py
src.observabilidade.registry
Registry central para loggers de observabilidade.
Usa dict interno em vez de variaveis de modulo — zero global statements.
Mantem aliases retroativos para compatibilidade com codigo existente.
Example
LoggerRegistry()
Registry central para loggers — sem globals.
Usa dict interno para armazenar loggers por nome.
Source code in src/observabilidade/registry.py
get(nome: str) -> object | None
set(nome: str, logger: object) -> None
get_required(nome: str) -> object
Retorna logger ou levanta RuntimeError se nao configurado.
Source code in src/observabilidade/registry.py
get_logger(nome: str) -> object | None
set_logger(nome: str, logger: object) -> None
get_required_logger(nome: str) -> object
reset_loggers() -> None
get_obs_logger() -> ObservabilidadeLogger
set_obs_logger(logger: ObservabilidadeLogger) -> None
get_clarificacao_logger() -> ClarificacaoLogger | None
set_clarificacao_logger(logger: ClarificacaoLogger | None) -> None
get_extracao_logger() -> ExtracaoLogger | None
set_extracao_logger(logger: ExtracaoLogger | None) -> None
get_handler_logger() -> HandlerLogger | None
set_handler_logger(logger: HandlerLogger | None) -> None
get_funil_logger() -> FunilLogger | None
src.observabilidade.logger
Logger de observabilidade para classificacao de intents.
Herda BaseCsvLogger — boilerplate CSV e thread safety sao herdados.
CAMINHOS_VALIDOS = frozenset({'lookup', 'rag_forte', 'llm_rag', 'llm_fixo', 'desconhecido'})
module-attribute
Caminhos validos para o parametro caminho.
HEADERS = ['timestamp', 'thread_id', 'mensagem', 'mensagem_norm', 'intent', 'confidence', 'caminho', 'top1_texto', 'top1_intencao', 'lookup', 'rag_top1', 'rag_sim', 'rag_intent', 'llm_raw', 'llm_intent']
module-attribute
Cabecalhos do CSV de eventos de classificacao.
ObservabilidadeLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar eventos de classificacao.
Source code in src/observabilidade/base_logger.py
registrar(thread_id: str, mensagem: str, mensagem_norm: str, intent: str, confidence: float, caminho: str, top1_texto: str, top1_intencao: str, lookup: str = '', rag_top1: str = '', rag_sim: str = '', rag_intent: str = '', llm_raw: str = '', llm_intent: str = '') -> None
Registra um evento de classificacao no CSV.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
lookup
|
str
|
Intencao encontrada por lookup (ou vazio). |
''
|
rag_top1
|
str
|
Texto do top1 do RAG (ou vazio). |
''
|
rag_sim
|
str
|
Similaridade do top1 do RAG (ou vazio). |
''
|
rag_intent
|
str
|
Intencao do top1 do RAG (ou vazio). |
''
|
llm_raw
|
str
|
Resposta crua do LLM (ou vazio). |
''
|
llm_intent
|
str
|
Intencao extraida do LLM (ou vazio). |
''
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Se |
Source code in src/observabilidade/logger.py
src.observabilidade.funil_logger
Logger para progressao no funil de pedidos.
FunilLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar transicoes no funil.
Source code in src/observabilidade/base_logger.py
src.observabilidade.handler_logger
Logger generico para execucao de handlers.
JSON_TRUNCATE_LIMIT = 200
module-attribute
Limite maximo de caracteres para campos JSON serializados.
HandlerLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar execucoes de handlers.
Source code in src/observabilidade/base_logger.py
src.observabilidade.extracao_logger
Logger para eventos de extracao de itens do cardapio.
ExtracaoLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar eventos de extracao de itens.
Source code in src/observabilidade/base_logger.py
src.observabilidade.clarificacao_logger
Logger para eventos de clarificacao de variantes.
ClarificacaoLogger(csv_path: Path | str)
Bases: BaseCsvLogger
Logger thread-safe para registrar eventos de clarificacao.
Source code in src/observabilidade/base_logger.py
src.observabilidade.consultas
Consultas DuckDB para analise de eventos de classificacao.
Paths de arquivo sao interpolados com f-string (controlados internamente).
Valores de usuario (thread_id, limit) usam parametros seguros ?.
Example
baixa_confianca(csv_path: str, limit: int = 20) -> list[dict]
Retorna casos de baixa confianca que foram roteados para o LLM.
Source code in src/observabilidade/consultas.py
distribuicao_caminhos(csv_path: str) -> list[dict]
Retorna a distribuicao de eventos por caminho de classificacao.
Source code in src/observabilidade/consultas.py
extracoes_sem_itens(csv_extracao: str, limit: int = 20) -> list[dict]
Retorna mensagens onde extrator nao encontrou itens.
Source code in src/observabilidade/consultas.py
funil_com_abandono(csv_funil: str, thread_id: str | None = None) -> list[dict]
Analisa sessoes que pararam em etapas intermediarias.
Source code in src/observabilidade/consultas.py
handlers_com_erro(csv_handler: str, limit: int = 20) -> list[dict]
Retorna execucoes de handlers com erro.
Source code in src/observabilidade/consultas.py
tempo_medio_handlers(csv_handler: str) -> list[dict]
Retorna tempo medio por handler.
Source code in src/observabilidade/consultas.py
src.observabilidade.debug_cli
CLI de debug para analisar logs do Pede AI.
ultima_sessao(thread_id: str | None = None) -> None
Mostra a linha do tempo da ultima sessao ou de uma especifica.
Source code in src/observabilidade/debug_cli.py
extracoes_falhas() -> None
Mostra mensagens onde nenhum item foi extraido.
Source code in src/observabilidade/debug_cli.py
erros_handlers() -> None
Mostra erros em handlers.
Source code in src/observabilidade/debug_cli.py
classificar(mensagem: str) -> None
Testa classificacao de uma mensagem sem executar o grafo.
Nota: requer classificador configurado via main.py. Use 'python main.py' para teste interativo completo.
Source code in src/observabilidade/debug_cli.py
extrair_teste(mensagem: str) -> None
Testa extracao de itens de uma mensagem.