0Pricing
AI Prompt Engineering · Lección

Uso de un LLM para evaluar salidas de otro LLM

Por qué funcionan los jueces LLM y en qué fallan frente a la evaluación humana.

Uso de un LLM para evaluar salidas de otro LLM es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Por qué usar un LLM como juez?

Las métricas de evaluación tradicionales (BLEU, ROUGE y coincidencia exacta) funcionan para salidas estructuradas, pero no capturan cualidades sutiles como la utilidad, la precisión, el tono y la creatividad.

La evaluación humana capta los matices, pero es lenta y costosa. El LLM como juez ofrece un punto intermedio: evaluación automatizada que comprende el significado semántico, el contexto y la calidad subjetiva, a gran escala y con un coste bajo.

Por qué funcionan los LLM como jueces

Los LLM como jueces tienen buenos resultados porque comparten con el modelo evaluado la misma capacidad de comprensión del lenguaje. Pueden evaluar:

  • Si una respuesta es fácticamente precisa, no solo si es léxicamente similar a una referencia
  • Si una respuesta es útil para el propósito indicado
  • Si el tono cumple los requisitos
  • Si un resumen recoge los puntos clave

Estas son cualidades que las métricas simples de coincidencia de cadenas no pueden medir.

Un juez LLM sencillo

El juez LLM más básico consiste en pedir al modelo que puntúe una respuesta en una escala numérica y proporcione una breve justificación. Esta es la base sobre la que se construyen todos los patrones de jueces más avanzados.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

