320 lines
8.0 KiB
Markdown
320 lines
8.0 KiB
Markdown
# Guia de Integracao Langfuse
|
|
|
|
Este guia explica como o Langfuse esta integrado ao assistente e como utilizar suas funcionalidades de scoring e observabilidade.
|
|
|
|
## Indice
|
|
|
|
- [O que e Langfuse](#o-que-e-langfuse)
|
|
- [Configuracao Inicial](#configuracao-inicial)
|
|
- [Sistema de Scores](#sistema-de-scores)
|
|
- [Adicionando Novos Scores](#adicionando-novos-scores)
|
|
- [Visualizando Metricas](#visualizando-metricas)
|
|
- [Boas Praticas](#boas-praticas)
|
|
|
|
## O que e Langfuse
|
|
|
|
Langfuse e uma plataforma de observabilidade para aplicacoes LLM que permite:
|
|
|
|
- Rastrear todas as chamadas ao modelo
|
|
- Adicionar scores e metricas customizadas
|
|
- Analisar performance e custos
|
|
- Debugar conversas problematicas
|
|
|
|
## Configuracao Inicial
|
|
|
|
### 1. Credenciais
|
|
|
|
As credenciais do Langfuse sao armazenadas no AWS Secrets Manager:
|
|
|
|
```python
|
|
# Recuperando credenciais
|
|
from tools import secrets
|
|
import json
|
|
|
|
secrets_data = json.loads(secrets.get_secret())
|
|
public_key = secrets_data['api-langfuse-public']
|
|
secret_key = secrets_data['api-langfuse-secret']
|
|
```
|
|
|
|
### 2. Inicializacao do Cliente
|
|
|
|
```python
|
|
from langfuse import Langfuse
|
|
from langfuse.langchain import CallbackHandler
|
|
|
|
# Cliente principal para spans e scores
|
|
langfuse = Langfuse(
|
|
public_key=public_key,
|
|
secret_key=secret_key,
|
|
host="http://SEU_HOST_LANGFUSE:3000"
|
|
)
|
|
|
|
# Callback handler para integracao automatica com LangChain
|
|
langfuse_handler = CallbackHandler()
|
|
```
|
|
|
|
### 3. Integracao com LangGraph
|
|
|
|
```python
|
|
# Adicionar o handler na configuracao do agente
|
|
config = {
|
|
"configurable": {"thread_id": "abc123"},
|
|
"callbacks": [langfuse_handler]
|
|
}
|
|
|
|
# Executar o agente
|
|
for step in agent_executor.stream({"messages": input_message}, config, stream_mode="values"):
|
|
# processamento...
|
|
pass
|
|
|
|
# IMPORTANTE: Flush para garantir envio dos dados
|
|
langfuse.flush()
|
|
```
|
|
|
|
## Sistema de Scores
|
|
|
|
### Scores Atuais
|
|
|
|
O sistema atual utiliza os seguintes scores:
|
|
|
|
| Score | Tipo | Descricao |
|
|
|-------|------|-----------|
|
|
| `Miss` | CATEGORICAL | Indica quando o agente nao encontrou a resposta |
|
|
| `Origem` | CATEGORICAL | Canal de origem da pergunta (web, app, etc.) |
|
|
| `Email` | CATEGORICAL | Email do usuario para rastreabilidade |
|
|
|
|
### Como os Scores sao Registrados
|
|
|
|
```python
|
|
# Score de "Miss" - quando nao encontra resposta
|
|
@tool
|
|
def out_of_scope_and_dont_know_answer():
|
|
with langfuse.start_as_current_span(name="my-operation") as span:
|
|
span.score_trace(
|
|
name="Miss",
|
|
value="True",
|
|
data_type="CATEGORICAL"
|
|
)
|
|
return "Mensagem de resposta padrao..."
|
|
|
|
# Scores de metadados - origem e email
|
|
with langfuse.start_as_current_span(name="my-operation") as span:
|
|
span.score_trace(
|
|
name="Origem",
|
|
value=origem,
|
|
data_type="CATEGORICAL"
|
|
)
|
|
span.score_trace(
|
|
name="Email",
|
|
value=email,
|
|
data_type="CATEGORICAL"
|
|
)
|
|
```
|
|
|
|
## Adicionando Novos Scores
|
|
|
|
### Tipos de Score Disponiveis
|
|
|
|
1. **CATEGORICAL** - Para valores de categorias (string)
|
|
2. **NUMERIC** - Para valores numericos (int/float)
|
|
3. **BOOLEAN** - Para valores verdadeiro/falso
|
|
|
|
### Exemplos de Novos Scores
|
|
|
|
#### Score de Satisfacao do Usuario
|
|
|
|
```python
|
|
def add_user_satisfaction_score(span, satisfaction_rating):
|
|
"""
|
|
Adiciona score de satisfacao do usuario (1-5)
|
|
"""
|
|
span.score_trace(
|
|
name="user_satisfaction",
|
|
value=satisfaction_rating,
|
|
data_type="NUMERIC"
|
|
)
|
|
```
|
|
|
|
#### Score de Tempo de Resposta
|
|
|
|
```python
|
|
import time
|
|
|
|
def add_response_time_score(span, start_time):
|
|
"""
|
|
Adiciona score de tempo de resposta em segundos
|
|
"""
|
|
response_time = time.time() - start_time
|
|
span.score_trace(
|
|
name="response_time_seconds",
|
|
value=response_time,
|
|
data_type="NUMERIC"
|
|
)
|
|
```
|
|
|
|
#### Score de Documentos Consultados
|
|
|
|
```python
|
|
def add_documents_used_score(span, num_documents):
|
|
"""
|
|
Registra quantos documentos foram consultados
|
|
"""
|
|
span.score_trace(
|
|
name="documents_consulted",
|
|
value=num_documents,
|
|
data_type="NUMERIC"
|
|
)
|
|
```
|
|
|
|
#### Score de Qualidade da Resposta
|
|
|
|
```python
|
|
def add_response_quality_score(span, quality_level):
|
|
"""
|
|
Classifica qualidade da resposta
|
|
Valores: "excellent", "good", "fair", "poor"
|
|
"""
|
|
span.score_trace(
|
|
name="response_quality",
|
|
value=quality_level,
|
|
data_type="CATEGORICAL"
|
|
)
|
|
```
|
|
|
|
#### Score de Feedback Explicito
|
|
|
|
```python
|
|
def add_feedback_score(span, was_helpful):
|
|
"""
|
|
Registra se o usuario achou a resposta util
|
|
"""
|
|
span.score_trace(
|
|
name="user_found_helpful",
|
|
value="True" if was_helpful else "False",
|
|
data_type="CATEGORICAL"
|
|
)
|
|
```
|
|
|
|
### Implementacao Completa de Scoring
|
|
|
|
```python
|
|
class LangfuseScorer:
|
|
"""
|
|
Classe utilitaria para gerenciar scores do Langfuse
|
|
"""
|
|
|
|
def __init__(self, langfuse_client):
|
|
self.langfuse = langfuse_client
|
|
|
|
def score_interaction(self, span, metrics: dict):
|
|
"""
|
|
Adiciona multiplos scores de uma vez
|
|
|
|
Args:
|
|
span: Span atual do Langfuse
|
|
metrics: Dicionario com metricas
|
|
{
|
|
"origem": "web",
|
|
"email": "user@example.com",
|
|
"response_time": 2.5,
|
|
"documents_used": 3,
|
|
"found_answer": True
|
|
}
|
|
"""
|
|
# Scores categoricos
|
|
if "origem" in metrics:
|
|
span.score_trace(name="Origem", value=metrics["origem"], data_type="CATEGORICAL")
|
|
|
|
if "email" in metrics:
|
|
span.score_trace(name="Email", value=metrics["email"], data_type="CATEGORICAL")
|
|
|
|
# Scores numericos
|
|
if "response_time" in metrics:
|
|
span.score_trace(name="response_time", value=metrics["response_time"], data_type="NUMERIC")
|
|
|
|
if "documents_used" in metrics:
|
|
span.score_trace(name="documents_used", value=metrics["documents_used"], data_type="NUMERIC")
|
|
|
|
# Scores booleanos (como categoricos)
|
|
if "found_answer" in metrics:
|
|
span.score_trace(
|
|
name="found_answer",
|
|
value="True" if metrics["found_answer"] else "False",
|
|
data_type="CATEGORICAL"
|
|
)
|
|
```
|
|
|
|
## Visualizando Metricas
|
|
|
|
### Acessando o Dashboard
|
|
|
|
1. Acesse a interface web do Langfuse: `http://SEU_HOST:3000`
|
|
2. Navegue ate "Traces" para ver todas as execucoes
|
|
3. Use filtros por score para analises especificas
|
|
|
|
### Queries Uteis
|
|
|
|
#### Encontrar conversas sem resposta
|
|
- Filtrar por: `score.Miss = "True"`
|
|
|
|
#### Analise por canal de origem
|
|
- Agrupar por: `score.Origem`
|
|
|
|
#### Metricas de performance
|
|
- Ordenar por: `score.response_time`
|
|
|
|
## Boas Praticas
|
|
|
|
### 1. Sempre fazer Flush
|
|
|
|
```python
|
|
# No final de cada execucao
|
|
langfuse.flush()
|
|
```
|
|
|
|
### 2. Usar Nomes Consistentes
|
|
|
|
```python
|
|
# BOM - nomes consistentes e descritivos
|
|
span.score_trace(name="user_satisfaction", value=5, data_type="NUMERIC")
|
|
span.score_trace(name="response_quality", value="good", data_type="CATEGORICAL")
|
|
|
|
# EVITAR - nomes inconsistentes
|
|
span.score_trace(name="sat", value=5, data_type="NUMERIC")
|
|
span.score_trace(name="Quality", value="good", data_type="CATEGORICAL")
|
|
```
|
|
|
|
### 3. Documentar Valores Possiveis
|
|
|
|
Para scores CATEGORICAL, documente os valores possiveis:
|
|
|
|
```python
|
|
# response_quality: "excellent" | "good" | "fair" | "poor"
|
|
# user_type: "vendor" | "subvendor" | "supervendor" | "support"
|
|
# channel: "web" | "api" | "whatsapp" | "slack"
|
|
```
|
|
|
|
### 4. Tratar Erros
|
|
|
|
```python
|
|
try:
|
|
with langfuse.start_as_current_span(name="operation") as span:
|
|
span.score_trace(name="metric", value=value, data_type="CATEGORICAL")
|
|
except Exception as e:
|
|
print(f"Erro ao registrar score: {e}")
|
|
# Continua execucao sem falhar
|
|
```
|
|
|
|
### 5. Nao Bloquear por Metricas
|
|
|
|
```python
|
|
# Scores nao devem impactar a resposta ao usuario
|
|
# Se o Langfuse falhar, a conversa deve continuar
|
|
```
|
|
|
|
## Referencias
|
|
|
|
- [Documentacao Oficial Langfuse](https://langfuse.com/docs)
|
|
- [Langfuse Python SDK](https://langfuse.com/docs/sdk/python)
|
|
- [Integracao LangChain](https://langfuse.com/docs/integrations/langchain)
|