RAG conecta un modelo de lenguaje con los documentos y los datos internos de tu empresa al responder: busca los fragmentos pertinentes, los pasa como contexto y pide la respuesta con la cita delante. Cambias un documento y cambia la respuesta, sin tocar el modelo. Lo montamos en los proyectos de IA conectada a datos de Codezone.
Hoy la respuesta vive repartida: un manual en PDF, el histórico del ERP y la cabeza de quien lleva más tiempo en la casa. Cada consulta cuesta una interrupción a operaciones, y lo que llega al cliente depende de a quién preguntó.
Al terminar sabrás qué piezas montar y por dónde se rompe en producción, partiendo de el inventario de datos propios de la empresa.
Qué es RAG y qué resuelve frente a reentrenar
RAG es una arquitectura de recuperación: ante una pregunta busca en tus datos los fragmentos relevantes y los entrega al modelo junto al enunciado, de modo que la respuesta se apoya en documentos concretos y citables. El modelo no aprende nada de tu negocio, lee lo que le pasas.
Esa diferencia decide el proyecto. Ajustar un modelo mueve su estilo, pero congela el conocimiento en la fecha del entrenamiento y no cita fuentes. Con recuperación, actualizar la respuesta es sustituir un archivo, como se ve en la arquitectura y el ROI de integrar IA en la empresa.
Las piezas que hay que montar
- Ingesta: conectores a Drive, SharePoint y las tablas del ERP, con fecha de modificación. El transporte lo decide la elección entre API, webhook y cola.
- Troceado: fragmentos con sentido propio, respetando encabezados y tablas, con su página de origen.
- Embeddings: un vector por fragmento, con el mismo modelo que las preguntas. Si lo cambias, reindexas todo.
- Almacén vectorial: pgvector sobre Postgres si ya tienes esa base, o un motor dedicado si el volumen lo pide.
- Recuperación y reordenado: candidatos filtrados por permisos y vigencia, reordenados por pertinencia antes de gastar contexto.
- Generación con citas: cada afirmación lleva su origen, y sin apoyo el sistema dice que no lo sabe.
Los permisos filtran en la recuperación, no en la respuesta
Es el error que más caro sale. Si recuperas sobre todo el corpus y luego pides al modelo que omita lo confidencial, ya metiste en el contexto datos que ese usuario no puede ver, y basta una pregunta bien formulada para sacarlos.
OWASP lo recoge como riesgo propio: pide controles de acceso de grano fino y almacenes conscientes de permisos, y describe el entorno compartido donde los embeddings de un grupo aparecen en las respuestas de otro, en el apartado de vectores y embeddings de OWASP.
Un detalle antes de dimensionar: con índices aproximados pgvector aplica el WHERE después de recorrer el índice, así que un filtro restrictivo puede devolver menos resultados de los pedidos. Para eso están el escaneo iterativo y los índices parciales de el manual de pgvector sobre filtrado. Es el aislamiento de un portal de clientes privado con control de acceso.
Por qué funciona en la demo y falla en producción
- Troceado ciego: partir por número de caracteres corta una tabla de precios y el fragmento ya no significa nada.
- Información contradictoria: tres versiones del mismo procedimiento conviviendo. El sistema recupera una, con cita, y suena igual de segura.
- PDF escaneado sin OCR: el archivo existe, se indexa y no contiene texto. Nadie lo nota hasta que falta esa respuesta.
- Contenido obsoleto: sin fecha de vigencia, la tarifa del año pasado compite con la de este.
Tres de los cuatro son gobierno documental y piden el trabajo previo de mapear los procesos antes del software. Para exponer los datos entra la diferencia entre una API y un MCP y, si están en sistemas antiguos, el middleware que los expone.
Cómo se evalúa la calidad
Hace falta un conjunto de preguntas reales con su respuesta y su documento de origen, escrito por quien conoce el negocio. Con eso se miden dos cosas por separado: si la recuperación trajo el fragmento con la respuesta, y si la generación dijo lo que ese fragmento dice.
CodeZone Pro Tip: recupera filtrando por los espacios del usuario y por la vigencia del documento en la propia consulta, de forma que lo que no puede ver nunca llegue al contexto del modelo.
import psycopg
SQL = """
SELECT f.id, f.documento_id, f.texto,
f.embedding <=> %(consulta)s::vector AS distancia
FROM fragmento f
JOIN documento d ON d.id = f.documento_id
WHERE d.espacio_id = ANY(%(espacios)s) -- espacios del usuario
AND d.vigente_hasta > now() -- nada caducado entra
ORDER BY distancia
LIMIT %(k)s
"""
def recuperar(conn, embedding_consulta, usuario, k=8):
# Sin espacios asignados no se recupera nada: denegar por defecto
# es mas seguro que recuperar y confiar en un filtro posterior.
espacios = usuario.get("espacios") or []
if not espacios:
return []
with conn.cursor() as cur:
# Con indice aproximado pgvector filtra despues de recorrer el
# indice; el escaneo iterativo evita quedarse corto de k.
cur.execute("SET LOCAL hnsw.iterative_scan = relaxed_order")
cur.execute(SQL, {"consulta": embedding_consulta,
"espacios": espacios, "k": k})
filas = cur.fetchall()
# La cita viaja con el texto: un fragmento sin origen no genera.
return [{"documento": f[1], "texto": f[2], "distancia": f[3]}
for f in filas]Ese WHERE separa un sistema que puedes abrir a toda la plantilla de uno que solo puede usar dirección. Cuando entra alguien nuevo, nadie revisa qué podría preguntar.
Lo que Cuesta Descubrir un Fallo de Permisos Tarde
Un RAG mal cerrado no avisa. Funciona, responde bien y un día contesta una pregunta de nóminas a quien no debía. Reconstruir qué se consultó y quién solo es posible con el registro guardado.
El segundo coste es el reindexado: cambiar de modelo de embeddings obliga a recalcular el corpus entero, así que el modelo y su dimensión condicionan el almacenamiento. Decídelo con el criterio de el planteamiento de un proyecto de integración de IA en Madrid, pensando ya si el siguiente paso serán los agentes que escriben en el ERP y el CRM.
Antes de escribir una línea, recoge veinte preguntas reales de quien las responde hoy, con su documento de origen. Ese cuaderno decide troceado, metadatos y permisos.
Si tienes la documentación repartida y nadie la encuentra, revisamos qué se puede consultar y con qué permisos.