U-04 · pruebas · julio de 2026

RAG, agentes y LLM: cómo interactúa todo con todo

Las tres piezas, por separado

Antes de mezclarlas conviene tener claro qué hace cada una, porque se confunden a menudo:

Pieza 1: un LLM a pelo

respuesta = llm.generar(
    prompt="¿Cuál es la política de vacaciones de mi empresa?"
)
# El modelo inventa una respuesta plausible, porque no tiene ese dato.

Sin más contexto, el modelo alucina. No es un fallo moral, es lo esperable: se le pide un dato que no está en su entrenamiento.

Pieza 2: añadiendo RAG

La idea de RAG es simple: antes de preguntar al modelo, buscamos los fragmentos de texto más relevantes en nuestros propios documentos y se los damos como contexto.

# 1. Convertimos la pregunta en un vector (embedding)
vector_pregunta = embeddings.generar("política de vacaciones")

# 2. Buscamos los fragmentos más parecidos en la base vectorial
fragmentos = base_vectorial.buscar(vector_pregunta, top_k=3)

# 3. Construimos un prompt con esos fragmentos como contexto
contexto = "\n---\n".join(f.texto for f in fragmentos)
prompt = f"""Usa solo este contexto para responder:
{contexto}

Pregunta: ¿Cuál es la política de vacaciones de mi empresa?"""

respuesta = llm.generar(prompt)
# Ahora responde con datos reales de tu documentación, no con una invención.

El modelo sigue sin “saber” nada de forma permanente: cada llamada es independiente. RAG no le da memoria al modelo, le da memoria al sistema que lo rodea.

Pieza 3: convirtiéndolo en agente

Un agente añade un bucle de decisión: el modelo elige qué hacer, no solo qué responder. Aquí es donde entran las herramientas (RAG puede ser una más).

herramientas = {
    "buscar_documentos": lambda q: base_vectorial.buscar(embeddings.generar(q)),
    "consultar_calendario": lambda fecha: calendario.eventos(fecha),
}

mensajes = [{"rol": "usuario", "texto": "¿Puedo coger vacaciones la semana que viene?"}]

while True:
    respuesta = llm.generar(mensajes, herramientas_disponibles=herramientas.keys())

    if respuesta.tipo == "usar_herramienta":
        resultado = herramientas[respuesta.herramienta](respuesta.parametros)
        mensajes.append({"rol": "herramienta", "texto": resultado})
        continue  # el modelo vuelve a pensar con el nuevo dato

    if respuesta.tipo == "respuesta_final":
        print(respuesta.texto)
        break

En este ejemplo el agente puede encadenar dos herramientas por sí solo: primero mira la política de vacaciones (RAG), luego comprueba el calendario, y solo entonces responde. El humano no programó ese orden a mano — lo decide el modelo en cada paso.

Cómo interactúa todo con todo

usuario


┌─────────────────────────────────────────┐
│                  AGENTE                 │
│   (bucle: pensar → actuar → observar)    │
└───────┬───────────────────────┬─────────┘
        │                       │
        ▼                       ▼
   ┌─────────┐            ┌───────────┐
   │   RAG   │            │  OTRAS    │
   │ (busca  │            │HERRAMIENTAS│
   │ contexto)│            │(calendario,│
   └────┬────┘            │ MCP, etc.) │
        │                 └─────┬─────┘
        ▼                       ▼
   base vectorial         sistemas externos
        │                       │
        └───────────┬───────────┘

                    LLM
           (razona con todo el
            contexto reunido)

El LLM nunca deja de ser el mismo componente —predice texto—, pero lo que cambia es cuánto contexto de calidad le llega antes de responder. RAG es una forma de conseguir ese contexto; el bucle de agente es lo que decide, paso a paso, qué contexto hace falta y de dónde sacarlo.

Un error común al mezclarlas

Meter RAG dentro de cada paso del agente sin criterio dispara el coste: si el agente hace 5 llamadas al modelo para resolver una tarea, y cada una relanza una búsqueda vectorial completa, estás pagando cinco búsquedas cuando probablemente con una al principio bastaba. Merece la pena decidir explícitamente si el RAG es una herramienta más que el agente invoca cuando lo necesita, o si es un paso fijo antes de que el agente empiece a razonar.

Notas de campo

(Aquí es donde documento mis pruebas reales: qué tamaño de fragmento (chunk) me ha funcionado mejor, cuántas herramientas es razonable dejar sueltas antes de que el agente empiece a “dudar” entre ellas, coste medio por consulta…)

← volver al rack