la ecuación de esta slide
cos(q, d) = q · d ‖q‖ ‖d‖ = Σk qk dk √Σqk² · √Σdk² (Ec. 1)
El coseno entre el vector de la pregunta q y el de un fragmento d. El numerador es el producto escalar: se multiplican las componentes una a una y se suman. El denominador divide por las normas, de modo que sólo queda el ángulo. Vale 1 si apuntan igual, 0 si no tienen nada en común.
‖v‖ = √ v1² + v2² (Ec. 2)
La norma es la longitud del vector. Dividir por ella es lo que hace que un documento largo y uno corto sobre el mismo tema den el mismo parecido: lo que cuenta es hacia dónde apuntan, no cuánto miden.
guion paso a paso
  1. Con q = (3,4) y d = (6,8), lee el resultado. Coseno exactamente 1: d es q multiplicado por 2, el mismo contenido a distinta escala. Es el ejemplo a mano del deck.
  2. Dobla las dos componentes de d otra vez, a (12,16). El coseno sigue valiendo 1. La longitud no entra en la cuenta: por eso un artículo de tres líneas y uno de tres páginas sobre lo mismo compiten de igual a igual.
  3. Pon d = (−4, 3). Coseno 0: perpendiculares. Es lo que pasa cuando la pregunta y el fragmento no comparten ningún término relevante.
  4. Pon d = (−3, −4). Coseno −1: dirección opuesta. En un índice TF-IDF esto no ocurre (no hay componentes negativas), pero en embeddings densos sí.
Comprueba que entiendes: ¿por qué se usa el coseno y no la distancia euclídea?
Porque la distancia euclídea mezcla dos cosas: de qué habla el documento y cuánto ocupa. Dos fragmentos sobre vacaciones, uno de 50 palabras y otro de 500, estarían lejos entre sí en distancia aunque hablen de lo mismo. El coseno normaliza por la longitud y deja solo el ángulo, que es lo que codifica el significado. En la práctica los vectores se guardan ya normalizados, y entonces el coseno es simplemente el producto escalar.

Setup. Los dos vectores en el plano. En un sistema real tienen entre 384 y 3.072 componentes; aquí dos, para poder verlos.

Juega. Buscad una pareja con coseno alto y normas muy distintas: ese es el caso que la distancia euclídea juzgaría mal.

Lee así. El ángulo entre las dos flechas es todo. El arco dorado lo dibuja; el número de abajo lo cuantifica.

Mensaje. Recuperar es quedarse con los k vectores de mayor coseno con la pregunta. Todo lo demás del RAG es tubería alrededor.

Términos. q: vector de la pregunta. d: vector de un fragmento. producto escalar: suma de productos componente a componente. norma: longitud del vector. coseno: parecido, entre −1 y 1.

las ecuaciones de esta slide
tf-idf(t, d) = nt,d |d| · log 1 + N 1 + dft + 1 (Ec. 3)
El peso del término t en el documento d. A la izquierda la frecuencia: cuántas veces aparece, dividido por la longitud del documento. A la derecha la rareza: N documentos en total, dft los que contienen el término. Un término que sale en todas partes («días») pesa poco; uno que sale en un solo documento («trienio») pesa mucho.
top-k = argmaxd(k)  cos(q, d) (Ec. 4)
La recuperación: ordenar todos los fragmentos por coseno con la pregunta y quedarse con los k primeros. Esos k son los que acaban dentro del prompt, y por tanto los que pagáis.
guion paso a paso
  1. Elige «cuántos días de vacaciones me tocan» con k = 3. El artículo correcto sale el primero: la pregunta y el documento comparten la palabra «vacaciones», que es rara en el corpus.
  2. Cambia a «me caso, cuántos días libres me dan». Falla. El documento correcto habla de «matrimonio», no de «caso»: el empleado y el convenio no usan la misma palabra.
  3. Con esa pregunta, sube k hasta 8. Acaba apareciendo, pero en los últimos puestos y después de pagar ocho fragmentos de contexto en vez de tres.
  4. Vuelve a k = 3 y activa la expansión. Sale el primero y gratis: expandir la consulta ocurre ANTES de recuperar, así que no añade un solo token al prompt.
