intermediate45 minLección 3 de 5

Evaluaciones, Datasets y Puntuación LLM-como-Juez

Crea datasets, puntúa salidas manualmente o con un juez LLM y construye pipelines de evaluación automatizados en LangFuse.

Evaluaciones, Datasets y Puntuación LLM-como-Juez

La evaluación es esencial para construir aplicaciones LLM confiables. LangFuse proporciona tres métodos complementarios de evaluación: puntuación manual, LLM-como-juez y cálculo de métricas externas. Esta lección cubre cada enfoque y muestra cómo estructurar datasets, ejecutar evaluaciones y comparar salidas de modelos.


Creando Datasets

Los datasets almacenan pares esperados de entrada-salida (ejemplos dorados). Sirven como verdad fundamental para ejecuciones de evaluación.

python
from langfuse import Langfuse langfuse = Langfuse() # Crear un dataset dataset = langfuse.create_dataset( name="correccion-qa", description="Conjunto de prueba de corrección para Q&A factual" ) # Agregar ítems (entrada + salida esperada) dataset.create_item( input={"question": "¿Cuál es la capital de Francia?"}, expected_output="París" ) dataset.create_item( input={"question": "¿En qué año cayó el Muro de Berlín?"}, expected_output="1989" )
⚠️Warning

Los ítems del dataset son inmutables una vez creados. Para actualizar un caso de prueba, crea una nueva versión del dataset o agrega un nuevo ítem con un ID diferente.

📌Important

El versionado de datasets sigue un modelo lineal. Cuando modificas un dataset (agregas/eliminas ítems), LangFuse crea una nueva versión. Los traces vinculados a versiones anteriores del dataset aún hacen referencia a los ítems originales. Esto garantiza que los resultados históricos de evaluación sigan siendo reproducibles incluso cuando tu conjunto de prueba evoluciona.

Creando Datasets a Partir de Traces Existentes

python
# dataset_from_traces.py langfuse = Langfuse() dataset = langfuse.create_dataset( name="ejemplos-produccion", description="Ejemplos buenos seleccionados de producción" ) trace_ids = ["trace_abc123", "trace_def456", "trace_ghi789"] for tid in trace_ids: trace = langfuse.fetch_trace(tid) if trace: dataset.create_item( input=trace.input, expected_output=trace.output, source_trace_id=tid )

Pipeline de Evaluación (Diagrama de Flujo)

100%

Puntuación de Evaluación Manual

Después de generar traces, puedes adjuntar puntuaciones humanas:

python
trace = langfuse.trace(name="test-evaluacion", input="...") # Después, al revisar la salida trace.score( name="correccion", value=0.9, # Numérico: 0.0 a 1.0 comment="Correcto, respuesta bien estructurada" ) trace.score( name="toxicidad", value=False, # Booleano data_type="BOOLEAN" )

Funciones de Puntuación Personalizadas

python
# custom_scoring.py from langfuse import Langfuse langfuse = Langfuse() def score_factual_correctness(expected: str, actual: str) -> float: expected_words = set(expected.lower().split()) actual_words = set(actual.lower().split()) if not expected_words: return 0.0 overlap = len(expected_words & actual_words) return round(overlap / len(expected_words), 2) def score_length_compliance(expected_max_words: int, actual: str) -> bool: return len(actual.split()) <= expected_max_words dataset = langfuse.get_dataset("correccion-qa") for item in dataset.items: model_output = "París" trace = langfuse.trace( name="custom-scoring", input=item.input, output=model_output ) correctness = score_factual_correctness( item.expected_output["text"], model_output ) trace.score(name="accuracy", value=correctness, data_type="NUMERIC") length_ok = score_length_compliance( item.metadata.get("max_words", 100), model_output ) trace.score(name="concise", value=length_ok, data_type="BOOLEAN") langfuse.flush()
💡Tip

Diseña tus criterios de evaluación antes de escribir una sola línea de código. Para cada dimensión de salida (corrección, tono, seguridad, formato), decide:

  1. ¿Qué constituye una puntuación de aprobación?
  2. ¿Es numérica (0-1), booleana (aprobado/rechazado) o categórica (bueno/regular/malo)?
  3. ¿Puede automatizarse o requiere juicio humano?
  4. ¿Qué fiabilidad entre evaluadores esperas para evaluaciones humanas?

Evaluación LLM-como-Juez

LangFuse puede usar un LLM para juzgar tus salidas automáticamente. Esto requiere un modelo configurado (ej.: GPT-4) en la interfaz de LangFuse o vía SDK.

python
from langfuse import Langfuse langfuse = Langfuse() # Ejecutar una evaluación LLM-como-juez ejec_evaluacion = langfuse.evaluate( name="juez-gpt4-correccion", data=dataset, # Dataset de arriba evaluator={ "model": "gpt-4", # Modelo juez "system_prompt": ( "Evalúas factualidad. Puntúa 0-1 basado en la corrección. " "Sé estricto: errores parciales reducen la puntuación." ), "template": ( "Pregunta: {input}\n" "Esperado: {expected_output}\n" "Real: {output}\n" "Puntuación: " ), "mapping": {"output": "output"}, } ) print("ID de la ejecución:", ejec_evaluacion.id)

El modelo juez compara la salida real con la salida esperada y devuelve una puntuación.

Secuencia LLM-como-Juez

100%

Ejecutando Evaluaciones en Variantes de Modelo

Compara dos versiones de modelo en el mismo dataset:

python
# Evaluar respuestas de GPT-4 resultados_gpt4 = langfuse.evaluate( name="evaluacion-gpt4", data=dataset, evaluator={"model": "gpt-4", ...} ) # Evaluar respuestas de Claude resultados_claude = langfuse.evaluate( name="evaluacion-claude", data=dataset, evaluator={"model": "gpt-4", ...} # Mismo juez para ambos )

LangFuse permite superponer resultados de diferentes ejecuciones para comparar puntuaciones lado a lado.


Pipelines de Evaluación Automatizados

Para integración CI/CD, automatiza la evaluación con un script:

python
# pipeline_evaluacion.py from langfuse import Langfuse from langfuse.decorators import observe langfuse = Langfuse() dataset = langfuse.get_dataset("correccion-qa") for item in dataset.items: # Ejecutar tu modelo respuesta = tu_modelo.invoke(item.input["question"]) # Crear un trace vinculado a este ítem del dataset trace = langfuse.trace( name="evaluacion-pipeline", input=item.input, output=respuesta ) # Puntuar manualmente o llamar al juez LLM trace.score(name="correccion", value=calcular_puntuacion(respuesta, item.expected_output)) langfuse.flush()
⚠️Warning

Siempre llama a langfuse.flush() al final de un script por lotes para asegurar que todos los traces y puntuaciones se envíen antes de que el proceso termine.

Ejecutando Evaluaciones por Lotes con Seguimiento de Progreso

python
# batch_eval.py from langfuse import Langfuse langfuse = Langfuse() dataset = langfuse.get_dataset("correccion-qa") items = list(dataset.items) total = len(items) print(f"Ejecutando evaluación en {total} ítems...") for idx, item in enumerate(items, 1): try: output = tu_modelo.generate(item.input["question"]) trace = langfuse.trace( name="batch-eval", session_id=f"batch-{dataset.name}-v{dataset.version}", input=item.input, metadata={"batch_item": idx, "dataset_version": dataset.version} ) trace.score(name="correccion", value=compute_score(output, item.expected_output)) trace.end(output=output) print(f" [{idx}/{total}] Procesado: {item.id}") except Exception as e: print(f" [{idx}/{total}] FALLÓ: {item.id} - {e}") if idx % 10 == 0: langfuse.flush() langfuse.flush() print("Evaluación por lotes completada.")

Comparación: Métodos de Evaluación

MétodoAutomatizaciónCostoConsistenciaMejor para
Puntuación manualBaja (revisión humana)Gratis (tiempo humano)Baja (subjetiva)Exploratoria, cualitativa
LLM-como-juezAltaCosto de tokens del juezMedia (depende del juez)Tareas factuales a gran escala
Métricas externas (BLEU, ROUGE, etc.)AltaGratis (computación)AltaTraducción, resumen

Comparación Detallada: Configuraciones LLM-como-Juez

Modelo JuezCosto por 1K evaluacionesCalidad TípicaLatencia por evaluaciónNotas
GPT-4o~$3-5Excelente2-5sMejor para puntuación matizada
GPT-4o-mini~$0.5-1Buena1-2sBuen equilibrio para la mayoría de tareas
Claude 3.5 Sonnet~$3-4Excelente2-4sFuerte en seguridad/derechos de autor
Llama 3 (auto-alojado)~$0.10 (cómputo)Buena-Variable3-10sRequiere GPU, privacidad total de datos
Juez fine-tuned personalizadoVariableDirigidaVariableMejor para criterios específicos de dominio

Cuándo Usar Cada Método de Evaluación

EscenarioMétodo RecomendadoPor qué
Prototipando una nueva funciónPuntuación manualIteración rápida, construcción de intuición
Prueba de regresión antes del lanzamientoLLM-como-juezEscalable, reproducible, objetivo
Comparando LLM A vs LLM BLLM-como-juez + mismo datasetComparación controlada, mismo juez
Evaluación de calidad de traducciónBLEU / chrFMétricas NLP bien establecidas
Filtrado de seguridad de contenidoLLM-como-juez + puntuaciones BOOLEANDecisiones de seguridad matizadas necesitan razonamiento LLM
Validación de gate CI/CDLLM-como-juez + umbralAprobación/rechazo automatizado antes del merge

Modelo de Datos de Evaluación

100%

Interactive Questions

Practice Question

¿Cuál es el propósito de un dataset en los flujos de evaluación de LangFuse?

Practice Question

¿Qué método crea un dataset y lo puebla con casos de prueba?

Practice Question

En una evaluación LLM-como-juez, ¿qué compara el modelo juez para producir una puntuación?

Practice Question

¿Por qué deberías llamar a langfuse.flush() al final de un script de evaluación por lotes?

Practice Question

Tu equipo quiere agregar un paso de evaluación automatizada al pipeline CI/CD que bloquee deploys si la corrección cae por debajo del 80%. ¿Qué enfoque deberías usar?


Success

Conclusiones Clave

  • Los datasets almacenan pares dorados de entrada-salida usados como verdad fundamental para evaluación.
  • Tres métodos de evaluación: puntuación manual, LLM-como-juez y métricas externas.
  • LLM-como-juez usa un modelo configurado (ej.: GPT-4) para puntuar salidas automáticamente.
  • Compara variantes de modelo ejecutando evaluaciones separadas en el mismo dataset.
  • Siempre llama a langfuse.flush() al final de scripts de evaluación por lotes.
  • Diseña tus criterios de puntuación anticipadamente y elige el modelo juez adecuado para cada dimensión.
Progreso60%