Un proceso integral
Subir, OCR, dividir en fragmentos, incrustar, recuperar, responder con referencias — con reintentos y controles de calidad en los pasos en los que se producen errores debido a datos incorrectos, en lugar de al final del proceso.
Caso práctico de IA como servicio (SaaS)
Una plataforma que convierte un PDF —incluidos los escaneos en los que nadie puede realizar búsquedas— en algo sobre lo que la gente puede hacer preguntas, ya sea a través de un chat web, por SMS o apuntando con la cámara del móvil a un código QR impreso en el documento sobre el que están preguntando.

TextGPT + IQR.Codes son dos productos integrados en un mismo flujo de trabajo, desarrollados para Modezilla LLC. TextGPT es la parte destinada al usuario: sube un documento, elige un perfil y hazle preguntas. IQR.Codes es la parte empresarial, en la que una empresa sube sus manuales y políticas, imprime un código QR y cada cliente que lo escanea inicia una conversación en la que ya se conocen las respuestas.
El proceso subyacente es el mismo en ambos casos: carga, OCR, segmentación, incrustación, recuperación y respuesta con referencias. Lo que lo complicaba era el estado en el que llegaba realmente el PDF. Una exportación digital limpia es un problema resuelto; una fotografía de una página de un manual de hace quince años no lo es, y esos son precisamente los documentos con los que cuentan las empresas.
El resto de la arquitectura se deriva de dos requisitos que se establecieron antes de escribir la primera línea de código: una respuesta debe recibirse en menos de un segundo y ninguna organización debe poder ver nunca los documentos de otra. El segundo requisito se garantiza en Postgres mediante la seguridad a nivel de fila, en lugar de que sea la aplicación la que se encargue de aplicar los filtros.

Una guía paso a paso sobre TextGPT e IQR.Codes, desde que se carga un PDF en el panel de control hasta que un cliente escanea un código impreso y recibe la respuesta en forma de mensaje de texto.
Importación de archivos PDF con OCR
Los documentos se introducen tal y como están, incluidos los escaneados. Antes de que nada llegue al analizador sintáctico, se realiza un proceso de OCR y una fase de limpieza, por lo que una página fotografiada pasa a ser consultable en lugar de ser omitida.
Respuestas con referencias
Un chat mejorado con funciones de búsqueda que responde basándose en los documentos subidos y muestra de cuál de ellos procede la respuesta, en lugar de basarse en lo que el modelo ya creía.
Canales QR y SMS
Al escanear un código, se abre un chat web de la marca o una conversación por mensaje de texto. No hay que instalar nada ni crear ninguna cuenta, y, al utilizar SMS, el cliente conserva el hilo de la conversación en sus mensajes.
Multitenant por defecto
Cada fila y cada archivo están limitados al ámbito de una organización en el propio Postgres, mediante la seguridad a nivel de fila y las URL firmadas, en lugar de un filtro en la capa de aplicación.
Suscripciones y facturación
Los niveles de Stripe determinan a qué canales tiene acceso una cuenta y en qué medida puede utilizarlos, y ofrecen un portal de cliente para gestionar todo a partir del primer pago.
La respuesta está en el manual. El manual es un escaneo. El escaneo no permite realizar búsquedas, y nadie va a leer cuarenta páginas para encontrar una sola línea.
Las empresas disponían de documentos que ya contenían todas las respuestas que sus clientes solicitaban —manuales de productos, políticas, fichas técnicas, condiciones de devolución— en un formato en el que nadie podía realizar búsquedas. Cuando esos documentos eran fotografías de páginas en lugar de archivos digitales, ni siquiera una búsqueda de texto sin formato arrojaba ningún resultado. La solución provisional era una cola de atención al cliente: alguien se pasaba todo el día releyendo el mismo PDF y volviendo a escribir el mismo párrafo, mientras el cliente esperaba.
Documentos no indexables
La información ya existía, en archivos PDF, y lo peor era que se trataba de imágenes de páginas, en las que ni siquiera la búsqueda de texto daba ningún resultado.
Tensiones en la puerta principal
Cualquier cosa que pidiera al cliente que instalara una aplicación o creara una cuenta lo hacía perder de vista antes incluso de que se le planteara la pregunta.
Coste y aislamiento a gran escala
El sistema debía seguir siendo rápido y económico al gestionar millones de documentos, al tiempo que garantizaba que ninguna organización pudiera leer los de otra.
Un único proceso: carga, OCR, división en fragmentos, incrustación, respuesta.
Todos los documentos siguen el mismo proceso. Se suben, se someten a OCR cuando es necesario, se dividen en fragmentos, se incorporan y se almacenan junto con sus vectores en Postgres. Las preguntas se incorporan de la misma manera y se responden a partir de los resultados obtenidos, citando la fuente. Sobre ese único proceso se asientan dos productos —TextGPT, para una persona con un documento, e IQR.Codes, para una empresa cuyos clientes tienen las preguntas— y dos vías de acceso: el chat web y los SMS, a los que se puede acceder a través de un código impreso en el embalaje.
Subir, OCR, dividir en fragmentos, incrustar, recuperar, responder con referencias — con reintentos y controles de calidad en los pasos en los que se producen errores debido a datos incorrectos, en lugar de al final del proceso.
TextGPT para uso personal e IQR.Codes para empresas, compartiendo la capa de ingesta y recuperación en lugar de que cada uno tenga su propia copia.
Supabase con seguridad a nivel de fila y pgvector, en las funciones sin servidor de Vercel. Las políticas con ámbito limitado y las URL firmadas hacen que el aislamiento sea una característica intrínseca de la base de datos.
The personal side of the platform: a chat window over whatever has been uploaded, with a persona that sets how the answers come back. The badge under the title is the one currently answering, and switching it is a sentence in the conversation rather than a trip to a settings page.