Comprueba que entiendes: ¿por qué «días» pesa poco aunque aparezca en la pregunta?
Porque el idf lo penaliza: «días» aparece en casi todos los artículos del convenio, así que df es alto y log((1+N)/(1+df)) se acerca a cero. Coincidir en «días» no distingue un documento de otro. Lo que decide el ranking son los términos raros: «vacaciones», «matrimonio», «trienio». De ahí que una pregunta formada sólo por palabras comunes recupere prácticamente al azar.

Setup. Arriba, el coseno de los diez fragmentos del corpus con la pregunta; en dorado los que entran en el prompt. Debajo, la tabla con los términos que han decidido cada puntuación.

Juega. Comparad una pregunta que use las palabras del documento con otra que use las del usuario. Es la diferencia entre un RAG de demo y uno de producción.

Lee así. Si la barra verde (documento correcto) no está entre las doradas, tenéis un fallo de recuperación, y subir k es la solución cara.

Mensaje. El fallo más común de un RAG es de vocabulario, y no se arregla con un modelo mejor.

Términos. tf: frecuencia del término. idf: rareza del término en el corpus. k: fragmentos recuperados. expansión: añadir sinónimos a la consulta antes de buscar.

las ecuaciones de esta slide
nfrag = ⌈ |D| − s w − s ⌉ (Ec. 5)
Fragmentos que salen de un documento de |D| palabras con ventana w y solapamiento s. El paso efectivo es w − s: por eso el solape tiene que ser estrictamente menor que la ventana, o el troceado no avanza nunca.
tprompt = tbase + k · w · τ (Ec. 6)
Los tokens que acaban en el prompt: una base fija más los k fragmentos de w palabras, convertidas a tokens con τ ≈ 1,3. Trozos grandes y k grande se multiplican, y esa multiplicación es la factura.
guion paso a paso
  1. Con w = 80 y s = 10, mira cuántos fragmentos salen del documento. Trozos manejables y un índice de tamaño razonable.
  2. Baja w a 20. Muchísimos fragmentos, cada uno muy preciso pero sin contexto: un «él» suelto ya no se sabe a quién se refiere.
  3. Sube w a 400 con k = 5. El prompt se dispara: estáis pagando párrafos enteros de ruido para llegar a la frase que importaba.
  4. Sube el solape hasta acercarlo a w. El número de fragmentos explota: estáis indexando el mismo texto muchas veces y pagando el almacenamiento de todas las copias.
Comprueba que entiendes: ¿para qué sirve el solapamiento?
Para que una idea no quede partida justo en la frontera entre dos fragmentos. Si el artículo dice «...con un preaviso mínimo de / quince días naturales» y el corte cae en medio, ningún fragmento responde a la pregunta completa. Un solape del 10 al 15 % resuelve la mayoría de los casos. Pasado ese punto sólo estáis duplicando texto: más índice, más coste y el mismo recall.

Setup. Arriba, cómo queda troceado un artículo del convenio con los parámetros actuales; las zonas más oscuras son el solape. Abajo, los tokens que acaban en el prompt y lo que cuestan al mes.

Juega. Buscad la combinación que os da fragmentos autocontenidos sin inflar el prompt. Suele estar entre 400 y 800 tokens.

Lee así. Si un fragmento no se entiende leído solo, el modelo tampoco lo va a entender.

Mensaje. Mejor que afinar el número es trocear por la estructura del documento: por artículo, por apartado, por fila.

Términos. w: palabras por fragmento. s: solapamiento. τ: tokens por palabra, ~1,3 en castellano. autocontenido: que se entiende sin leer el fragmento anterior.

