Salidas estructuradas

Cómo utilizar tablas, Markdown, JSON, XML y schemas para controlar la forma de una respuesta sin confundir estructura válida con contenido verdadero.

Hasta ahora hemos trabajado principalmente sobre la instrucción: qué debe hacer el sistema, con qué información, bajo qué criterios y en qué etapas.

Pero existe otra decisión de diseño que puede cambiar radicalmente la utilidad del resultado:

¿Cómo queremos que la información quede representada?

Supongamos que una revisión contractual devuelve veinte párrafos como éstos:

La cláusula 8.2 parece relevante porque permite ciertos usos de datos. También hay que considerar la cláusula de terminación, que podría ser problemática si...

La respuesta puede ser razonable y aun así resultar difícil de:

Una salida estructurada intenta resolver ese problema imponiendo una forma más estable a la información.

Idea central

Una salida estructurada organiza la respuesta según campos, categorías o una sintaxis definida.

Sirve para aumentar consistencia, revisión y reutilización.

Pero controla principalmente la forma de la salida. No demuestra que el contenido sea verdadero ni que la evaluación sea jurídicamente correcta.

Una escala de estructura

Podemos imaginar varios niveles:

texto libre
    ↓
lista
    ↓
tabla Markdown
    ↓
JSON o XML
    ↓
schema o estructura validable

Cada nivel agrega control formal, pero también exige más claridad sobre qué información queremos representar.

Si todavía no sabemos cuáles son las entidades, categorías o campos relevantes, pedir JSON no resolverá el problema conceptual.

Texto libre: máxima flexibilidad

Ejemplo:

Resume los principales riesgos del contrato en lenguaje claro.

La ventaja del texto libre es que permite explicación, matices y transiciones naturales.

Puede ser ideal para:

  • un informe narrativo;
  • una explicación al cliente;
  • una síntesis ejecutiva;
  • un comentario doctrinal.

Su límite aparece cuando necesitamos comparar muchas unidades de información o procesarlas de manera uniforme.

Listas: estructura mínima

Podemos pedir:

Devuelve una lista numerada.
Para cada punto incluye:
- tema;
- hallazgo;
- impacto.

La lista ya crea unidades separadas.

Sin embargo, cuando necesitamos comparar columnas —por ejemplo evidencia, riesgo e información faltante— una tabla suele ser más adecuada.

Tabla Markdown: buena para lectura humana

Los materiales del curso destacan la tabla Markdown como una excelente solución para revisión en pantalla, copia a Word o transformación posterior en minuta.

Por ejemplo:

| Nº | Documento | Cláusula | Tema | Texto relevante | Hallazgo | Riesgo | Pregunta |
|---:|---|---|---|---|---|---|---|
| 1 | contrato.pdf | 8.2 | datos | "..." | uso secundario | medio | ¿qué comprende...? |

Una instrucción completa podría ser:

Devuelve una tabla Markdown con estas columnas:

| Nº | Documento | Cláusula | Tema | Texto relevante | Hallazgo | Riesgo | Pregunta para revisar |

Reglas:
- una fila por hallazgo;
- si una cláusula genera dos riesgos distintos, utiliza dos filas;
- si no puedes localizar la cláusula, escribe “ubicación no determinada”;
- no inventes referencias;
- después de la tabla incluye una síntesis de máximo cinco prioridades.

La tabla obliga a separar conceptos que en prosa podrían mezclarse.

texto relevante ≠ hallazgo ≠ riesgo ≠ pregunta

Ese solo hecho puede mejorar considerablemente la auditabilidad de la respuesta.

Markdown: estructura para humanos y documentos

Markdown es una sintaxis ligera para estructurar texto mediante encabezados, listas, tablas, énfasis y bloques de código.

Esta misma página está escrita en Markdown/Quarto.

Podemos pedir:

Devuelve la respuesta en Markdown con esta estructura:

# Síntesis

# Matriz de hallazgos

# Información faltante

# Preguntas para la contraparte

