<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deepeval on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/deepeval/</link><description>Recent content in Deepeval on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Wed, 20 May 2026 00:12:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/deepeval/index.xml" rel="self" type="application/rss+xml"/><item><title>Evals: la capa después del tracing que decide si tu LLM rinde o sólo parece rendir</title><link>https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/</link><pubDate>Wed, 20 May 2026 00:12:00 +0200</pubDate><guid>https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Tracing te dice &lt;strong>qué ha pasado&lt;/strong> dentro de tu aplicación LLM: qué prompts entraron, qué tokens salieron, qué tools se llamaron. Evals te dice &lt;strong>si eso está bien&lt;/strong>. Son dos capas distintas: no hay overlap, no hay sustitución, hay continuidad. En 2026 el campo se ha estabilizado alrededor de una &lt;strong>arquitectura de dos pisos&lt;/strong>: un framework ligero estilo &lt;code>pytest&lt;/code> (DeepEval, Promptfoo, Ragas) que corre en CI y bloquea el merge si la regresión es seria, y una plataforma de observabilidad (Langfuse, LangSmith, Arize Phoenix, Braintrust) que persiste evaluaciones a largo plazo, permite anotación humana, detecta drift, da dashboard a stakeholders. La técnica dominante es &lt;strong>LLM-as-a-judge&lt;/strong>: un modelo evaluador con una rúbrica determina si la respuesta es buena, &lt;strong>80-90% de acuerdo con humanos a 500-5000x menos coste&lt;/strong> y, calibrado correctamente, en producción. Para RAG hay las cuatro métricas canónicas de Ragas (faithfulness, answer relevancy, context precision, context recall). Para agentes, &lt;strong>trajectory matching&lt;/strong>, accuracy de selección de tools y &lt;strong>pass^k&lt;/strong> —la métrica recién popularizada por Tau-bench que reveló que muchos agentes con pass^1 alto tienen pass^4 hasta 25 puntos por debajo, es decir, son inconsistentes—. Este artículo recorre los seis ángulos: por qué evaluar LLMs es distinto, las cuatro patas de un sistema de evals, LLM-as-a-judge en serio (G-Eval, position bias, calibración), métricas para RAG y agentes, el panorama de herramientas 2026 con sus diferencias reales, y la receta operativa para tener evals que no sean teatro.&lt;/p>
&lt;blockquote>
&lt;p>Este artículo abre la &lt;strong>serie de capas post-tracing&lt;/strong>. Viene encadenado del cierre de la serie eBPF de ayer (&lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">AgentSight y el nuevo tracing de LLMs&lt;/a>), donde quedó apuntado que evals es &amp;ldquo;el mundo aparte que sigue al tracing&amp;rdquo;. Es ese mundo.&lt;/p>
&lt;/blockquote>
&lt;h2 id="la-analogía-el-test-suite-que-tu-pipeline-de-ml-siempre-quiso">La analogía: el test suite que tu pipeline de ML siempre quiso&lt;/h2>
&lt;p>Quien lleve años desarrollando software no encontrará nada raro en la idea de &lt;strong>tests automatizados&lt;/strong>: cada commit dispara una suite que se valida contra outputs esperados, y si algo se rompe, el merge falla. Es lo que separó programar en los 90 de programar en los 2010. Imposible imaginar producción sin esto.&lt;/p>
&lt;p>Cuando llegaron los modelos de Machine Learning clásicos, el patrón se preservó parcialmente: tests de entrada/salida determinista, plus métricas de modelo (accuracy, F1, AUC) sobre un dataset de validación. Imperfecto pero funcionaba; los modelos eran determinísticos y las predicciones tenían &lt;strong>etiquetas claras&lt;/strong>.&lt;/p>
&lt;p>Con los LLMs, el patrón se rompió. ¿Cómo testeas que la respuesta a &amp;ldquo;explícame qué es un transformer&amp;rdquo; es correcta? &lt;strong>No hay una sola respuesta correcta&lt;/strong>, hay una distribución de respuestas razonables. ¿Cómo testeas que un agente eligió la herramienta adecuada para resolver un problema multistep? La función de coste es &lt;strong>subjetiva, dependiente del contexto, y a menudo emerge solo cuando el dominio experto lo mira&lt;/strong>.&lt;/p>
&lt;p>Lo que ha pasado en los últimos tres años es la construcción colectiva del &lt;strong>equivalente al test suite para LLMs&lt;/strong>. Aún imperfecto, aún en evolución, pero ya operacionalmente viable. Las piezas existen: datasets curados, evaluadores que escalan (LLM-as-a-judge), frameworks que corren en CI, plataformas que persisten regresión. Lo que cambia respecto a tests tradicionales es que &lt;strong>el resultado del eval también es probabilístico&lt;/strong>: el judge se puede equivocar; medimos su acuerdo con humanos y aceptamos un umbral. Vivimos con la incertidumbre como parte del sistema.&lt;/p>
&lt;h2 id="por-qué-evaluar-llms-es-estructuralmente-distinto">Por qué evaluar LLMs es estructuralmente distinto&lt;/h2>
&lt;p>Cinco diferencias que cambian todo:&lt;/p>
&lt;p>&lt;strong>No-determinismo.&lt;/strong> Mismo input → distinto output según temperature, top_p, seed. Un test que pasaba ayer puede fallar hoy sin haber tocado nada. La solución no es eliminar el no-determinismo (a veces lo quieres); es &lt;strong>medir en distribución&lt;/strong>, no en una muestra única.&lt;/p>
&lt;p>&lt;strong>No hay golden answer única.&lt;/strong> Para &amp;ldquo;resume este artículo en 3 frases&amp;rdquo;, hay miles de resúmenes válidos. Comparar bit-a-bit con una &amp;ldquo;respuesta correcta&amp;rdquo; es absurdo. Evaluamos &lt;strong>propiedades&lt;/strong> de la respuesta (fidelidad, concisión, no contradicción), no igualdad textual.&lt;/p>
&lt;p>&lt;strong>Métricas clásicas son insuficientes.&lt;/strong> BLEU, ROUGE, BERTScore funcionaban en traducción automática y resumen extractivo. Para generación abierta correlan muy mal con juicio humano. Es famoso el contraejemplo: una respuesta semánticamente correcta puede tener BLEU bajo porque usa otras palabras; una respuesta incorrecta puede tener BLEU alto porque copia tokens del input. Hace falta otra cosa.&lt;/p>
&lt;p>&lt;strong>Coste cuadrático del juicio humano.&lt;/strong> La alternativa obvia —&amp;ldquo;que personas evalúen cada respuesta&amp;rdquo;— escala terriblemente. Una app con 100 conversaciones/día genera 3.000/mes; evaluar cada una requiere horas de un humano caro. Para apps con miles o millones de queries, inviable.&lt;/p>
&lt;p>&lt;strong>Drift en producción.&lt;/strong> El modelo no cambia; el mundo cambia. Cambia el vocabulario de los usuarios, cambia el contenido de los documentos del RAG, cambia el comportamiento de los modelos cuando vendor los actualiza silenciosamente. Sin eval continuo, la app degrada y nadie se entera hasta que un cliente se queja.&lt;/p>
&lt;p>Estos cinco puntos explican toda la arquitectura moderna de evals: necesitamos &lt;strong>automatizar el juicio&lt;/strong> (LLM-as-a-judge), &lt;strong>medir propiedades en distribución&lt;/strong> (no igualdad exacta), &lt;strong>persistir resultados a lo largo del tiempo&lt;/strong> (detección de drift) y &lt;strong>mantener un anclaje humano&lt;/strong> (golden datasets calibrados).&lt;/p>
&lt;h2 id="las-cuatro-patas-de-un-sistema-de-evals">Las cuatro patas de un sistema de evals&lt;/h2>
&lt;p>Cualquier framework moderno gira sobre cuatro componentes:&lt;/p>
&lt;h3 id="1-datasets">1. Datasets&lt;/h3>
&lt;p>Un dataset de evaluación tiene una forma mínima: &lt;strong>lista de entradas + cómo se juzga cada salida&lt;/strong>. Dos modelos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Dataset con golden output&lt;/strong>: para cada entrada, tienes la respuesta correcta (o una lista de aceptables). El evaluador compara generación con golden. Caso típico: NER, clasificación, traducción.&lt;/li>
&lt;li>&lt;strong>Dataset con criteria&lt;/strong>: para cada entrada, tienes una rúbrica abstracta (&amp;ldquo;la respuesta debe ser factual respecto al contexto&amp;rdquo;, &amp;ldquo;el tono debe ser profesional&amp;rdquo;). No hay golden; el evaluador aplica la rúbrica.&lt;/li>
&lt;/ul>
&lt;p>Los datasets buenos en producción son &lt;strong>mantenidos activamente&lt;/strong>: empiezas con 20-50 ejemplos curados a mano, los etiquetas con resultados deseados, y vas creciendo el dataset con los casos reales que han causado problemas (regression dataset). Después de un año en producción, debería haber &lt;strong>cientos o miles&lt;/strong> de casos, cada uno respaldado por una incidencia o un patrón observado.&lt;/p>
&lt;h3 id="2-evaluators">2. Evaluators&lt;/h3>
&lt;p>Lo que toma generación + criterios y devuelve un score. Cuatro familias:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Determinísticos / heurísticos&lt;/strong>: regex, longitud, presencia de tokens, validación de JSON schema. Rápidos, baratos, pero solo aplicables a propiedades sintácticas.&lt;/li>
&lt;li>&lt;strong>Semánticos clásicos&lt;/strong>: BERTScore, embeddings cosine similarity. Mejor que BLEU para igualdad semántica, pero limitados a &amp;ldquo;comparar contra golden&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>LLM-as-a-judge&lt;/strong>: un modelo —típicamente GPT-4, Claude, o un open-source especializado como Prometheus— recibe generación + criterios y devuelve score. El caballo de batalla del campo en 2026.&lt;/li>
&lt;li>&lt;strong>Humanos&lt;/strong>: la verdad de referencia. Caro, lento, pero indispensable como anclaje (golden set).&lt;/li>
&lt;/ul>
&lt;p>En una pipeline madura, los cuatro coexisten: heurísticos como gate inicial (¿es JSON válido?), semánticos para checks rápidos, LLM-as-judge para la mayoría de evaluación, y humanos en muestreo periódico para calibrar.&lt;/p>
&lt;h3 id="3-runners">3. Runners&lt;/h3>
&lt;p>Ejecutan dataset × evaluators y producen el cuadro de resultados. Lo que en pytest serían &lt;code>pytest --collect-only&lt;/code> + &lt;code>pytest -v&lt;/code>. Las cosas que un runner serio tiene que hacer:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Paralelización&lt;/strong>: cientos de prompts no pueden ejecutarse en serie.&lt;/li>
&lt;li>&lt;strong>Caché&lt;/strong>: si re-ejecutas un eval con el mismo prompt y modelo, no pagar dos veces.&lt;/li>
&lt;li>&lt;strong>Retry y backoff&lt;/strong>: rate limits de las APIs son la norma.&lt;/li>
&lt;li>&lt;strong>Trazabilidad&lt;/strong>: cada run identificado con commit, version del prompt, version del dataset, version del evaluator.&lt;/li>
&lt;li>&lt;strong>Aggregation&lt;/strong>: medias, percentiles, breakdown por segmento.&lt;/li>
&lt;/ul>
&lt;h3 id="4-storage-y-analytics">4. Storage y analytics&lt;/h3>
&lt;p>Un eval que se ejecuta y se imprime en pantalla no sirve. Hay que &lt;strong>persistir resultados a lo largo del tiempo&lt;/strong> para detectar regresión y drift. Aquí entran las plataformas (Langfuse, LangSmith, Phoenix): cada eval-run se guarda con metadata, se puede comparar contra runs anteriores, se generan dashboards.&lt;/p>
&lt;h2 id="llm-as-a-judge-el-caballo-de-batalla">LLM-as-a-judge: el caballo de batalla&lt;/h2>
&lt;p>Esta es la técnica que ha hecho factible eval automático a escala. Vale la pena entender bien cómo funciona y qué problemas tiene.&lt;/p>
&lt;h3 id="el-modelo-básico">El modelo básico&lt;/h3>
&lt;p>Le das al judge un prompt estructurado:&lt;/p>
&lt;pre tabindex="0">&lt;code>You are evaluating the quality of a customer support agent&amp;#39;s response.
User question: &amp;#34;How do I cancel my subscription?&amp;#34;
Agent response: &amp;#34;To cancel, log into your account, go to Settings &amp;gt;
Billing, click Cancel. Note that you&amp;#39;ll retain access until the end
of your current billing period.&amp;#34;
Rubric:
- Accuracy (1-5): Does the response factually answer the question?
- Completeness (1-5): Does it cover all relevant steps?
- Tone (1-5): Is it professional and helpful?
Provide a JSON response with the three scores and a brief justification.
&lt;/code>&lt;/pre>&lt;p>El judge devuelve un JSON. Las tres notas, una justificación corta. Caso resuelto.&lt;/p>
&lt;h3 id="scoring-rubric-vs-pairwise-comparison">Scoring rubric vs pairwise comparison&lt;/h3>
&lt;p>Dos modelos principales:&lt;/p>
&lt;p>&lt;strong>Scoring rubric (absoluto)&lt;/strong>: el judge devuelve un número en una escala (típicamente 0-1, 1-5 o 1-10). Sencillo, ortogonal entre evaluaciones. Pero los modelos LLM &lt;strong>son malos en escalas absolutas&lt;/strong>: tienden a apilarse en valores medios (3-4 en escala 1-5) y a no usar los extremos. Las correlaciones con humanos en scoring absoluto suelen rondar el 0.6-0.7.&lt;/p>
&lt;p>&lt;strong>Pairwise comparison&lt;/strong>: el judge ve &lt;strong>dos respuestas&lt;/strong> (A y B) y elige cuál es mejor. Los modelos son &lt;strong>mucho mejores&lt;/strong> en pairwise que en absoluto; las correlaciones suben a 0.75-0.85. Razón: es la tarea natural de un modelo de lenguaje (modelar relación entre dos cosas), no asignar números abstractos.&lt;/p>
&lt;p>La práctica recomendada: &lt;strong>usar pairwise cuando puedas&lt;/strong>. Para regresión (&amp;quot;¿v4 del prompt mejora sobre v3?&amp;quot;), pairwise es ideal. Para producción (&amp;quot;¿esta respuesta es buena?&amp;quot;), donde no tienes otra contra qué comparar, scoring absoluto con cuidado.&lt;/p>
&lt;h3 id="g-eval-el-patrón-que-más-se-usa">G-Eval: el patrón que más se usa&lt;/h3>
&lt;p>&lt;a href="https://arxiv.org/abs/2303.16634">G-Eval&lt;/a> (Liu et al., NAACL 2023) es el patrón de prompting que más correlación con humanos consigue de los métodos públicos. Tiene tres ingredientes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Auto-CoT&lt;/strong>: el prompt induce al judge a generar &lt;strong>su propia cadena de razonamiento&lt;/strong> sobre los pasos a evaluar antes de dar nota. No le dices la rúbrica; le pides que la deduzca y aplique.&lt;/li>
&lt;li>&lt;strong>Form-filling&lt;/strong>: en lugar de pedir números libres, el judge rellena un formulario estructurado con campos específicos (presencia de elementos, errores detectados).&lt;/li>
&lt;li>&lt;strong>Probability-weighted scores&lt;/strong>: en lugar de &amp;ldquo;qué nota das&amp;rdquo;, se pide la probabilidad de cada nota y se hace una expectativa ponderada. Mitiga la tendencia a apilarse en valores medios.&lt;/li>
&lt;/ol>
&lt;p>G-Eval implementado bien alcanza &lt;strong>0.89 de correlación de Spearman&lt;/strong> con humanos en datasets de summarization. Es lo que las plataformas serias usan por defecto bajo el capó. Para tu trabajo: no implementes G-Eval a mano; usa la versión de DeepEval o de Phoenix que ya lo trae.&lt;/p>
&lt;h3 id="calibración-contra-humanos-el-paso-no-negociable">Calibración contra humanos: el paso no negociable&lt;/h3>
&lt;p>Un judge sin calibrar es teatro. La práctica:&lt;/p>
&lt;ol>
&lt;li>Construye un &lt;strong>golden set anotado por humanos&lt;/strong> (50-200 ejemplos como mínimo).&lt;/li>
&lt;li>Corre el judge sobre ese golden set.&lt;/li>
&lt;li>Mide el &lt;strong>agreement&lt;/strong> con humanos (Cohen&amp;rsquo;s kappa, Spearman, o accuracy si la tarea es binaria).&lt;/li>
&lt;li>Si el agreement es &amp;lt;85%, el judge no es fiable para esa tarea; itera sobre el prompt o cambia de modelo judge.&lt;/li>
&lt;li>&lt;strong>Repite cada 60-90 días&lt;/strong>. Los judges drift en silencio: cambios de versión del modelo, cambios de comportamiento que el vendor hace sin avisar.&lt;/li>
&lt;/ol>
&lt;p>El número de referencia que cita la literatura 2026: &lt;strong>85-90% de agreement con humanos&lt;/strong> es el umbral para considerar el judge productivo. Por encima, automatizas con cobertura humana en muestreo. Por debajo, sigues siendo manual.&lt;/p>
&lt;h3 id="los-sesgos-del-judge-lo-que-pega-tiros-en-producción">Los sesgos del judge: lo que pega tiros en producción&lt;/h3>
&lt;p>Cinco sesgos identificados que cualquier judge tiene en algún grado:&lt;/p>
&lt;p>&lt;strong>Position bias&lt;/strong>: en pairwise, el judge favorece la respuesta que aparece primero (o última, según modelo). Mitigación obligatoria: &lt;strong>swap and average&lt;/strong> — corre cada par dos veces, una en orden A-B y otra en B-A, y promedia. Si los dos órdenes contradicen, ese par es ambiguo, lo marcas como tal.&lt;/p>
&lt;p>&lt;strong>Length bias&lt;/strong>: respuestas más largas tienden a recibir mejor nota porque &amp;ldquo;parecen más completas&amp;rdquo;. Mitigación: normaliza por longitud o penaliza explícitamente en la rúbrica. Las plataformas modernas detectan esto y lo reportan.&lt;/p>
&lt;p>&lt;strong>Verbosity bias&lt;/strong>: similar al length bias pero con jerga técnica: respuestas que suenan más sofisticadas se puntúan mejor, aunque sean menos correctas. Mitigación: usar judges que &lt;strong>citen evidencia concreta&lt;/strong> del input.&lt;/p>
&lt;p>&lt;strong>Self-preference&lt;/strong>: si el judge es del mismo proveedor que el modelo evaluado (GPT-4 evaluando GPT-4), tiende a favorecer respuestas del propio proveedor por estilo. Mitigación: &lt;strong>cross-judge&lt;/strong> — usa un judge de un proveedor distinto al modelo bajo prueba.&lt;/p>
&lt;p>&lt;strong>Shortcut bias&lt;/strong> (el &amp;ldquo;Silent Judge&amp;rdquo; del paper de 2025): los judges aprenden atajos no intencionados; por ejemplo, asociar respuestas que empiezan por &amp;ldquo;Certainly!&amp;rdquo; con mayor calidad porque sí. Mitigación: tener una rúbrica explícita y ejemplos calibrados; medir agreement contra golden set humano periódicamente.&lt;/p>
&lt;h3 id="coste-y-judges-open-source">Coste y judges open-source&lt;/h3>
&lt;p>GPT-4 como judge es excelente pero &lt;strong>caro&lt;/strong>. A 5 USD/millón input tokens y 15 USD/millón output, una pipeline que evalúa 50 000 respuestas/día puede costar &lt;strong>decenas de miles de USD/mes&lt;/strong> solo en evals.&lt;/p>
&lt;p>La respuesta del campo: &lt;strong>judges open-source especializados&lt;/strong>. &lt;a href="https://github.com/prometheus-eval/prometheus">Prometheus&lt;/a> (KAIST + LG AI) entrena un modelo open-source pequeño específicamente para juzgar con rúbrica, y alcanza &lt;strong>0.897 de correlación de Pearson&lt;/strong> con humanos en 45 rúbricas — comparable a GPT-4 (0.882) a una fracción del coste.&lt;/p>
&lt;p>Otros modelos en la misma línea: &lt;strong>JudgeLM&lt;/strong>, &lt;strong>PandaLM&lt;/strong>, modelos Auto-J. La práctica madura es &lt;strong>usar judges open-source para la mayoría del tráfico, GPT-4/Claude para casos críticos&lt;/strong> (regresión profunda, golden set re-evaluación).&lt;/p>
&lt;h2 id="métricas-específicas-para-rag">Métricas específicas para RAG&lt;/h2>
&lt;p>Si tu sistema es &lt;strong>Retrieval-Augmented Generation&lt;/strong>, hay cuatro métricas canónicas que &lt;a href="https://docs.ragas.io/">Ragas&lt;/a> popularizó y que el resto del ecosistema ha adoptado:&lt;/p>
&lt;h3 id="faithfulness-fidelidad">Faithfulness (fidelidad)&lt;/h3>
&lt;p>¿La respuesta se atiene a los documentos recuperados? Mide alucinación. Se calcula descomponiendo la respuesta en afirmaciones individuales y verificando cuántas están respaldadas por el contexto. Rango 0-1.&lt;/p>
&lt;p>Crítico para sistemas donde &lt;strong>la respuesta debe ser sourced&lt;/strong> (legal, médico, financiero). Una respuesta puede sonar bien y aún así inventar; faithfulness lo cazas.&lt;/p>
&lt;h3 id="answer-relevancy-relevancia-de-la-respuesta">Answer Relevancy (relevancia de la respuesta)&lt;/h3>
&lt;p>¿La respuesta responde a la pregunta? Independiente de si es factualmente correcta — solo mide on-topic. Se calcula generando varias preguntas inversas a partir de la respuesta y midiendo cuánto se parecen a la pregunta original.&lt;/p>
&lt;p>Importante para detectar &lt;strong>off-topic drift&lt;/strong>: respuestas que evaden la pregunta o se desvían.&lt;/p>
&lt;h3 id="context-precision-precisión-del-contexto">Context Precision (precisión del contexto)&lt;/h3>
&lt;p>De los documentos recuperados, ¿cuántos son realmente relevantes? Si tu retrieval devuelve 10 chunks y solo 3 son útiles, la precisión es 0.3. Métrica del retrieval, no del LLM.&lt;/p>
&lt;p>Diagnóstico clave: precisión baja indica &lt;strong>retrieval ruidoso&lt;/strong>, probablemente porque el embedding model no captura semántica fina o el chunking es demasiado grande.&lt;/p>
&lt;h3 id="context-recall-recall-del-contexto">Context Recall (recall del contexto)&lt;/h3>
&lt;p>De los documentos relevantes que existen, ¿cuántos se han recuperado? Requiere golden (saber qué documentos eran los correctos).&lt;/p>
&lt;p>Recall bajo indica &lt;strong>retrieval limitado&lt;/strong>: el sistema no encuentra documentos que existían y eran relevantes. Causas: k demasiado bajo, query embedding mal, chunking que rompe contexto necesario.&lt;/p>
&lt;h3 id="el-cuadrante-diagnóstico-de-rag">El cuadrante diagnóstico de RAG&lt;/h3>
&lt;p>Las cuatro métricas combinadas dan un &lt;strong>diagnóstico estructurado&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Faithfulness&lt;/th>
&lt;th>Relevancy&lt;/th>
&lt;th>Precision&lt;/th>
&lt;th>Recall&lt;/th>
&lt;th>Diagnóstico&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>&lt;strong>Sistema sano&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Bajo&lt;/strong>&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>LLM alucina sobre buen contexto&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Alto&lt;/td>
&lt;td>&lt;strong>Bajo&lt;/strong>&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>LLM divaga sobre pregunta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>&lt;strong>Bajo&lt;/strong>&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Retrieval ruidoso (k alto, embeddings malos)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>Alto&lt;/td>
&lt;td>&lt;strong>Bajo&lt;/strong>&lt;/td>
&lt;td>Retrieval incompleto (k bajo, chunking malo)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Bajo&lt;/td>
&lt;td>Bajo&lt;/td>
&lt;td>Bajo&lt;/td>
&lt;td>Bajo&lt;/td>
&lt;td>Empieza por arreglar retrieval&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ragas mantiene además otras métricas más sofisticadas: &lt;strong>noise sensitivity&lt;/strong> (cómo afecta inyección de ruido), &lt;strong>context entities recall&lt;/strong> (recuperación de entidades específicas), &lt;strong>multimodal faithfulness/relevance&lt;/strong> para RAG sobre imágenes y vídeo.&lt;/p>
&lt;h2 id="métricas-específicas-para-agentes">Métricas específicas para agentes&lt;/h2>
&lt;p>Los agentes con tool use multi-step rompen el modelo single-turn de RAG. Necesitan métricas que entiendan &lt;strong>trayectoria de acciones&lt;/strong>, no solo respuesta final.&lt;/p>
&lt;h3 id="tool-selection-accuracy">Tool selection accuracy&lt;/h3>
&lt;p>¿El agente eligió la herramienta correcta? Métrica clásica de classification. Para cada turno donde el agente tenía que decidir entre herramientas, comparas selección con la correcta.&lt;/p>
&lt;p>Variantes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Exact match&lt;/strong>: la herramienta elegida es la golden.&lt;/li>
&lt;li>&lt;strong>Top-k&lt;/strong>: la golden está entre las top-k consideradas (medido por logprobs si están disponibles).&lt;/li>
&lt;/ul>
&lt;h3 id="trajectory-matching">Trajectory matching&lt;/h3>
&lt;p>Compara la &lt;strong>secuencia completa de acciones&lt;/strong> del agente con una trayectoria golden. Para tareas multistep, una respuesta final correcta puede haberse llegado por un camino tortuoso e ineficiente, o por un camino directo. Trajectory matching captura la diferencia.&lt;/p>
&lt;p>Variantes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Exact trajectory&lt;/strong>: secuencia idéntica de tool calls (rara vez factible).&lt;/li>
&lt;li>&lt;strong>Soft trajectory&lt;/strong>: porcentaje de pasos correctos, permitiendo ramas alternativas válidas.&lt;/li>
&lt;li>&lt;strong>Trajectory similarity&lt;/strong>: embedding de la secuencia comparado con embedding de la golden.&lt;/li>
&lt;/ul>
&lt;h3 id="task-completion-rate">Task completion rate&lt;/h3>
&lt;p>¿El agente terminó la tarea exitosamente? Métrica binaria al final. Crítica para benchmarks como &lt;a href="https://arxiv.org/abs/2406.12045">Tau-bench&lt;/a> (Sierra), &lt;a href="https://huggingface.co/gaia-benchmark">GAIA&lt;/a> (Meta + HF), &lt;a href="https://www.swebench.com/">SWE-bench&lt;/a> (Princeton).&lt;/p>
&lt;h3 id="passk-la-métrica-que-cambió-las-leaderboards">pass^k: la métrica que cambió las leaderboards&lt;/h3>
&lt;p>Tradicionalmente los benchmarks reportaban &lt;strong>pass^1&lt;/strong>: ejecutas el agente una vez por tarea, mides cuántas resolvió. El problema de no-determinismo: una ejecución sola es ruido.&lt;/p>
&lt;p>&lt;strong>pass^k&lt;/strong> ejecuta cada tarea &lt;strong>k veces&lt;/strong> y mide si el agente la resuelve &lt;strong>en las k ejecuciones&lt;/strong>. Es decir: pass^4 = &amp;ldquo;el agente resuelve esto consistentemente las 4 veces&amp;rdquo;. Métrica de fiabilidad, no de capacidad puntual.&lt;/p>
&lt;p>El descubrimiento que ha agitado el campo 2026: &lt;strong>pass^4 suele estar 15-25 puntos por debajo de pass^1&lt;/strong>. Es decir, muchos agentes que parecen estado del arte en leaderboards single-run resuelven la tarea &lt;strong>solo a veces&lt;/strong>. Productivamente significa que esos agentes no se pueden poner en producción tal cual — necesitan reintentos, autoconsistencia o human-in-the-loop. Tau-bench fue el primero en formalizar este reporting y otros benchmarks lo están adoptando (Tau²-Bench, ATBench, TRAJECT-Bench).&lt;/p>
&lt;h3 id="benchmarks-2026-importantes">Benchmarks 2026 importantes&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://arxiv.org/abs/2406.12045">Tau-bench / Tau²-Bench&lt;/a>&lt;/strong> (Sierra): tool-agent-user interaction en dominios empresariales (retail, airline). Reporta pass^k.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://huggingface.co/gaia-benchmark">GAIA&lt;/a>&lt;/strong>: tareas que requieren razonamiento + tool use + web browsing.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.swebench.com/">SWE-bench&lt;/a>&lt;/strong>: arreglo de bugs en repos reales de GitHub. El benchmark más exigente para agentes de coding.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://arxiv.org/abs/2604.02022">ATBench&lt;/a>&lt;/strong> (2026): foco en safety durante la trayectoria, no solo en respuesta final.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://arxiv.org/abs/2510.04550">TRAJECT-Bench&lt;/a>&lt;/strong>: agentic tool use evaluado a nivel trayectoria con métricas estandarizadas.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://inspect.ai-safety-institute.org.uk/">Inspect AI evals&lt;/a>&lt;/strong> (UK AI Safety Institute): foco en capability y safety, abierto.&lt;/li>
&lt;/ul>
&lt;h2 id="el-panorama-de-herramientas-2026">El panorama de herramientas 2026&lt;/h2>
&lt;p>El campo se ha estabilizado en dos categorías que rara vez compiten directamente:&lt;/p>
&lt;h3 id="categoría-a-testing-frameworks-gating-en-ci">Categoría A: testing frameworks (gating en CI)&lt;/h3>
&lt;p>Pensados para correr como tests, bloquear merges, dar feedback rápido al desarrollador.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/confident-ai/deepeval">DeepEval&lt;/a>&lt;/strong> (Apache 2.0). El más popular hoy. Estilo &lt;code>pytest&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">assert_test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval.test_case&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">LLMTestCase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval.metrics&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">GEval&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">FaithfulnessMetric&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">test_rag_response&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">test_case&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">LLMTestCase&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">input&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;What&amp;#39;s the capital of France?&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">actual_output&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">my_rag_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;What&amp;#39;s the capital of France?&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">retrieval_context&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">docs&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">geval_metric&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">GEval&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Correctness&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">criteria&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Determine if the answer is factually correct.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">evaluation_params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;input&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;actual_output&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">faithfulness&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">FaithfulnessMetric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">threshold&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.7&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">assert_test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">test_case&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">geval_metric&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">faithfulness&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Trae 30+ métricas pre-hechas, incluye G-Eval, integra con CI/CD trivial. La librería más completa en cobertura.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://www.promptfoo.dev/">Promptfoo&lt;/a>&lt;/strong> (MIT). CLI-first, configuración en YAML. Especializado en &lt;strong>red teaming&lt;/strong> y &lt;strong>comparación de modelos&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">providers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">openai:gpt-4o&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">anthropic:claude-3.5-sonnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">openrouter:meta-llama/llama-3.3-70b&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">prompts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Summarize: {{text}}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tests&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">text&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">assert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">llm-rubric&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Summary is accurate and concise&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">contains&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Corre la misma evaluación contra muchos providers simultáneamente. Fantástico para &amp;ldquo;qué modelo conviene a esta tarea&amp;rdquo;. Pioneer en &lt;strong>red teaming automatizado&lt;/strong>: genera ataques de prompt injection y mide robustez.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://docs.ragas.io/">Ragas&lt;/a>&lt;/strong> (Apache 2.0). Especializado en RAG. Implementa las 4 métricas canónicas más una docena más, lightweight, sin opinionado sobre tu stack:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">ragas&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">evaluate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">ragas.metrics&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">faithfulness&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">answer_relevancy&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">context_precision&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">context_recall&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">evaluate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataset&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">metrics&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">faithfulness&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">answer_relevancy&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">context_precision&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">context_recall&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Si tu sistema es RAG y solo RAG, Ragas es la apuesta más directa.&lt;/p>
&lt;p>&lt;strong>Otros relevantes&lt;/strong>: &lt;a href="https://github.com/openai/evals">OpenAI Evals&lt;/a> (el clásico, OSS), &lt;a href="https://docs.smith.langchain.com/">LangSmith Evals SDK&lt;/a> (para usuarios LangChain), &lt;a href="https://inspect.ai-safety-institute.org.uk/">Inspect AI&lt;/a> (UK AISI, fuerte en safety/capability evals).&lt;/p>
&lt;h3 id="categoría-b-plataformas-storage--dashboard--regresión">Categoría B: plataformas (storage + dashboard + regresión)&lt;/h3>
&lt;p>Pensadas para persistencia a largo plazo, anotación humana, regresión, dashboards a stakeholders.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://langfuse.com/">Langfuse&lt;/a>&lt;/strong> (MIT, self-host disponible). Cubierta en profundidad ayer. Para evals: ejecuta evaluators en background sobre traces de producción, permite human labeling en UI, integra con datasets y prompt management. Es la opción más completa OSS.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://www.langchain.com/langsmith">LangSmith&lt;/a>&lt;/strong> (comercial). Si usas LangChain, integración cero-config. Datasets, evaluator SDK, runs comparables side-by-side. UI limpia para stakeholders.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://phoenix.arize.com/">Arize Phoenix&lt;/a>&lt;/strong> (ELv2, OSS). OTel-native, fuerte en RAG por su énfasis en retrieval. Evals built-in con LLM-as-judge configurable.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://www.braintrust.dev/">Braintrust&lt;/a>&lt;/strong> (comercial, OSS lite). El competidor más joven en plataformas; fuerte en datasets y comparativa side-by-side. Adoptado por equipos que vienen de hacer evals &amp;ldquo;en una hoja de cálculo&amp;rdquo; porque la UX está pulida.&lt;/p>
&lt;h3 id="tabla-comparativa-testing-frameworks-vs-platforms">Tabla comparativa: testing frameworks vs platforms&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Herramienta&lt;/th>
&lt;th>Tipo&lt;/th>
&lt;th>Licencia&lt;/th>
&lt;th>Self-host&lt;/th>
&lt;th>Especialidad&lt;/th>
&lt;th>Idóneo cuando&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>DeepEval&lt;/strong>&lt;/td>
&lt;td>Framework CI&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>N/A&lt;/td>
&lt;td>Maximalismo de métricas&lt;/td>
&lt;td>Quieres pytest para LLMs, 30+ métricas listas&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Promptfoo&lt;/strong>&lt;/td>
&lt;td>Framework CI&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>N/A&lt;/td>
&lt;td>Modelo comparison + red teaming&lt;/td>
&lt;td>Eliges modelo, atacas prompt&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ragas&lt;/strong>&lt;/td>
&lt;td>Framework CI&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>N/A&lt;/td>
&lt;td>RAG end-to-end&lt;/td>
&lt;td>Tu sistema es exclusivamente RAG&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenAI Evals&lt;/strong>&lt;/td>
&lt;td>Framework CI&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>N/A&lt;/td>
&lt;td>Clásico, simple&lt;/td>
&lt;td>Empezando, OpenAI nativo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Inspect AI&lt;/strong>&lt;/td>
&lt;td>Framework CI&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Safety / capability evals&lt;/td>
&lt;td>Evaluación de modelos base, alignment&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Langfuse&lt;/strong>&lt;/td>
&lt;td>Platform&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>&lt;strong>Sí&lt;/strong>&lt;/td>
&lt;td>Suite completa (trace+eval+prompts)&lt;/td>
&lt;td>OSS, self-host, equipo iterativo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>LangSmith&lt;/strong>&lt;/td>
&lt;td>Platform&lt;/td>
&lt;td>Comercial&lt;/td>
&lt;td>No&lt;/td>
&lt;td>LangChain ecosystem&lt;/td>
&lt;td>Tu stack es LangChain&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Arize Phoenix&lt;/strong>&lt;/td>
&lt;td>Platform&lt;/td>
&lt;td>ELv2 (OSS)&lt;/td>
&lt;td>&lt;strong>Sí&lt;/strong>&lt;/td>
&lt;td>OTel-native, RAG&lt;/td>
&lt;td>Estandarización OTel, RAG profundo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Braintrust&lt;/strong>&lt;/td>
&lt;td>Platform&lt;/td>
&lt;td>Comercial + OSS&lt;/td>
&lt;td>Limitado&lt;/td>
&lt;td>UX pulida, datasets&lt;/td>
&lt;td>Stakeholders no-técnicos, side-by-side&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="la-receta-operativa-stack-de-dos-pisos">La receta operativa: stack de dos pisos&lt;/h2>
&lt;p>La estructura que más se ve en equipos productivos en 2026:&lt;/p>
&lt;h3 id="piso-1--framework-de-ci">Piso 1 — Framework de CI&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>DeepEval&lt;/strong> o &lt;strong>Promptfoo&lt;/strong> (o &lt;strong>Ragas&lt;/strong> si es RAG estricto) corriendo en cada PR.&lt;/li>
&lt;li>Dataset golden versionado en el repo (~100-500 ejemplos curados).&lt;/li>
&lt;li>Métricas con threshold: si baja G-Eval medio por debajo de 0.85, el merge falla.&lt;/li>
&lt;li>Tiempo objetivo: &amp;lt;2 minutos para no bloquear el flow del desarrollador.&lt;/li>
&lt;/ul>
&lt;h3 id="piso-2--plataforma-de-regresión--drift">Piso 2 — Plataforma de regresión + drift&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Langfuse&lt;/strong> / &lt;strong>LangSmith&lt;/strong> / &lt;strong>Phoenix&lt;/strong> / &lt;strong>Braintrust&lt;/strong> persistiendo todos los traces de producción.&lt;/li>
&lt;li>Evaluators corriendo sobre muestreo de tráfico real (eg 5-10% de las respuestas evaluadas con LLM-as-judge cada hora).&lt;/li>
&lt;li>Dashboard semanal con tendencias por segmento, version de prompt, modelo.&lt;/li>
&lt;li>Human labeling de los casos que el judge marca como dudosos.&lt;/li>
&lt;/ul>
&lt;h3 id="ciclo-del-cambio">Ciclo del cambio&lt;/h3>
&lt;p>Pipeline típico de cambiar un prompt:&lt;/p>
&lt;ol>
&lt;li>Developer modifica el prompt en local.&lt;/li>
&lt;li>CI corre eval framework contra dataset golden. Si pasa, merge.&lt;/li>
&lt;li>El cambio sube a staging; la plataforma persiste evaluaciones de tráfico real durante 24-48h.&lt;/li>
&lt;li>Si la regresión sale: rollback automático o flag.&lt;/li>
&lt;li>Si pasa la ventana de staging: promoción a producción.&lt;/li>
&lt;li>Eval continuo en producción detecta drift en días/semanas si ocurre.&lt;/li>
&lt;/ol>
&lt;p>Lo que cierra el bucle: &lt;strong>el dataset golden se enriquece con los casos donde el sistema falló en producción&lt;/strong>. Cada incidente genera 3-5 ejemplos nuevos en el dataset; el dataset crece como entidad viva durante el ciclo de vida de la app.&lt;/p>
&lt;h2 id="ejemplo-concreto-pipeline-rag-con-deepeval--langfuse">Ejemplo concreto: pipeline RAG con DeepEval + Langfuse&lt;/h2>
&lt;p>Receta minimalista:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># CI: deepeval test (corre en cada PR)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># tests/test_rag.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pytest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">assert_test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval.test_case&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">LLMTestCase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval.metrics&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">FaithfulnessMetric&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">AnswerRelevancyMetric&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">deepeval.dataset&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">EvaluationDataset&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">app.rag&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">answer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dataset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">EvaluationDataset&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dataset&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_test_cases_from_json_file&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;tests/golden_dataset.json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_key_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;question&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">actual_output_key_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;ignore&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># se rellena en runtime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">expected_output_key_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;expected_answer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">context_key_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;ignore&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@pytest.mark.parametrize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;tc&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dataset&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">test_cases&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">test_rag_quality&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tc&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">docs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">answer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">input&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">actual_output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">retrieval_context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">content&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">docs&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">assert_test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FaithfulnessMetric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">threshold&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.8&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AnswerRelevancyMetric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">threshold&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.75&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Producción: tracing + eval async con Langfuse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># app/rag.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langfuse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">observe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">get_client&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langfuse.evaluators&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">faithfulness&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">answer_relevancy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">langfuse&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_client&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@observe&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">as_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;generation&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">answer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">question&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">docs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">retrieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">question&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">llm&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">build_prompt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">question&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">docs&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># eval async en background sobre una muestra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">langfuse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">evaluate_async&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;faithfulness&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">evaluator&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">faithfulness&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">input&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">question&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">context&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">docs&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sample_rate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 10% del tráfico&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">docs&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Y un dashboard Grafana o Langfuse UI muestra:&lt;/p>
&lt;ul>
&lt;li>Faithfulness p50/p95 por día.&lt;/li>
&lt;li>Distribución por namespace o tenant.&lt;/li>
&lt;li>Drift respecto al baseline.&lt;/li>
&lt;li>Casos peor evaluados para human review.&lt;/li>
&lt;/ul>
&lt;p>Cuatro horas de trabajo para tener esto montado en una app que ya tiene Langfuse desplegado. Cero excusas para no hacerlo.&lt;/p>
&lt;h2 id="la-frontera-2026-lo-que-el-campo-aún-no-ha-resuelto">La frontera 2026: lo que el campo aún no ha resuelto&lt;/h2>
&lt;p>Tres frentes abiertos donde la investigación va activa:&lt;/p>
&lt;h3 id="outcome-scoring-sigue-siendo-el-problema-duro">Outcome scoring sigue siendo el problema duro&lt;/h3>
&lt;p>Ya tenemos el &lt;strong>step-level tracing&lt;/strong>: tool-call accuracy, trajectory analysis, latency per step, input/output por nodo. Te dice cómo se ejecutó el agente.&lt;/p>
&lt;p>Lo que no está resuelto es &lt;strong>outcome scoring&lt;/strong>: ¿completó el agente el objetivo en una forma que un experto del dominio aprobaría? Replay del trace no responde esta pregunta. Necesitas a alguien que sepa qué significa &amp;ldquo;éxito&amp;rdquo; en el contexto específico — y eso es caro y no escala.&lt;/p>
&lt;p>Las propuestas actuales: usar judges fuertes (GPT-4 con CoT) sobre la respuesta final más contexto del trace, dataset de outcomes etiquetados por expertos como golden, ensembles de judges para alta varianza. Ninguna es magia.&lt;/p>
&lt;h3 id="trajectory-benchmarks-emergentes">Trajectory benchmarks emergentes&lt;/h3>
&lt;p>&lt;a href="https://arxiv.org/abs/2604.02022">&lt;strong>ATBench&lt;/strong>&lt;/a> y &lt;a href="https://arxiv.org/abs/2510.04550">&lt;strong>TRAJECT-Bench&lt;/strong>&lt;/a> representan la nueva ola de benchmarks que evalúan &lt;strong>toda la trayectoria&lt;/strong> del agente, no solo input/output. Detectan safety issues durante la ejecución (usar tools peligrosos, exfiltrar datos en pasos intermedios) que un benchmark de final-answer pierde.&lt;/p>
&lt;p>Si tu carga de producción tiene agentes haciendo varios tool calls, &lt;strong>moviéndose a benchmarks trajectory-level&lt;/strong> durante 2026 es la dirección que el campo señala.&lt;/p>
&lt;h3 id="pairwise-vs-absolute-revisited">Pairwise vs absolute revisited&lt;/h3>
&lt;p>Hay debate activo. El argumento contra pairwise: &lt;strong>no escala bien&lt;/strong>. Para evaluar N respuestas, pairwise requiere O(N²) comparaciones (todos contra todos) o N log N con torneo, ambos caros. Scoring absoluto es O(N).&lt;/p>
&lt;p>La síntesis emergente: &lt;strong>pairwise para gold-set y regresión&lt;/strong> (necesitas la mayor calidad), &lt;strong>absolute con G-Eval para producción&lt;/strong> (escala mejor, asumiendo calibración adecuada). La elección no es ideológica; depende de la fase del pipeline.&lt;/p>
&lt;h3 id="self-consistency-y-ensemble-de-judges">Self-consistency y ensemble de judges&lt;/h3>
&lt;p>Para casos críticos: ejecutar el judge &lt;strong>varias veces&lt;/strong> con temperature &amp;gt; 0 y agregar. Si los N judges coinciden, alta confianza; si discrepan, marca el caso para human review. Mejora robustez a costa de coste.&lt;/p>
&lt;p>Variante más avanzada: &lt;strong>jury of judges&lt;/strong> — tres judges distintos (GPT-4, Claude, un open-source) sobre la misma respuesta, agregación por mayoría. Estado del arte en agreement con humanos pero &lt;strong>3x más caro&lt;/strong>.&lt;/p>
&lt;h2 id="trampas-operativas">Trampas operativas&lt;/h2>
&lt;h3 id="golden-dataset-que-envejece">Golden dataset que envejece&lt;/h3>
&lt;p>Un golden set sin mantener empieza a divergir de la realidad: nuevos casos de uso aparecen, nuevos failure modes no están representados. &lt;strong>Revisa y enriquece el golden cada quincena o mes&lt;/strong>, idealmente añadiendo los casos donde producción falló.&lt;/p>
&lt;h3 id="judge-contaminado">Judge contaminado&lt;/h3>
&lt;p>El judge sabe demasiado sobre el dataset (apareció en su entrenamiento). Las notas son artificialmente buenas. Especialmente serio si usas datasets públicos como golden. Mitigación: &lt;strong>datasets privados curados internamente&lt;/strong>, rotación de modelos judge.&lt;/p>
&lt;h3 id="sample-size-insuficiente">Sample size insuficiente&lt;/h3>
&lt;p>Con 10 ejemplos en el dataset, una métrica que baja de 0.85 a 0.75 puede ser ruido puro. &lt;strong>Mínimo 50, ideal 200-500&lt;/strong> para que las diferencias sean significativas. Reporta intervalos de confianza, no solo medias.&lt;/p>
&lt;h3 id="costes-que-se-descontrolan">Costes que se descontrolan&lt;/h3>
&lt;p>Ejecutar G-Eval con GPT-4 sobre 5 000 respuestas/día son &lt;strong>decenas de miles de tokens/día solo de evaluación&lt;/strong> que se pagan extra. Para escalas medianas, considera &lt;strong>judge open-source&lt;/strong> (Prometheus) o &lt;strong>sampling&lt;/strong> (5-10% del tráfico evaluado, no todo).&lt;/p>
&lt;h3 id="olvidar-el-segmento">Olvidar el segmento&lt;/h3>
&lt;p>Una métrica media de 0.85 puede esconder que para el segmento &amp;ldquo;preguntas en alemán&amp;rdquo; es 0.55 y para &amp;ldquo;preguntas técnicas largas&amp;rdquo; es 0.65. Reporta &lt;strong>siempre por segmento&lt;/strong> (idioma, dominio, tenant, tipo de pregunta). El &amp;ldquo;todo está bien&amp;rdquo; es sospechoso.&lt;/p>
&lt;h3 id="no-actualizar-la-calibración">No actualizar la calibración&lt;/h3>
&lt;p>Los judges drift. Lo que medía 88% de agreement humano hace 3 meses puede haber bajado a 76% sin que nadie se entere. &lt;strong>Recalibra cada 60-90 días&lt;/strong> contra el golden set humano.&lt;/p>
&lt;h3 id="confiar-en-un-eval-para-reemplazar-humanos">Confiar en un eval para reemplazar humanos&lt;/h3>
&lt;p>Los evals automatizados son &lt;strong>complemento&lt;/strong> del juicio humano, no sustituto total. Para casos de alto stake (legal, médico, financiero) o nuevos releases mayores, &lt;strong>muestreo humano sigue siendo necesario&lt;/strong>. La proporción razonable: 95% automatizado, 5% humano en muestreo estratificado.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-próximos-posts">Lo que no hemos cubierto (próximos posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Guardrails y safety&lt;/strong>: el siguiente post de la serie. Cómo prevenir que prompts malos lleguen al modelo, en lugar de evaluar respuestas a posteriori.&lt;/li>
&lt;li>&lt;strong>MCP observability profunda&lt;/strong>: cómo OpenTelemetry GenAI se extiende a MCP servers para que las tools también sean trace-aware.&lt;/li>
&lt;li>&lt;strong>eBPF + on-device inference + drift detection&lt;/strong>: el cierre.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;p>Frameworks y plataformas:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/confident-ai/deepeval">DeepEval&lt;/a> — Apache 2.0, pytest-style.&lt;/li>
&lt;li>&lt;a href="https://www.promptfoo.dev/">Promptfoo&lt;/a> — MIT, CLI + YAML, red teaming.&lt;/li>
&lt;li>&lt;a href="https://docs.ragas.io/">Ragas&lt;/a> — Apache 2.0, RAG-specific.&lt;/li>
&lt;li>&lt;a href="https://github.com/openai/evals">OpenAI Evals&lt;/a> — MIT, clásico.&lt;/li>
&lt;li>&lt;a href="https://inspect.ai-safety-institute.org.uk/">Inspect AI&lt;/a> — UK AI Safety Institute.&lt;/li>
&lt;li>&lt;a href="https://langfuse.com/">Langfuse&lt;/a> — MIT, self-host, suite completa.&lt;/li>
&lt;li>&lt;a href="https://www.langchain.com/langsmith">LangSmith&lt;/a> — LangChain team.&lt;/li>
&lt;li>&lt;a href="https://phoenix.arize.com/">Arize Phoenix&lt;/a> — ELv2, OTel-native.&lt;/li>
&lt;li>&lt;a href="https://www.braintrust.dev/">Braintrust&lt;/a> — comercial + OSS lite.&lt;/li>
&lt;/ul>
&lt;p>Métodos y papers:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://arxiv.org/abs/2303.16634">G-Eval (Liu et al., 2023)&lt;/a> — el patrón de prompting dominante.&lt;/li>
&lt;li>&lt;a href="https://github.com/prometheus-eval/prometheus">Prometheus (KAIST + LG AI)&lt;/a> — judge open-source con 0.897 correlación.&lt;/li>
&lt;li>&lt;a href="https://arxiv.org/abs/2406.12045">Tau-bench (Sierra, 2024)&lt;/a> — tool-agent-user benchmark con pass^k.&lt;/li>
&lt;li>&lt;a href="https://arxiv.org/abs/2604.02022">ATBench (2026)&lt;/a> — trajectory safety benchmark.&lt;/li>
&lt;li>&lt;a href="https://arxiv.org/abs/2510.04550">TRAJECT-Bench (2026)&lt;/a> — trajectory-aware agentic tool use.&lt;/li>
&lt;li>&lt;a href="https://arxiv.org/html/2503.16416v2">Survey on Evaluation of LLM-based Agents&lt;/a> — el survey de referencia.&lt;/li>
&lt;/ul>
&lt;p>Comparativas 2026:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.comet.com/site/blog/llm-evaluation-frameworks/">LLM Evaluation Frameworks: Head-to-Head Comparison (Comet)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://atlan.com/know/llm-evaluation-frameworks-compared/">RAGAS, TruLens, DeepEval: LLM Evaluation Frameworks 2026 (Atlan)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://inference.net/content/llm-evaluation-tools-comparison/">LLM Evaluation Tools: Complete Comparison Guide 2026 (Inference.net)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://futureagi.com/blog/llm-as-judge-best-practices-2026">LLM-as-Judge Best Practices in 2026: Calibration, Bias, and Cost (FutureAGI)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://futureagi.com/blog/best-llm-judge-models-2026/">Best LLM Judge Models in 2026&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://medium.com/@nairmilind3/llm-evaluation-in-2026-e631a78c67dc">LLM Evaluation in 2026 (Milind Nair, Medium)&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Cross-references:&lt;/p>
&lt;ul>
&lt;li>Serie eBPF: &lt;a href="https://blog.lo0.es/posts/ebpf-cilium-tcp-ip-bypass/">eBPF de cero a Cilium&lt;/a>, &lt;a href="https://blog.lo0.es/posts/tetragon-runtime-security/">Tetragon&lt;/a>, &lt;a href="https://blog.lo0.es/posts/hubble-observabilidad-ebpf/">Hubble&lt;/a>, &lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">AgentSight y tracing LLM&lt;/a>.&lt;/li>
&lt;li>Serie de inferencia: &lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a>, &lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en K8s&lt;/a>, &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a>, &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">Operators LLM K8s&lt;/a>.&lt;/li>
&lt;/ul></description></item></channel></rss>