las dos métricas de esta slide
Recall@k = #{ preguntas con alguna fuente correcta entre las k }#{ preguntas } (Ec. 7)
Mide el buscador. Si es bajo, el problema está en el troceado, en el modelo de embedding o en que k es demasiado pequeño. Es monótono creciente en k: recuperar más candidatos no puede perder uno que ya estaba.
Faithfulness = #{ respuestas apoyadas en una fuente correcta }#{ preguntas } (Ec. 8)
Mide el generador. Si es bajo, el modelo está rellenando huecos o leyendo el fragmento equivocado. No es monótono en k: depende de quién va primero, no de cuántos haya.
guion paso a paso
  1. Sin expansión, recorre k de 1 a 10 con el deslizador. La curva de recall sube, pero la de fidelidad se queda plana. Estáis pagando más contexto sin mejorar la respuesta.
  2. Mira el panel de abajo con k = 10. El coste mensual se ha multiplicado por tres respecto a k = 1, y la fidelidad es exactamente la misma.
  3. Activa la expansión y vuelve a k = 1. Las dos curvas saltan a la vez. Es la primera vez que la fidelidad se mueve.
  4. Compara el coste de «expandir con k = 1» frente a «no expandir con k = 10». Misma calidad o mejor, a un tercio del precio. La palanca barata no era la obvia.
Comprueba que entiendes: ¿por qué subir k no mejora la fidelidad?
Porque el generador no lee los k fragmentos con el mismo peso: se apoya en los primeros. Si el documento correcto entra en el puesto octavo, cuenta para el recall (está entre los k) pero no para la fidelidad (la respuesta no sale de él). Subir k mete candidatos por la cola, que es justo donde no sirven. Para mover la fidelidad hay que cambiar quién va primero: reordenando, o arreglando la consulta para que el bueno gane desde el principio.

Setup. Arriba, las dos métricas sobre el conjunto de evaluación real que lleva este deck. Abajo, el coste mensual de cada k.

Juega. El deslizador no cambia el sistema: marca el k que estáis evaluando para que podáis leer las tres columnas a la vez.

Lee así. Buscad el k donde el recall deja de subir. A partir de ahí sólo estáis pagando tokens.

Mensaje. Dos métricas, dos fallos distintos, dos arreglos distintos. Una sola métrica os deja ciegos ante la mitad de los problemas.

Términos. conjunto de evaluación: preguntas reales con su respuesta y su fuente anotadas. monótono: que no puede bajar. reordenar: cambiar el orden de los k ya recuperados.

las ecuaciones de esta slide
Cconsulta = pin[ tbase · 0,1 + k · tfrag ] + pout tout (Ec. 9)
El prompt base (instrucciones) se cachea y se factura al 10 %; los k fragmentos cambian en cada consulta, así que se pagan enteros. Esa asimetría es la que convierte a k en la variable de decisión del sistema.
Cingesta = pemb · |corpus|   (una vez) (Ec. 10)
Embeber el corpus se paga una sola vez, o cada vez que los documentos cambien. Es tan barato que nunca es el problema: a céntimos por millón de tokens, indexar una empresa entera cuesta menos que un día de consultas.
guion paso a paso
  1. Con k = 5 y 600 tokens por fragmento, mira el reparto del prompt. Los fragmentos son la mayor parte del contexto: el prompt base casi no cuenta una vez cacheado.
  2. Sube k de 5 a 20. El coste mensual se multiplica. Cada fragmento de más se paga en todas y cada una de las consultas del mes.
  3. Vuelve a k = 5 y apaga la caché del prompt base. Sube, pero menos de lo que esperabais: con k alto, lo que domina son los fragmentos, no las instrucciones.
  4. Compara el coste de la ingesta con el de un solo día de consultas. La ingesta es ruido en el presupuesto. Discutir si indexar 4.000 o 40.000 documentos es perder el tiempo.
Comprueba que entiendes: ¿por qué reordenar es la mejora con mejor relación calidad/coste de todo el pipeline?
Porque consigue el efecto de un k grande con un k pequeño. Si reordenáis bien, el fragmento correcto sube al primer puesto y podéis bajar k de 10 a 3 sin perder fidelidad: dos tercios menos de tokens en cada consulta del mes. El reordenado en sí cuesta poco (se aplica sólo a los candidatos ya recuperados, no a todo el corpus) y no añade ni un token al prompt que llega al generador.