Markdown es útil cuando la salida seguirá siendo principalmente documental y legible por personas, pero queremos una jerarquía consistente.

No necesitamos aprender programación para utilizarlo.

JSON: representar datos mediante campos y valores

JSON es una forma estructurada de representar datos.

Un objeto sencillo puede verse así:

{
  "tema": "terminacion",
  "riesgo": "alto",
  "clausula": "12.3"
}

Podemos leerlo sin conocimientos técnicos avanzados:

  • tema es un campo;
  • terminacion es su valor;
  • riesgo es otro campo;
  • alto es su valor.

Una lista de hallazgos podría representarse así:

{
  "hallazgos": [
    {
      "id": "H1",
      "tema": "datos",
      "clausula": "8.2",
      "riesgo": "medio"
    },
    {
      "id": "H2",
      "tema": "terminacion",
      "clausula": "12.3",
      "riesgo": "alto"
    }
  ]
}

La principal ventaja es que la información deja de estar sólo escrita “para leer” y pasa a tener campos explícitos que pueden ser validados o procesados.

Cuándo JSON resulta especialmente útil

Puede ser apropiado cuando la respuesta deberá:

  • convertirse en una planilla;
  • almacenarse como registros;
  • pasar a otra aplicación;
  • compararse automáticamente;
  • ser validada por reglas;
  • alimentar otra etapa del proceso.

Por ejemplo:

Devuelve exclusivamente JSON válido con esta estructura:

{
  "documento": "...",
  "hallazgos": [
    {
      "id": "H1",
      "clausula": "...",
      "tema": "...",
      "texto_relevante": "...",
      "interpretacion": "...",
      "riesgo": "alto|medio|bajo",
      "informacion_faltante": null,
      "pregunta_para_contraparte": "..."
    }
  ]
}

Aquí la estructura obliga a decidir qué información importa.

Ese es uno de los efectos más útiles de diseñar outputs: nos fuerza a definir las entidades del análisis.

null: representar ausencia sin inventar

Una salida estructurada puede crear una presión implícita por rellenar todos los campos.

Supongamos que no conocemos la jurisdicción aplicable.

Una mala salida sería:

{
  "jurisdiccion": "Chile"
}

si el documento no lo establece.

Podemos permitir explícitamente:

{
  "jurisdiccion": null
}

null representa que no existe un valor disponible para ese campo.

En el marco del curso, esta idea es importante porque información faltante no debe convertirse en información inventada sólo para completar una estructura.

Podemos instruir:

Si un campo no puede determinarse a partir de los documentos autorizados, usa null o “no determinado en el documento”. No inventes valores.

XML: etiquetas y estructura anidada

XML representa información mediante etiquetas.

Ejemplo:

<hallazgo>
  <tema>terminacion</tema>
  <clausula>12.3</clausula>
  <riesgo>alto</riesgo>
</hallazgo>

La información puede anidarse:

<revision_contrato>
  <documento>contrato.pdf</documento>
  <hallazgos>
    <hallazgo id="H1">
      <clausula>8.2</clausula>
      <tema>datos</tema>
      <texto_relevante>...</texto_relevante>
      <interpretacion>...</interpretacion>
      <riesgo nivel="medio">...</riesgo>
    </hallazgo>
  </hallazgos>
</revision_contrato>

Los materiales del curso destacan una ventaja pedagógica de XML: puede ser cómodo cuando queremos delimitar bloques largos y anidados mediante etiquetas visibles.

JSON y XML: una comparación inicial

Criterio JSON XML
Lectura humana en datos breves buena buena
Verbosidad menor mayor
Datos compactos muy cómodo posible, pero más extenso
Bloques largos y anidados puede ser menos cómodo etiquetas explícitas ayudan
Validación formal JSON Schema XSD, DTD u otras reglas
Uso pedagógico en esta clase matrices, extracción, datos secciones anidadas, documentos, delimitación

Esta comparación es orientativa. Los sistemas reales pueden imponer decisiones tecnológicas distintas.

