Cómo hacer que un LLM admita cuando no sabe algo

By Carlos Montiel | Especialista en IA Empresarial
Publicado: 2026-07-28 | Por: Carlos Montiel | Lectura: ~5 minutos

Los modelos de lenguaje están entrenados para completar texto de forma plausible, no para medir su propia certeza. Enseñarles a decir "no sé" requiere ir contra ese sesgo por defecto — y hay técnicas concretas que lo logran de forma consistente.

Por qué el modelo "por defecto" nunca dice "no sé"

El sesgo de entrenamiento de los modelos de lenguaje favorece respuestas que suenan completas y seguras sobre respuestas honestas que admiten un vacío. Esto no es un bug aislado — es consecuencia directa de cómo se entrenan y evalúan estos sistemas: una respuesta incompleta o dubitativa se penaliza más en muchos benchmarks que una respuesta incorrecta pero fluida. El resultado es que, sin instrucción explícita, el modelo casi siempre prefiere inventar algo plausible a admitir un vacío de información.

La solución no es un truco de prompt único — es una combinación de instrucción explícita, restricción estructural, y verificación posterior.

Instrucción explícita: dar permiso, no solo pedirlo

La instrucción más efectiva no es "sé honesto" (demasiado vaga para cambiar el comportamiento del modelo) — es dar permiso explícito y sin ambigüedad para responder con incertidumbre, y decir exactamente qué frase usar.

system_prompt = """ Si la pregunta requiere información que no está en el contexto provisto, o si no tienes suficiente certeza para responder con confianza, responde exactamente: "No tengo información suficiente para responder esto con confianza." Esta es una respuesta válida y preferida sobre una respuesta inventada. No serás penalizado por admitir un vacío de información — sí lo serás por afirmar algo incorrecto con seguridad. """

La frase "no serás penalizado por..." parece innecesaria pero es efectiva: contrarresta directamente el sesgo de entrenamiento hacia respuestas que suenan completas.

Restricción estructural: pide el nivel de confianza como campo, no como prosa

Pedirle al modelo que "diga si no está seguro" dentro de una respuesta en prosa es frágil — es fácil de ignorar bajo presión de completar la tarea. Forzar un campo de confianza explícito en un output estructurado hace que la incertidumbre sea un dato, no una opinión que el modelo puede omitir.

output_config = { "format": { "type": "json_schema", "schema": { "type": "object", "properties": { "respuesta": {"type": "string"}, "confianza": { "type": "string", "enum": ["alta", "media", "baja", "insuficiente_informacion"], }, "fuente_usada": { "type": ["string", "null"], "description": "Fragmento exacto del contexto que respalda " "la respuesta, o null si no hay respaldo directo", }, }, "required": ["respuesta", "confianza", "fuente_usada"], "additionalProperties": False, }, } }

Con este schema, tu aplicación puede tratar `confianza: "insuficiente_informacion"` como una rama de código explícita — mostrar un mensaje distinto, escalar a un humano, o pedir más contexto — en vez de depender de que el modelo lo mencione espontáneamente en el texto.

Grounding: la causa raíz suele ser falta de contexto, no falta de instrucción

Antes de asumir que necesitas más prompting, verifica si el modelo simplemente no tiene la información en su contexto. Un modelo bien instruido para decir "no sé" seguirá inventando si su contexto no incluye el dato correcto — porque desde su perspectiva, no hay diferencia entre "esto no está en mi contexto" y "esto no existe". Si tu sistema es RAG, revisa primero el recall del retrieval (ver el artículo de context engineering para RAG) antes de asumir que el problema es de calibración del modelo.

El patrón de verificación cruzada (chain of verification)

Para casos de alto riesgo, una segunda llamada que audita la primera respuesta contra el contexto detecta afirmaciones no respaldadas con más confiabilidad que pedirle al mismo modelo, en la misma llamada, que se autoevalúe mientras genera.

def verificar_respuesta(respuesta_original, contexto): prompt_verificacion = f""" Verifica cada afirmación de esta respuesta contra el contexto. Para cada afirmación, marca: - RESPALDADA: el contexto la confirma directamente - NO RESPALDADA: el contexto no dice esto - CONTRADICHA: el contexto dice algo distinto Contexto: {contexto} Respuesta: {respuesta_original} """ return client.messages.create( model="claude-haiku-4-5", # modelo barato para el paso de verificación max_tokens=1024, messages=[{"role": "user", "content": prompt_verificacion}], )

Usar un modelo más barato para este paso de verificación es razonable — la tarea de "comparar afirmación contra texto fuente" es más simple que la generación original, y no necesita el modelo más grande.

Maneja el stop_reason de refusal explícitamente

Algunos modelos, ante ciertas categorías de riesgo, se niegan directamente a responder en vez de intentar contestar con baja confianza. Este es un caso distinto al de "no sé" pero tu código debe manejarlo — nunca asumas que `response.content` siempre tiene contenido útil sin revisar primero `stop_reason`.

if response.stop_reason == "refusal": # El modelo se negó — trátalo como resultado, no como error de tu código manejar_negativa(response.stop_details) else: procesar_respuesta_normal(response.content)

Mide la calibración, no solo la precisión

Un modelo bien calibrado no es el que nunca se equivoca — es el que, cuando se equivoca, expresó baja confianza; y cuando acierta, expresó alta confianza. Para medir esto en un set de evaluación:

def evaluar_calibracion(casos_evaluados): # Para cada nivel de confianza declarado, ¿qué % de las # respuestas fueron correctas? por_nivel = {} for caso in casos_evaluados: nivel = caso["confianza_declarada"] por_nivel.setdefault(nivel, {"correctas": 0, "total": 0}) por_nivel[nivel]["total"] += 1 if caso["fue_correcta"]: por_nivel[nivel]["correctas"] += 1 return { nivel: datos["correctas"] / datos["total"] for nivel, datos in por_nivel.items() } # Un modelo bien calibrado debería mostrar: alta > media > baja # en tasa de acierto. Si "alta" y "baja" tienen tasas similares, # la confianza declarada no significa nada — es ruido.

Si tu evaluación muestra que el modelo declara "alta confianza" con la misma frecuencia de acierto que "baja confianza", el problema no es que el modelo no sepa cuándo dudar — es que tu prompt no le está dando una razón real para diferenciar, y necesitas revisar la instrucción de calibración desde el principio.

Carlos Montiel
Arquitecto de Soluciones IA Empresarial
Especialista en LLMs, Agentes y Orquestación
guatemalia.com/#contacto · info@guatemalia.com

¿Necesitas implementar IA en tu empresa?

Carlos Montiel es arquitecto de soluciones IA empresarial. Implementa LLMs, Agentes, RAG y orquestadores en empresas de Guatemala y Latinoamérica. Contáctalo para una consultoría.

Contactar a Carlos Montiel

info@guatemalia.com