Pregúntale al informe que no cabe en el modelo
Trece páginas de auditoría energética a la izquierda, un asistente a la derecha. «Resume las conclusiones», «dame las tres medidas que más ahorran en JSON», «¿a cuánto estará el kWh en 2027?». Las dos primeras tienen respuesta en el informe; la tercera no, y aprobar es decirlo. El PDF se descarga de esta web y se convierte en texto dentro de tu navegador: no sube a ningún servidor.
El edificio (Torre Abaroa) y la ingeniería son inventados, y el informe está escrito a propósito con cifras que cuadran entre sí: así cada respuesta se puede comprobar contra el texto. Este documento tiene ~34.000 caracteres y aquí se envían ~6.200 como mucho: el modelo nunca lo ve entero, así que resumir bien depende de que el buscador traiga el apartado de conclusiones y no el de metodología. Y esto es un ejemplo curado: no hay una herramienta general que haga que un modelo de 2 GB sintetice un informe sin colarle una cifra de otra tabla o un precio que no existe. Lo consigue el curado del documento, del buscador, del prompt y de la comprobación, que puedes medir aquí cambiando al montaje «genérico».
Qué es exactamente el montaje «genérico» (y por qué está aquí)
No existe una herramienta general que haga que un modelo de 2 GB resuma bien un informe que no le cabe. Lo que ves en esta página funciona por el curado: del documento, del buscador, del prompt y de la comprobación. Para no pedirte que te lo creas, el montaje genérico está aquí mismo, con el mismo modelo y el mismo presupuesto de contexto, y se puede pasar la batería en los dos. Es el montaje mínimo que hace cualquiera antes de curar nada; no es un producto concreto ni una caricatura:
- Trocea el texto en bloques fijos de 900 caracteres, sin respetar apartados, párrafos ni filas de tabla: la fila «M3» de la tabla de medidas puede quedar en un trozo y su cabecera («Ahorro», «Inversión», «Retorno») en otro.
- Elige los trozos por cuántas palabras de la pregunta contienen. Sin sinónimos («placas» no encuentra «fotovoltaica», «amortiza» no encuentra «retorno»), sin refuerzo para identificadores como M3, sin partir la pregunta en dos apartados, sin arrastrar el trozo vecino.
- Envía los trozos con su número de página y el prompt «Eres un asistente útil. Responde a la pregunta del usuario usando el documento que se te da». Nada de «si te piden JSON devuelve solo el JSON», nada de «no hagas previsiones».
- Sin segunda pasada ni comprobador. Lo que dice el modelo, se queda.
Qué se curó en este caso, y por qué eso es el trabajo
- El documento. pdf.js extrae el texto con sus coordenadas; se rehacen las líneas, se quitan los pies repetidos y se detectan las tablas por alineación de columnas: la tabla de medidas, los consumos mensuales y las mediciones de la campaña llegan al modelo como filas con su cabecera («Ahorro (€/año)», «Inversión (€)»), que es lo único que permite extraer una cifra a JSON sin confundir la columna.
- El buscador. Léxico (BM25) afinado para un informe: los identificadores M1 a M8 pesan triple, las tablas se indexan por fila, una pregunta con dos partes («retorno inferior a 3 años» + «cuánto invierto») se reparte entre la tabla de medidas y el apartado de escenarios, y una tabla de sinónimos propia de este caso cruza lo que pregunta un gestor con lo que escribe una ingeniería: «placas» con «fotovoltaica», «amortiza» con «retorno», «luz» con «electricidad». Para «resume las conclusiones», el buscador tiene que traer el apartado 12 y no el de metodología: eso también se afina.
- El prompt. Escrito para este informe: copiar las cifras tal cual, con su unidad y su apartado; si piden JSON, devolver solo el JSON con las claves pedidas; si piden un resumen, usar las conclusiones del propio informe y en su orden; y la regla que más cuesta a un modelo pequeño: «si el informe no da un dato (un precio futuro, una duración de obra), di que no lo dice; no lo calcules ni lo supongas».
- La comprobación. La segunda pasada solo entra cuando el borrador da señal de problema, y un comprobador determinista la veta si añade texto, poda una salvedad verdadera («se descarta por la carga de la cubierta»), cita una página que no se le dio o hace desaparecer una cifra que sí estaba. Y la batería exige que un JSON sea JSON de verdad: si no se puede parsear, es ✗ aunque lleve las cifras.
- La prueba. Dieciséis preguntas comprobadas por datos: cifras, JSON parseable, síntesis con las tres conclusiones, y dos datos ausentes donde inventar un precio o un plazo es ✗. Las columnas «(ref)» se miden con llama.cpp sobre los GGUF con este mismo conversor, buscador, prompt y comprobador, y la columna «genérico» es el mismo modelo sin nada de lo anterior. Si este caso aún no tiene columnas medidas, la pestaña «Batería» lo dice.
- Lo que no hace. Un informe escaneado sin capa de texto no entra (aquí no hay OCR; en tu máquina, sí); un resumen «de todo el informe» no es posible con un modelo que no lo ve entero: lo que hace es resumir el apartado de conclusiones que el buscador le trae, y la página lo dice así. Los gráficos del informe original, si los hubiera, no se leen: solo el texto y las tablas.
- Privacidad. Los modelos del navegador comparten descarga con /ia-local (misma caché del mismo origen), el PDF se convierte en tu máquina y la página no llama a ningún puerto ni servidor. Un informe de un cliente no debería salir de tu ordenador, y aquí no sale.
Este informe lo curé yo para poder enseñarlo. Los tuyos serán informes de 80 páginas, con tus tablas, tus unidades y las cifras que tu gente necesita sacar a una hoja de cálculo sin equivocarse de columna. El trabajo es el mismo: trocear tus documentos como hay que trocearlos, un buscador que entienda tus identificadores y tu vocabulario, un prompt escrito para tu caso con el formato de salida que necesitas, una batería de preguntas con respuesta comprobable y el modelo elegido por medida, no por catálogo. Todo en tu máquina.