Setup. Arriba, de qué se compone el prompt de una consulta. Abajo, el coste mensual en función de k, con vuestro punto marcado.

Juega. Poned los números de vuestro caso y comparad con el recall que necesitáis de la slide anterior.

Lee así. La pendiente de la curva es lo que os cuesta cada fragmento adicional, al mes. Decidid k mirando esa pendiente y el recall a la vez.

Mensaje. En un RAG, k es simultáneamente la palanca de calidad y la de coste. No se puede elegir mirando sólo una.

Términos. ingesta: trocear, embeber e indexar. embedding: el vector de un fragmento. reordenar: re-puntuar los k candidatos con una señal mejor.

las ecuaciones de esta slide
W′ = W + BA (Ec. 11)
W es la matriz original, de d × k, y se queda congelada. El ajuste se aprende en dos matrices finas: B de d×r y A de r×k, con r (el rango) mucho menor que d y k. La intuición: el cambio que necesitáis es mucho más simple que el modelo entero, y cabe en el producto de dos matrices delgadas.
θentrenables = r(d + k)   frente a   d · k (Ec. 12)
La cuenta que lo explica todo. Con d = k, los parámetros entrenables crecen de forma lineal en d mientras los originales crecen de forma cuadrática: cuanto mayor es el modelo, mayor es el ahorro relativo.
guion paso a paso
  1. Con d = 4.096 y r = 8, lee el porcentaje. Un 0,39 % de los parámetros. Es el número del deck, y sale de dividir 8×8.192 entre 4.096².
  2. Sube r de 8 a 128. Crece a 6,25 %, dieciséis veces más. El rango es la palanca entre capacidad de adaptación y coste: más rango aprende más, y cuesta más.
  3. Vuelve a r = 8 y dobla d de 4.096 a 8.192. El porcentaje baja a la mitad. Cuanto mayor es el modelo, más rentable es LoRA: el numerador crece lineal y el denominador cuadrático.
  4. Mira el panel de abajo con 64 capas. El adaptador pesa megabytes frente a los gigabytes del modelo: por eso podéis tener uno por cliente y cambiarlos en caliente.
Comprueba que entiendes: si LoRA es tan barato, ¿por qué no usarlo para meter el conocimiento de vuestra empresa?
Porque enseña estilo y formato, no hechos. Si entrenáis con vuestra normativa, el modelo aprenderá a sonar como vuestra normativa y seguirá inventando artículos que no existen, sólo que con el tono correcto, que es peor. Para hechos verificables y citables está RAG. La regla del tema: conocimiento nuevo → RAG; estilo y formato → LoRA; criterio → preferencias.

Setup. Arriba, la matriz congelada y las dos entrenables a escala real. Abajo, parámetros entrenables frente a totales, en escala logarítmica.

Juega. Un modelo de 7B tiene d ≈ 4.096; uno de 70B, d ≈ 8.192. Mirad cómo cambia el porcentaje.

Lee así. El rectángulo dorado al lado del gris es, literalmente, lo que entrenáis.

Mensaje. LoRA es lo que pone ajustar un modelo al alcance de una empresa mediana: una GPU, unas horas, un fichero de megabytes.

Términos. r: rango, el ancho de las matrices finas. congelar: no actualizar esos pesos. adaptador: el fichero con B y A. SFT: entrenar con ejemplos de entrada y salida correcta.

