Ir al contenido

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.

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.

promptfooconfig.yaml
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 }

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 responder

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"

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:

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"

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.