Ir al contenido

Salidas Estructuradas (JSON)

El mayor dolor de cabeza al integrar LLMs en software tradicional son las respuestas impredecibles.

Tú pides una lista de usuarios y el modelo responde: “¡Por supuesto! Aquí tienes la lista que pediste…”. Ese texto extra rompe tu código.

Gemini tiene una solución nativa: JSON Mode. Al activarlo, garantizamos que la respuesta sea un objeto JSON válido, eliminando la necesidad de expresiones regulares complejas o limpieza manual.

Imagina que tu aplicación recibe correos electrónicos de facturas desordenadas y necesitas extraer: Fecha, Total, Empresa y una lista de Items.

Vamos a crear src/json-extract.js:

  • Directoriogemini-lab
    • Directoriosrc
      • config.js
      • text-gen.js
      • json-extract.js Nuevo archivo

Copia el siguiente código:

src/json-extract.js
import { client } from "./config.js";
async function extractInvoiceData(emailContent) {
// 1. Definir el esquema esperado en el prompt
const prompt = `
Extrae la información de la siguiente factura desordenada.
Responde ÚNICAMENTE con un objeto JSON que siga esta estructura:
{
"fecha": "YYYY-MM-DD",
"empresa": "string",
"total": number,
"moneda": "string",
"items": [
{ "producto": "string", "cantidad": number, "precio_unitario": number }
]
}
Factura:
${emailContent}
`;
try {
console.log("Procesando documento...");
// 2. Configuración mágica: responseMimeType
const result = await client.models.generateContent({
model: "gemini-3-flash-preview",
contents: [{ role: "user", parts: [{ text: prompt }] }],
generationConfig: {
temperature: 0.1, // Baja temperatura para datos precisos
responseMimeType: "application/json", // <--- LA CLAVE
},
});
const responseText = result.text;
// 3. Parseo seguro. Gracias a 'application/json'.
const invoiceData = JSON.parse(responseText);
console.log("Datos extraídos (Objeto JS):");
console.log(invoiceData);
// Aquí ya podrías hacer: db.invoices.save(invoiceData)
console.log("Total a pagar:", invoiceData.total, invoiceData.moneda);
} catch (error) {
console.error("Error de parseo:", error);
}
}
// Un correo desordenado típico
const rawEmail = `
Hola, les envío la cuenta de la cena de ayer en el Restaurante "El Buen Sabor".
Fue el día 12 de Octubre de 2023.
Pedimos 2 hamburguesas a $15.000 cada una y 3 gaseosas a $5.000.
El total fue de $45.000 pesos. Gracias.
`;
extractInvoiceData(rawEmail);

Ejecútalo: node src/json-extract.js

Si todo salió bien, verás algo como:

Salida
Procesando documento...
Datos extraídos (Objeto JS):
{
fecha: '2023-10-12',
empresa: 'El Buen Sabor',
total: 45000,
moneda: 'pesos',
items: [
{ producto: 'hamburguesas', cantidad: 2, precio_unitario: 15000 },
{ producto: 'gaseosas', cantidad: 3, precio_unitario: 5000 }
]
}
Total a pagar: 45000 pesos

Al configurar responseMimeType: "application/json", cambias la forma en que el modelo selecciona los siguientes tokens. Literalmente le prohíbes generar texto que no sea sintaxis JSON válida (como comillas, llaves y comas).