las ecuaciones de esta slide
T(m) = Wm + c (Ec. 13)
El tiempo de reloj con m sub-agentes: el trabajo W se reparte, pero la coordinación c (repartir, esperar, juntar) no se paraleliza. Es la ley de Amdahl: por mucho que subáis m, nunca bajáis de c.
Θ(m) = t0 + m(t0 + tprop) (Ec. 14)
Los tokens totales: el coordinador paga su contexto t0, y cada sub-agente vuelve a pagar el suyo más el trabajo propio. Crece de forma lineal y sin techo, justo al revés que el tiempo.
guion paso a paso
  1. Sube m de 1 a 4. El tiempo cae mucho y el coste sube poco: esta zona es donde multi-agente merece la pena.
  2. Sigue hasta m = 16. El tiempo apenas se mueve ya (está pegado a c) pero el coste sigue subiendo en línea recta. Estáis pagando sin comprar nada.
  3. Sube el contexto base a 30.000 tokens. La recta de coste se empina: cuanto más contexto necesita cada sub-agente para arrancar, antes deja de compensar.
  4. Pon la coordinación a 0 y vuelve a subir m. Sólo con coordinación gratuita el tiempo tiende a cero. En la realidad c nunca es cero: alguien tiene que repartir y juntar.
Comprueba que entiendes: ¿cuándo NO usar multi-agente?
Cuando la tarea es secuencial. Si el paso 2 necesita el resultado del paso 1, no hay nada que paralelizar: tendréis el mismo tiempo que con un solo agente y habréis pagado un contexto base de más por cada sub-agente. La prueba práctica: si no sabéis enumerar las ramas independientes antes de lanzar, no es un caso multi-agente.

Setup. Arriba, tiempo y coste en el mismo gráfico con dos ejes. Abajo, de dónde salen los tokens: coordinador y sub-agentes.

Juega. Buscad el m donde la curva de tiempo se aplana. Ese es vuestro número: más allá sólo hay factura.

Lee así. La zona dorada es donde el tiempo que ganáis justifica los tokens que gastáis. A partir de ahí, sólo gastáis.

Mensaje. Multi-agente compra tiempo de reloj con tokens, y el cambio deja de ser bueno mucho antes de lo que parece.

Términos. m: sub-agentes en paralelo. coordinación: repartir, esperar y juntar. contexto base: lo que cada sub-agente necesita para empezar. abanico: patrón de ramas independientes.

las ecuaciones de esta slide
Ctotal = Cinfer + Cemb + Cvect + Csrv + Cobs + Cpers (Ec. 15)
Las seis partidas. Las dos primeras dependen del uso; las tres siguientes son infraestructura fija; la última son personas. Un presupuesto de IA que sólo cuenta la primera está mal hecho, y es el error más repetido en los proyectos de clase.
Cusuario = Ctotal U (Ec. 16)
El número que pide el inversor: coste total entre usuarios activos U. Comparadlo con lo que cobráis por usuario y tendréis el margen. Si no sabéis estimar U, el problema no es de IA.
guion paso a paso
  1. Con los valores de partida, mira qué partida es la mayor. El personal, con diferencia. La inferencia, que es de lo único que todo el mundo habla, es la segunda.
  2. Sube las consultas a 500.000 dejando los usuarios igual. La inferencia adelanta al personal. Hay un volumen a partir del cual el coste de IA sí domina, y conviene saber dónde está el vuestro.
  3. Baja la dedicación de MLOps a 0. El total se desploma y el margen se vuelve precioso. Así es como un presupuesto se vuelve mentira.
  4. Ajusta el precio por usuario hasta que el margen se ponga verde. Ese es el precio mínimo viable de vuestro producto, y sale de un cálculo, no de mirar a la competencia.
Comprueba que entiendes: ¿qué pasa con vuestro margen si crecéis 10×?
Depende de qué partidas sean fijas. El personal y la infraestructura no se multiplican por diez: una persona puede operar un sistema que atiende a diez veces más usuarios. La inferencia sí crece de forma lineal. Por eso el margen mejora con la escala hasta que la inferencia domina el total, y a partir de ahí se estanca. Localizar ese punto es exactamente lo que el inversor quiere oír que habéis hecho.

Setup. Arriba, las seis partidas ordenadas. Abajo, coste e ingreso por usuario, con el margen.

Juega. Poned vuestros números y encontrad el precio mínimo al que vuestro producto es viable.