def simple_llm_judge(question, response, criterion):
    judge_prompt = (
        f'Rate the following response on {criterion} from 1 to 5.\n\n'
        f'Question: {question}\n'
        f'Response: {response}\n\n'
        f'Return JSON: {{"score": <1-5>, "reason": "<one sentence>"}}'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=100,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    try:
        result = json.loads(r.content[0].text)
        return result['score'], result['reason']
    except Exception:
        return None, r.content[0].text

score, reason = simple_llm_judge(
    question='What is recursion in programming?',
    response='Recursion is when a function calls itself.',
    criterion='clarity and completeness'
)
print(f'Score: {score}/5 — {reason}')

Dónde fallan los LLM como jueces: sesgo de posición

Sesgo de posición: Cuando se presentan dos respuestas (A y B), los jueces LLM suelen preferir la que aparece primero, independientemente de su calidad. Los estudios muestran que esto afecta al 60-70 % de las comparaciones por pares cuando se utiliza un prompt de juez ingenuo.

Esto significa que el orden en que presenta las opciones cambia el veredicto del juez.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def demonstrate_position_bias(question, response_a, response_b):
    def ask_judge(first, second, order):
        prompt = (
            f'Question: {question}\n\n'
            f'Response 1: {first}\n\n'
            f'Response 2: {second}\n\n'
            f'Which response is better? Reply with 1 or 2.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=10,
            messages=[{'role': 'user', 'content': prompt}]
        )
        choice = r.content[0].text.strip()
        # Map back to original labels
        if order == 'AB':
            return 'A' if choice == '1' else 'B'
        else:  # BA
            return 'B' if choice == '1' else 'A'

    result_ab = ask_judge(response_a, response_b, 'AB')
    result_ba = ask_judge(response_b, response_a, 'BA')

    print(f'Order A-B: Judge picked {result_ab}')
    print(f'Order B-A: Judge picked {result_ba}')
    if result_ab != result_ba:
        print('Position bias detected: different results!')

    return result_ab, result_ba

Dónde fallan los LLM como jueces: sesgo de verbosidad

Sesgo de verbosidad: Los jueces LLM tienden a puntuar mejor las respuestas más largas y detalladas, incluso cuando objetivamente es mejor una respuesta concisa. Una respuesta que utiliza 400 palabras para expresar lo que podría decirse en 50 suele obtener una puntuación más alta que la versión concisa.

Mitíguelo indicando explícitamente al juez que penalice la longitud innecesaria.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def length_aware_judge(question, response):
    judge_prompt = (
        f'Evaluate this response for quality. Be aware of verbosity bias: '
        f'do NOT score longer responses higher just because they are longer.\n\n'
        f'Question: {question}\n'
        f'Response: {response}\n\n'
        f'Evaluate on:\n'
        f'1. Accuracy (does it correctly answer the question?)\n'
        f'2. Conciseness (does it avoid unnecessary filler?)\n'
        f'3. Helpfulness (does it serve the user well?)\n\n'
        f'Penalize responses that add filler, repetition, or irrelevant information.\n'
        f'Score each 1-5 and provide an overall score. Return JSON.'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    print(r.content[0].text)

Dónde fallan los LLM como jueces: autopreferencia

Sesgo de autopreferencia: Cuando Claude juzga dos respuestas, tiende a preferir las respuestas propias de Claude. Cuando juzga GPT-4, prefiere las respuestas propias de GPT-4. Este es un sesgo sistemático que afecta a todos los jueces LLM.

Mitigación: utilice varios modelos diferentes como jueces y agregue sus puntuaciones. El desacuerdo indica un caso dudoso que requiere revisión humana.

import anthropic
import openai

anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')

def multi_model_judge(question, response):
    judge_prompt = (
        f'Rate this response 1-10 for overall quality.\n'
        f'Q: {question}\nA: {response}\n'
        f'Reply with only a number.'
    )

    # Judge 1: Claude
    r_claude = anthropic_client.messages.create(
        model='claude-opus-4-5',
        max_tokens=10,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    score_claude = float(r_claude.content[0].text.strip())

    # Judge 2: GPT-4o
    r_gpt = openai_client.chat.completions.create(
        model='gpt-4o',
        max_tokens=10,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    score_gpt = float(r_gpt.choices[0].message.content.strip())

    avg = (score_claude + score_gpt) / 2
    print(f'Claude judge: {score_claude}, GPT judge: {score_gpt}, Average: {avg}')
    if abs(score_claude - score_gpt) > 2:
        print('WARNING: High disagreement — consider human review')
    return avg

Inflación de las puntuaciones

Inflación de las puntuaciones: Los jueces LLM tienden a otorgar puntuaciones altas (4-5 sobre 5) a la mayoría de las respuestas, comprimiendo la distribución y dificultando la distinción entre algo bueno y algo excelente. Las respuestas que obtendrían un 3/5 suelen recibir entre 4 y 4,5/5.

Solución: utilice una rúbrica que fuerce la calibración o emplee una puntuación relativa (por pares) en lugar de una puntuación absoluta.

# Anti-inflation judge prompt with explicit score anchors
CALIBRATED_JUDGE_PROMPT = (
    'Rate this response 1-5 using these STRICT score definitions:\n'
    '1 = Completely wrong, harmful, or completely off-topic\n'
    '2 = Partially relevant but contains significant errors or omissions\n'
    '3 = Correct and addresses the question but lacks depth or precision\n'
    '4 = Correct, reasonably complete, and clearly expressed\n'
    '5 = Exceptional: correct, complete, insightful, and concise\n\n'
    'Only give 5 if the response is genuinely outstanding.\n'
    'Give 3 for any adequate-but-not-impressive response.\n\n'
    'Question: {question}\n'
    'Response: {response}\n\n'
    'Score (1-5) and one-sentence reason:'
)

# Compare to non-anchored prompt which tends to cluster at 4-5
print('Anchored rubrics force the judge to use the full scale')

Cuándo funcionan mejor los LLM como jueces

Los jueces LLM son más fiables cuando:

  • Los criterios son claros y están bien definidos
  • La diferencia de calidad entre las respuestas es grande (una es claramente buena y la otra claramente mala)
  • El dominio está dentro de los conocimientos del modelo juez
  • Se evalúan cualidades subjetivas (tono y utilidad) sobre las que los evaluadores humanos también discrepan

Son menos fiables al evaluar conocimientos recientes, dominios muy técnicos o errores fácticos sutiles cuya detección requiere conocimientos especializados.

Cuándo es necesaria la evaluación humana

Mantenga a personas en el proceso para:

  • Evaluar respuestas en dominios especializados (médico, jurídico y de seguridad)
  • Establecer una calibración con valores de referencia reales para su juez LLM
  • Tomar decisiones de alto riesgo en las que los errores del juez LLM tengan consecuencias reales
  • Evaluar tareas novedosas sobre las que el modelo juez tenga pocas señales de entrenamiento
  • Detectar errores fácticos sutiles que requieran conocimientos especializados del dominio
def triage_for_human_review(question, response, llm_score, confidence_threshold=0.7):
    """
    Route low-confidence or high-stakes evaluations to human review.
    """
    # Route to human if judge is uncertain
    if llm_score is None:
        return 'human_review', 'LLM judge failed to produce a score'

    # Route to human for borderline scores (near decision boundaries)
    if 2.5 <= llm_score <= 3.5:
        return 'human_review', f'Borderline score {llm_score} — needs human judgment'

    # Route to human for domain-specific high-risk content
    HIGH_RISK_KEYWORDS = ['medication', 'legal advice', 'financial advice', 'security']
    if any(kw in question.lower() for kw in HIGH_RISK_KEYWORDS):
        return 'human_review', 'High-risk domain — human verification required'

    # Else: LLM score is sufficient
    return 'auto_accept', f'Score {llm_score} — LLM judgment sufficient'

routing, reason = triage_for_human_review('What medication should I take?', 'Take aspirin.', 4.5)
print(f'{routing}: {reason}')

Construcción de un proceso de evaluación

Un proceso práctico de evaluación mediante un LLM como juez consiste en: generar respuestas → ejecutar el juez LLM → derivar los casos dudosos a personas → agregar las puntuaciones → informar de las métricas de calidad. Registre todo para disponer de un historial de auditoría.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

def evaluate_batch(examples, product_under_test, criteria):
    results = []
    for ex in examples:
        response = product_under_test(ex['question'])
        score, reason = simple_llm_judge(ex['question'], response, criteria)

        results.append({
            'question': ex['question'],
            'response': response,
            'score': score,
            'reason': reason,
            'needs_review': score is None or 2.5 <= (score or 0) <= 3.5
        })

    # Summarize
    valid_scores = [r['score'] for r in results if r['score'] is not None]
    avg_score = sum(valid_scores) / len(valid_scores) if valid_scores else 0
    review_count = sum(1 for r in results if r['needs_review'])

    print(f'Average score: {avg_score:.2f}/5')
    print(f'Cases needing review: {review_count}/{len(results)}')
    return results, avg_score

# results, avg = evaluate_batch(test_cases, my_product, 'helpfulness')

Evaluación con referencia frente a evaluación sin referencia

Los jueces LLM pueden funcionar en dos modos:

  • Con referencia: El juez compara la respuesta con una respuesta correcta conocida. Ofrece una gran precisión, pero requiere datos etiquetados.
  • Sin referencia: El juez evalúa la respuesta por sus propios méritos (¿es coherente?, ¿útil?, ¿está bien redactada?). Es más flexible, pero menos preciso para evaluar la exactitud fáctica.

Utilice la evaluación con referencia cuando disponga de respuestas de referencia de máxima calidad. Utilice la evaluación sin referencia para tareas abiertas como la elaboración de resúmenes, la evaluación del tono o la calidad de la escritura creativa.

Comprobación de conocimientos: sesgo de posición

¿Qué es el sesgo de posición en la evaluación con LLM como juez y qué provoca?

Repaso: evaluación con LLM como juez

Los jueces basados en LLM comprenden los matices, la precisión semántica y la calidad subjetiva, aspectos que las métricas tradicionales no pueden medir. Presentan fallos relacionados con: el sesgo de posición (prefieren la primera opción), el sesgo de verbosidad (prefieren las respuestas más largas), la preferencia propia (prefieren su propio estilo) y la inflación de puntuaciones (se concentran entre 4 y 5 sobre 5). Mitíguelos aleatorizando el orden de las respuestas, dando instrucciones explícitas contra la verbosidad, utilizando rúbricas con anclajes que definan cada nivel de puntuación y empleando varios modelos diferentes como jueces. Derive las puntuaciones dudosas y los dominios de alto riesgo a evaluadores humanos. Use jueces basados en LLM para trabajar a escala y personas para la calibración y las decisiones de alto impacto.

Preguntas frecuentes

¿La lección «Uso de un LLM para evaluar salidas de otro LLM» es gratis?

Sí — el texto completo de «Uso de un LLM para evaluar salidas de otro LLM» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Uso de un LLM para evaluar salidas de otro LLM»?

Por qué funcionan los jueces LLM y en qué fallan frente a la evaluación humana. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Uso de un LLM para evaluar salidas de otro LLM»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Uso de un LLM para evaluar salidas de otro LLM
  2. Prompts de puntuación basados en rúbricas
  3. Evaluación comparativa: A frente a B
  4. Calibración y sesgos en jueces LLM
← Volver a AI Prompt Engineering