Setup. Un LLM se entrena con datos hasta una fecha de corte: no conoce tu CRM, tus circulares ni el calendario de la oficina de Burgos, y lo que conocía caduca. Modelizo eso con tres números: la vigencia f(t) decae exponencialmente a ritmo λ, el modelo acierta a = 0.92 sobre conocimiento vigente y g = 0.15 cuando alucina, y el RAG acierta F = 0.95 cuando su retrieval (recall R) encuentra el documento. Arriba: P(respuesta correcta) frente a los meses desde el corte, sin RAG (tinta) y con RAG (dorado). Abajo: a la t elegida, de cada 1000 consultas, cuántas salen bien y cuántas mal en cada sistema.
Juega. Los tres sliders son las tres palancas del problema: el tiempo (que no controlas), el ritmo de cambio de tu sector (que tampoco) y el recall del retrieval (la única que sí). Observa que la alternativa real a RAG no es "el modelo a pelo", es reentrenar o hacer fine-tuning cada pocos meses: pagar decenas de miles de euros por subir f(t) de golpe a 1… y verla decaer otra vez.
Lee así. La distancia vertical entre las dos curvas es el valor económico del retrieval: a 5000 consultas/día, cada punto porcentual de brecha son 50 respuestas inventadas menos al día que un empleado o un cliente recibiría con total confianza aparente.
Mensaje. Para conocimiento corporativo cambiante, RAG gana a fine-tuning el 90 % de las veces: las actualizaciones son incrementales (indexar el documento nuevo) y el modelo nunca tiene que "aprender" tus datos, solo leerlos. El examen pasa de libro cerrado a libro abierto.
Términos. Fecha de corte: último día cubierto por los datos de entrenamiento. Alucinación: respuesta inventada emitida con la misma confianza que una correcta. Recall R: probabilidad de que el chunk que contiene la respuesta esté entre los recuperados. Faithfulness F: probabilidad de que la respuesta sea fiel al contexto recuperado.
Setup. El pipeline canónico tiene dos carriles. Ingesta (offline, una vez): los documentos se trocean en J chunks, cada chunk pasa por el modelo de embeddings φ y el vector resultante se guarda en la base vectorial. Consulta (online, cada vez): la query se embebe con el mismo φ, el índice devuelve los top-k chunks por coseno y el LLM genera la respuesta condicionada a ellos, con citas. Arriba: el diagrama con la etapa elegida iluminada y las dimensiones de cada pieza. Abajo: la memoria del índice en función de J, en float32 y en int8.
Juega. El slider de J recorre de mil a tres millones de chunks (escala log): mira cómo la memoria y el tiempo de búsqueda crecen lineales en J mientras que el coste por consulta del LLM no depende de J en absoluto: solo de k. Esa separación es el diseño entero de RAG.
Lee así. El lector da la memoria exacta J·D·b, el número de productos escalares de la fuerza bruta y la estimación ANN (ef = 64 candidatos por nivel, log2J niveles). Son los números que pides a un proveedor de vector DB antes de firmar.
Mensaje. Indexa una vez, recupera en cada query. Para empezar basta Chroma en local; cuando el corpus crece, Qdrant o Pinecone; si ya tienes Postgres, pgvector. La elección de base vectorial es logística, no ciencia: la ciencia está en el chunking y el retrieval, que vienen ahora.
Términos. Chunk dj: trozo de documento de 200–800 tokens, la unidad que se indexa. φ: modelo de embeddings. Vector DB: almacén que busca por similitud de vectores. ANN: búsqueda de vecinos aproximada (HNSW, IVF), sublineal en J.
Setup. El documento de arriba es una política de riesgo de crédito hipotecario de un banco ficticio (~600 palabras, troceada en vivo). La pregunta de juguete es: "¿qué LTV máximo permite la política en vivienda habitual y qué excepción existe?". Las palabras doradas son la respuesta anotada (dos frases: el límite del 80 % y la excepción del 85 %). Cada banda gris alterna es un chunk; las zonas color arena pertenecen a dos chunks (solape); el recuadro grueso marca los chunks que el retrieval de juguete selecciona. Abajo: precision, recall y F1 en función del tamaño de chunk, con tu s actual marcada.
Juega. Trocear mal es la causa número uno de RAG mediocre, y este es el porqué en una figura: chunks pequeños dan precisión sin contexto (la respuesta se fragmenta), chunks grandes dan contexto con ruido (la respuesta se diluye entre párrafos irrelevantes que además pagas a precio de token).
Lee así. El lector da el número de chunks (⌈(L−s)/(s−o)⌉+1), la precision y el recall contra la respuesta anotada y los tokens enviados al LLM (≈ palabras × 1.4).
Mensaje. Reglas defensivas del día: chunks de 300–600 tokens, solape de 50–100, conservar metadatos (título, sección, fecha) junto al texto, y no partir tablas ni listas en mitad de fila. La curva de abajo es la razón de cada una.
Términos. Chunk: ventana de texto indexada como una unidad. Solape o: palabras compartidas entre chunks consecutivos. Respuesta anotada (gold): el span que un humano marcó como respuesta correcta, para poder medir. F1: media armónica de precision y recall.
| # | chunk | cos |
|---|
Setup. Quince chunks reales de documentación bancaria (hipotecas, riesgo y mora, tarjetas, normativa) viven en un plano de embeddings 2D: cada punto es φ(dj), proyección didáctica de los 1024 números reales. La flecha dorada es φ(q) para la query elegida. El JS calcula los 15 cosenos de verdad, ordena, y rellena la tabla con el top-k; el sector sombreado cubre el ángulo hasta el k-ésimo clasificado.
Juega. Las queries no comparten palabras con los chunks (pregunta "porcentaje del valor de la vivienda", el chunk dice "80 % del valor de tasación, LTV"): el embedding los acerca por significado, que es justo lo que las keywords no saben hacer. Guarda esa idea para la slide de búsqueda híbrida, donde verás el caso contrario.
Lee así. El lector da el coseno del mejor y del k-ésimo chunk y la apertura del cono en grados: es la imagen mental correcta de qué significa "subir k" en producción.
Mensaje. Recuperar es medir ángulos en un espacio donde el significado es dirección. Todo lo que viene después (recall@k, híbrido, re-ranking) son parches sobre esta geometría cuando la dirección no basta.
Términos. Embedding φ(x): vector que representa el significado de un texto. Cluster: grupo de chunks del mismo tema, próximos en ángulo. Cono de recuperación: región angular que el top-k cubre alrededor de la query.
Setup. Mismo corpus de 15 chunks y mismas 4 queries de la slide anterior, ahora con las relevancias anotadas a mano (3–5 chunks relevantes por query). El ranking sale del coseno real; las curvas de arriba son Recall@k (dorado) y Precision@k (tinta) calculadas contra esas anotaciones para cada k de 1 a 15. Abajo: la ganancia marginal de recall de cada chunk añadido (barras) y el coste acumulado del contexto en céntimos (línea).
Juega. La forma de las curvas es universal: recall es monótono creciente con escalones, precision decae en cuanto los relevantes se acaban. Lo que cambia entre sistemas es dónde están los escalones: un buen embedding los adelanta, uno malo los retrasa, y la query de hipotecas enseña el caso típico de empresa: un relevante "huérfano" en otro cluster que ninguna k razonable rescata.
Lee así. El lector da Recall@k, Precision@k, el MRR del sistema sobre las 4 queries y los tokens y céntimos del contexto a la k elegida. Coherencia: con k = 15 el recall es 1 en todas las queries (está todo el corpus dentro) y la precision es exactamente |Rel|/15.
Mensaje. k grande compra recall con dos monedas: euros (cada chunk son ~400 tokens facturados) y ruido (precision baja = contexto lleno de distractores, que en la slide del presupuesto verás que degrada la propia generación). Las dos slides siguientes son las dos formas profesionales de no pagar ese precio: híbrido y re-ranking.
Términos. Rel: conjunto anotado de chunks relevantes (el "gold standard" del evaluador). Ganancia marginal: recall@k menos recall@k−1. MRR: posición media (recíproca) del primer acierto.
| chunk | côs | BM25 | score |
|---|
Setup. Mismo corpus de 15 chunks bancarios, ahora con su texto completo: el JS tokeniza (minúsculas, sin tildes, sin stopwords), calcula df, IDF y BM25 de verdad, re-escala ambos canales a [0,1] y mezcla con α. Arriba: la posición del chunk gold en el ranking según α, para las dos queries (1 = arriba del todo). Abajo: el top-6 actual como barras apiladas, parte dorada = contribución α·côs, parte gris = (1−α)·BM25.
Juega. Las dos queries son los dos extremos del mundo real. La A es el caso "siglas y códigos exactos": contratos, referencias de producto, NIFs, tickets — el embedding los aplana (significan poco) y BM25 los clava (son rarísimos). La B es el caso "paráfrasis": el cliente dice "dinero para comprar una casa a plazos" y el documento dice "hipoteca sobre vivienda habitual" — cero keywords compartidas, BM25 ciego, embedding perfecto.
Lee así. En el panel superior, una curva que baja al bajar α (la A mejora con keywords) y otra que sube (la B se rompe sin semántica): el α bueno es el tramo donde ambas están abajo. En la tabla, mira qué canal aporta cada barra del top: el gold de A vive del gris, el de B vive del dorado.
Mensaje. En producción, híbrido es el default: dense solo no basta. Query "contrato 2024-BBVA-7832": dense lo pierde, BM25 lo encuentra. Es uno de los tres patrones que suben Recall@5 de 0.65 a 0.90 sin cambiar de modelo; el siguiente es el re-ranking.
Términos. BM25: ranking léxico clásico (tf–IDF saturado y normalizado por longitud). IDF: log-rareza de un término en el corpus. Stopword: palabra vacía que se descarta ("de", "la", "que"). RRF: reciprocal rank fusion, alternativa para fusionar rankings sin normalizar scores.
Setup. 200 documentos candidatos, de los que 12 son relevantes de verdad. El bi-encoder y el cross-encoder puntúan cada uno con el modelo de ruido del panel de ecuaciones (simulado con semillas reproducibles). Arriba: la calidad final P@5 (fracción de los 5 chunks enviados al LLM que son relevantes), promediada sobre 120 réplicas Monte Carlo, en función de k0; en gris, la latencia. Abajo: el embudo de una réplica concreta: 200 → k0 → 5, con el número de relevantes que sobrevive en cada etapa.
Juega. El slider de k0 es el único hiperparámetro del patrón: cuántos candidatos baratos le confías al juez caro. El botón de réplica enseña la variabilidad: en una réplica concreta el embudo puede tener suerte o no, pero la curva (el promedio) es estable: así se decide en ingeniería, sobre la curva, no sobre la anécdota.
Lee así. P@5 en la línea base (k0 = 5, sin re-ranking) contra P@5 en tu k0: esa diferencia es lo que el cross-encoder compra; la latencia de al lado es lo que cuesta. El deck lo resume: recuperar 20 barato, re-rankear con bge-reranker-large, mandar 5 al LLM.
Mensaje. El re-ranking desacopla dos problemas que el coseno mezcla: encontrar candidatos (recall, barato, escala con J) y ordenarlos bien (precision, caro, escala con k0). Junto con híbrido y query rewriting, es el tercer patrón que sube Recall@5 de 0.65 a 0.90 sin tocar el modelo generador.
Términos. Bi-encoder: embebe query y documento por separado; similitud = coseno; precalculable. Cross-encoder: procesa el par junto y devuelve un score; no precalculable. P@5: precision sobre los 5 chunks finales. Meseta: zona donde subir k0 ya no mejora la calidad.
Setup. Arriba: el prompt como barra apilada (system + k chunks + pregunta + respuesta reservada) contra la ventana del modelo elegido; si la suma se pasa, la barra se desborda y el badge avisa. Abajo: la calidad estimada del modelo de juguete frente a k, con la zona prohibida por la ventana sombreada y tu k marcada. Todos los números (tokens, euros, cobertura, atención) salen de las fórmulas del panel, calculadas en vivo.
Juega. k y c son los dos diales que ya tocaste en chunking y recall@k; aquí ves su consecuencia final en la generación. Observa la interacción con el precio: en el modelo frontera, pasar de k = 5 a k = 25 con c = 400 sube el coste por consulta de ~0.06 € a ~0.18 €: multiplicado por 5000 consultas/día son 600 € diarios por contexto que además resta calidad.
Lee así. El lector da Tin y su desglose, el coste por consulta, la cobertura, la atención y su producto. El badge verde/ámbar es el contrato duro con el proveedor: cabe o no cabe.
Mensaje. El contexto es un presupuesto, no un saco: cada token compite por atención y por euros. RAG bien hecho es mandar pocos chunks muy buenos (de ahí híbrido y re-ranking), no muchos chunks por si acaso.
Términos. Ventana de contexto: máximo de tokens (entrada + salida) que el modelo acepta. Lost in the middle: degradación empírica del uso de información enterrada en contextos largos. pin/pout: precio por millón de tokens de entrada/salida.
| concepto | cantidad | coste |
|---|
Setup. Las dimensiones reales del caso del deck: 12 GB de normativa interna, contratos y FAQ; ~350 000 chunks de ~400 tokens; embedding multilingüe e5-large de D = 1024; almacenamiento ~1.5 GB en pgvector con cuantización a 8 bits; consulta top-10 + re-rank a top-3 + generación; ~1.8 s y ~0.02 $ por consulta. Los sliders reconstruyen ese presupuesto entero con las fórmulas del panel: arriba, el coste mensual frente a las consultas/día para los tres modelos generadores; abajo, la asimetría entre lo que se paga una vez y lo que se paga cada mes.
Juega. Este es el simulador que llevarías a la reunión de presupuesto: mueve consultas/día para ver el punto donde conviene bajar de modelo, y el corpus para comprobar que crecer en conocimiento es casi gratis. La tabla en vivo desglosa cada partida con su fórmula detrás.
Lee así. Con los valores por defecto el coste por consulta ronda 0.01–0.02 €, como en la nota técnica; un agente humano que tarda 10 minutos en buscar la misma respuesta cuesta tres órdenes de magnitud más. Ese cociente, no la demo, es lo que aprueba el proyecto.
Mensaje. El RAG corporativo es económicamente asimétrico: indexar el banco entero cuesta decenas de euros; servirlo cuesta miles al mes y escala con el uso. Optimiza en este orden: modelo generador, k efectivo (re-ranking), tamaño de chunk — y deja el corpus crecer.
Términos. e5-large: modelo de embeddings multilingüe abierto (D = 1024). pgvector: extensión de Postgres para búsqueda vectorial. Cuantización 8-bit: guardar cada dimensión en 1 byte en vez de 4. Coste de capital vs operativo: una vez (indexar) frente a recurrente (servir).
En una frase. RAG convierte el conocimiento corporativo en un sistema auditable con citas: cada pieza del pipeline tiene un dial (s, o, k, α, k0, modelo), cada dial tiene una métrica (recall@k, precision@k, faithfulness) y cada métrica tiene un precio en euros — y el Día 16 veremos cuándo, pese a todo, hay que ajustar el modelo.