A team creates a product, drops in the PDF documentation, and optionally writes a system prompt that steers how the assistant answers about that one product. What comes out is a secure knowledge base and a QR code pointing at it — branded SMS or web chat, no support ticket in between.

Every product has its own row, with codes to view, edit and download. That download is what actually gets printed — on packaging, on an event flyer, on a sticker beside the machine — so the customer with the question is one camera scan away from the answer.

Web chat and SMS land in the same log, with the message, the time, the direction and the delivery status on a single line. It is what turns the chatbot from something a business hopes is working into something it can audit — and what shows which questions customers keep asking.

Three Stripe tiers, where the feature matrix is the product decision made visible. The entry plan is web chat reached from a printed code, the middle one adds SMS on a shared toll-free number, and the top one is a dedicated line for a brand that wants the number to be its own.

Lo suficientemente rápido como para responder, lo suficientemente riguroso como para inspirar confianza.
La plataforma se basaba en cifras concretas, en lugar de en impresiones: el tiempo que tarda un documento en poder consultarse, el tiempo que tarda en aparecer una respuesta, qué porcentaje de un escaneo de mala calidad se conserva tras el OCR y a qué parte de los datos de una organización puede acceder otra.
Solution: Antes de que cualquier dato llegue al analizador sintáctico del LLM, se lleva a cabo una etapa de preprocesamiento mediante OCR y una ronda de limpieza heurística, con reintentos y controles de calidad posteriores. Esa combinación es lo que ha permitido que la precisión en escaneos difíciles y de baja calidad haya pasado de ser inaceptable a fiable.
Solution: Índices pgvector optimizados, escrituras por lotes y similitud coseno sobre ámbitos filtrados en lugar de sobre todo el corpus, con un almacenamiento en caché ligero de metadatos para las consultas que se repiten.
Solution: Un esquema impuesto por RLS con segregación de roles de servicio, y Supabase Storage al que solo se puede acceder a través de URL firmadas bajo políticas de ámbito limitado. Los datos de la organización están separados por la base de datos, no por el código que los consulta.
¿Tienes documentos que nadie puede buscar?
Convirtámoslas en respuestas.