Aserciones avanzadas
Hasta ahora usamos contains (contiene texto) y max-length (longitud). Son útiles, pero para ingeniería de software necesitamos precisión quirúrgica.
Promptfoo tiene una batería de aserciones diseñadas para desarrolladores. Vamos a ver las 3 más críticas.
1. Validación de estructura (is-json)
Sección titulada «1. Validación de estructura (is-json)»Si estás construyendo una API, lo más importante es que el LLM no rompa el formato JSON. Esta aserción no solo verifica que sea JSON válido, sino que también puede validar su esquema usando la sintaxis de JSON Schema.
prompts: "Extrae los datos del usuario: {{user_data}}"tests: - vars: user_data: "Juan Pérez, 30 años, vive en Madrid." assert: - type: is-json value: required: ["name", "age", "city"] properties: name: { type: string } age: { type: number }2. Reglas negativas (not-contains)
Sección titulada «2. Reglas negativas (not-contains)»Igual de importante que lo que debe decir, es lo que NO debe decir. Úsalo para evitar menciones a la competencia, lenguaje tóxico o alucinaciones conocidas.
assert: - type: not-contains value: "ChatGPT" # "No digas que eres ChatGPT, di que eres mi asistente" - type: not-contains value: "No lo sé" # Forzar a que intente responder3. Lógica personalizada (javascript)
Sección titulada «3. Lógica personalizada (javascript)»Cuando las reglas predefinidas no alcanzan, puedes escribir código JavaScript (o Python) directamente en tu test para evaluar la respuesta. La función recibe output (texto generado) y devuelve true (pasa) o false (falla).
assert: - type: javascript value: "output.includes('ERROR') || output.length > 100"Lab: Validando una extracción de datos
Sección titulada «Lab: Validando una extracción de datos»Vamos a actualizar nuestro archivo de configuración para probar un caso de uso real: Extraer información de facturas.
Edita tu archivo ai-tests/promptfooconfig.yaml:
description: "Extractor de Facturas"
prompts: - "Eres un sistema OCR. Extrae la fecha y el total del siguiente texto en formato JSON: {{text}}"
providers: [google:gemini-2.5-flash]
tests: - vars: text: "Factura A-001. Fecha: 2023-10-25. Total a pagar: $500 USD." assert: # 1. Debe ser JSON válido - type: is-json
# 2. Debe contener las claves correctas (usando JS para validar claves) - type: javascript value: "const j = JSON.parse(output); return 'fecha' in j && 'total' in j;"
# 3. No debe incluir texto extra fuera del JSON - type: not-contains value: "Aquí tienes"¿Y la subjetividad?
Sección titulada «¿Y la subjetividad?»Todo esto es lógica determinista. Pero, ¿cómo evaluamos: “¿La respuesta fue amable?” o “¿El resumen capturó la idea principal?”?
Para eso, necesitamos que otra IA actúe como juez. Eso es lo que veremos en el capítulo final: LLM-as-a-Judge.