Lee así. Si la barra de ingreso no supera a la de coste, no tenéis un producto: tenéis un gasto.

Mensaje. La partida mayor de un presupuesto de IA suele ser una persona, no una API.

Términos. U: usuarios activos. margen: ingreso menos coste, por usuario. coste fijo: el que no crece con el uso. TCO: coste total de propiedad.

RAGRecuperar fragmentos propios y pasárselos al modelo para que responda con ellos delante, citando la fuente.
fragmentoTrozo de documento que se indexa y se recupera como unidad. Entre 400 y 800 tokens suele funcionar.
w, sTamaño del fragmento y solapamiento, en palabras. El solape tiene que ser menor que w.
embeddingVector que representa un fragmento. La cercanía entre vectores codifica parecido de significado.
cos(q, d)Similitud coseno: producto escalar dividido por las normas. Mide el ángulo, no la longitud.
tf-idfPeso de un término: frecuencia en el documento por rareza en el corpus.
kFragmentos que se inyectan en el prompt. Palanca de calidad y de coste a la vez.
Recall@kFracción de preguntas cuya fuente correcta está entre los k recuperados. Mide el buscador.
FaithfulnessFracción de respuestas que de verdad se apoyan en las fuentes. Mide el generador.
reordenarRe-puntuar los k candidatos con una señal mejor. Sube lo relevante al primer puesto sin añadir tokens.
expandirAñadir sinónimos del dominio a la consulta antes de buscar. Arregla el desajuste de vocabulario y es gratis en contexto.
MCPProtocolo estándar entre el agente y vuestros sistemas. Un servidor expone herramientas, recursos y prompts.
inyección de promptTexto en un dato de entrada que da órdenes al agente que lo lee. Peligrosa cuando el agente también puede actuar.
SFTEntrenar con pares «entrada, salida correcta». Cambia estilo y formato, no conocimiento.
LoRACongelar el modelo y entrenar dos matrices de rango bajo al lado. Casi todo el efecto por una fracción del coste.
rRango de LoRA. Más rango adapta más y cuesta más; entre 4 y 64 es lo habitual.
RLHF / DPOAprender de pares «esta respuesta mejor que aquella». Cambia el criterio, no el formato.
mSub-agentes en paralelo. El tiempo baja con rendimientos decrecientes; el coste sube sin techo.
loop engineeringEl ciclo evaluar, cambiar una cosa, volver a medir, desplegar y observar.
conjunto de evaluación30-100 preguntas reales con respuesta acordada. Sin él, «va mejor» es una opinión.
1 · Elegid por lo que falta
«¿Le falta información, acciones, capacidad de trabajo o criterio?»
Información → RAG. Acciones → MCP. Capacidad → multi-agente. Criterio → preferencias. Probad siempre de izquierda a derecha: el orden es de coste creciente.
↓
2 · Recuperar es geometría
«Quedarse con los k vectores de mayor coseno con la pregunta.»
cos(q,d) = q·d / (‖q‖‖d‖). Todo lo demás —trocear, embeber, indexar— es tubería alrededor de esa cuenta.
↓
3 · Dos métricas, dos fallos
«Recall@k mide el buscador; faithfulness mide el generador.»
Subir k sube el recall y la factura, y deja la fidelidad igual. La fidelidad depende de quién va primero, y eso se arregla reordenando o expandiendo la consulta.
↓
4 · Adaptar no es saber
«LoRA entrena el 0,39 % de los parámetros, y aun así no mete hechos nuevos.»
W′ = W + BA, con θ = r(d+k) frente a d·k. Cambia estilo y formato; para hechos verificables y citables, RAG.
↓
5 · Todo acaba en el presupuesto
«Seis partidas, y la mayor suele ser una persona.»
Ctotal = infer + emb + vect + srv + obs + pers; Cusuario = Ctotal/U. Ese cociente es la primera pregunta del inversor y el entregable del proyecto final.
Garrido-Merchán — ecgarrido@comillas.edu — Deep Learning para Business Analytics — Tema B · Sistemas sobre el agente