La lección no es “JSON es mejor que XML” o viceversa. La pregunta es:

¿Qué forma sirve mejor a la tarea y al consumidor de la salida?

XML también puede utilizarse dentro del prompt

No es necesario pedir una salida XML para aprovechar etiquetas.

Podemos estructurar una instrucción larga así:

<encargo>
  <objetivo>Preparar una revisión inicial antes de la firma.</objetivo>
  <parte_representada>Cliente</parte_representada>
</encargo>

<contexto>
  <hecho>El servicio procesará información confidencial.</hecho>
  <hecho>La continuidad es crítica.</hecho>
</contexto>

<documentos>
  <principal>contrato.pdf</principal>
  <anexo>anexo_datos.pdf</anexo>
</documentos>

<reglas>
  <regla>No inventes cláusulas.</regla>
  <regla>Distingue texto e interpretación.</regla>
</reglas>

Aquí XML cumple una función de delimitación de secciones, no de salida.

Podríamos lograr algo semejante con encabezados Markdown. Lo importante es hacer visible qué bloque cumple qué función.

¿Qué es un schema?

Hasta ahora hemos descrito una estructura esperada mediante un ejemplo.

Un schema formaliza qué estructura se considera válida.

Imaginemos que queremos exigir que todo hallazgo tenga:

  • id;
  • tema;
  • riesgo;
  • evidencia.

Y además queremos que riesgo sólo pueda ser:

alto | medio | bajo | no_determinado

Un schema permite expresar reglas de ese tipo de manera más formal.

Para un principiante, basta comprender esta diferencia:

“devuelve JSON”
        ↓
control general de formato

“devuelve JSON que cumpla este schema”
        ↓
control más estricto de campos y tipos

Un ejemplo mínimo de JSON Schema

No necesitamos aprender toda la especificación. Observemos sólo la idea:

{
  "type": "object",
  "required": ["tema", "riesgo"],
  "properties": {
    "tema": {
      "type": "string"
    },
    "riesgo": {
      "type": "string",
      "enum": ["alto", "medio", "bajo", "no_determinado"]
    }
  }
}

Esto expresa, simplificando:

  • la salida debe ser un objeto;
  • debe incluir tema y riesgo;
  • ambos son texto;
  • riesgo sólo admite cuatro valores.

El schema controla estructura. Todavía no sabe si la clasificación es correcta.

Cinco niveles de corrección que no debemos confundir

Esta es una de las distinciones más importantes de toda la sección.

Una salida puede ser:

1. sintácticamente válida
2. compatible con el schema
3. semánticamente coherente
4. respaldada por la fuente
5. jurídicamente razonable

Cada nivel exige controles distintos.

1. Sintaxis

{
  "riesgo": "alto"
}

¿Es JSON válido?

2. Schema

¿Tiene los campos obligatorios y valores permitidos?

3. Semántica interna

¿El valor del campo corresponde realmente al significado del campo?

Un error semántico sería:

{
  "riesgo": "clausula 8.2"
}

4. Evidencia factual

¿La cláusula 8.2 existe y dice lo que la respuesta afirma?

5. Evaluación jurídica

¿Clasificarla como “alto” está suficientemente justificado?

Estructura correcta ≠ contenido verdadero

Un JSON puede ser perfectamente válido, cumplir un schema y contener una cláusula inexistente.

Una tabla puede verse impecable y mezclar texto contractual con inferencias.

La presentación ordenada facilita el control. No reemplaza la evidencia ni la revisión.

Diseñar una salida verificable

Si queremos usar estructura para mejorar revisión, debemos incluir campos que hagan visible la procedencia.

Comparemos:

{
  "riesgo": "alto"
}

con:

{
  "id": "H1",
  "documento": "contrato.pdf",
  "ubicacion": "clausula 8.2",
  "texto_relevante": "...",
  "interpretacion": "...",
  "riesgo": "medio",
  "base_del_riesgo": "...",
  "informacion_faltante": null
}

La segunda estructura no garantiza verdad, pero crea lugares específicos donde el sistema debe separar:

fuente
texto
interpretación
evaluación
incertidumbre

Eso favorece una revisión mucho más disciplinada.

Categorías cerradas y vocabulario controlado

Un formato estructurado puede limitar valores.

Por ejemplo:

Tema permitido:
- datos_personales
- confidencialidad
- propiedad_intelectual
- responsabilidad
- termino
- otro
Riesgo permitido:
- alto
- medio
- bajo
- no_determinado

Esto ayuda a detectar desviaciones.

Si la respuesta devuelve:

riesgo = “bastante preocupante”

sabemos que no siguió la taxonomía.

Pero también existe un peligro: si la lista de categorías está mal diseñada, podemos obligar a encajar casos complejos en una clasificación insuficiente.

La estructura amplifica tanto un buen diseño como un mal diseño.

La salida debe diseñarse desde su uso posterior

No debemos pedir JSON porque “suena técnico”.

Preguntemos primero:

¿Quién o qué consumirá esta salida después?

Si la leerá una persona en una reunión

Tabla Markdown.

Si irá a una minuta

Markdown con encabezados y tabla.

Si se transformará en registros o una planilla

JSON puede ser útil.

Si necesitamos bloques documentales largos y jerarquías anidadas

XML puede resultar cómodo.

Si otro sistema necesita validar campos

Puede ser conveniente un schema.

La forma debe seguir al proceso, no al entusiasmo por una sintaxis.

Salidas estructuradas en un proceso por etapas

La página anterior mostró cómo separar extracción y evaluación.

Podemos reforzar esa frontera mediante estructuras distintas.

Etapa 1:

{
  "evidencias": [
    {
      "id": "E1",
      "documento": "contrato.pdf",
      "ubicacion": "8.2",
      "texto": "..."
    }
  ]
}

Etapa 2:

{
  "evaluaciones": [
    {
      "evidencia_id": "E1",
      "interpretacion": "...",
      "riesgo": "medio"
    }
  ]
}

Ahora la evaluación puede referirse a una evidencia identificada en vez de reescribirla libremente.

No estamos construyendo todavía un sistema automatizado. Sólo estamos aprendiendo una idea de diseño: la estructura puede preservar fronteras entre tipos de información.

Caso conductor: una matriz procesable

Para el contrato del proveedor de IA podríamos pedir:

Devuelve exclusivamente JSON válido.

Cada hallazgo debe contener:
- id;
- documento;
- ubicacion;
- tema;
- texto_relevante;
- interpretacion;
- riesgo;
- base_del_riesgo;
- informacion_faltante;
- pregunta_para_contraparte.

Reglas:
- no inventes ubicaciones;
- texto_relevante debe provenir del documento;
- separa texto e interpretación;
- riesgo sólo puede ser alto, medio, bajo o no_determinado;
- usa null cuando un dato no pueda determinarse;
- si no existe evidencia suficiente, no presentes el hallazgo como confirmado.

La estructura ya puede utilizarse para revisar, comparar o procesar.

Sin embargo, la decisión de si el contenido es correcto sigue requiriendo evidencia y control.

Qué debes recordar

Una salida estructurada no es simplemente una respuesta “bonita”. Es una forma de hacer más estable la representación del resultado.

Podemos aumentar control desde texto libre hasta tablas, JSON, XML y schemas.

Pero debemos mantener esta separación:

FORMA CORRECTA
≠
CONTENIDO CORRECTO
≠
EVIDENCIA SUFICIENTE
≠
EVALUACIÓN JURÍDICA CORRECTA

La estructura ayuda a revisar. No sustituye la revisión.

El problema que todavía queda abierto

Ya conocemos muchas técnicas para diseñar mejores prompts. Pero a veces el usuario sabe qué trabajo quiere realizar y, sin embargo, no sabe cómo traducirlo a una buena instrucción.

Podemos entonces pedir al propio modelo que critique, transforme o construya el prompt.

Ese es el objeto del siguiente nodo: los meta-prompts.

Back to top