ESPECIALIZACIÓN

Módulo 14: RAG y bases de datos vectoriales

ACTUALIZADO Q3 2026

RAG y bases de datos vectoriales

RAG (Retrieval-Augmented Generation) es la técnica que hace que tu IA responda con datos reales de tu empresa en vez de inventar. Buscas documentos relevantes, se los pasas como contexto, y el modelo genera respuestas basadas en información real.

Punto clave

Sin RAG, el modelo alucina. Con RAG, el modelo cita fuentes. La diferencia entre un chatbot inútil y un asistente que tu equipo realmente usa.

Embeddings

Un embedding convierte texto en un vector numérico que captura su significado. Textos similares tienen vectores cercanos:

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(["política de vacaciones", "días libres al año"])
# Vectores cercanos en el espacio → significado similar

Qdrant: base de datos vectorial

# Levantar Qdrant
docker run -p 6333:6333 qdrant/qdrant

# Crear colección e insertar
from qdrant_client import QdrantClient
client = QdrantClient(host="localhost", port=6333)
client.create_collection("docs", vectors_config=VectorParams(size=384, distance=Distance.COSINE))

# Buscar por significado
results = client.search("docs", query_vector=query_embedding, limit=3)

Chunking

Documentos grandes se dividen en trozos. Tres estrategias:

  • Tamaño fijo: cada 500 tokens (simple, puede cortar ideas)
  • Por párrafos: respeta estructura (mejor calidad)
  • Con overlap: 10-20% solapamiento entre chunks (no pierde contexto en bordes)

Pipeline RAG completo

def rag_query(pregunta, top_k=3):
    # 1. Buscar documentos relevantes
    query_vector = embedder.encode(pregunta).tolist()
    resultados = qdrant.search("docs", query_vector=query_vector, limit=top_k)
    # 2. Construir contexto
    contexto = "\n".join([r.payload["texto"] for r in resultados])
    # 3. Generar respuesta con contexto real
    response = llm.messages.create(
        model="claude-sonnet-4-20250514", max_tokens=1024,
        system="Responde SOLO con info de los documentos. Si no la encuentras, dilo.",
        messages=[{"role": "user", "content": f"Docs:\n{contexto}\n\nPregunta: {pregunta}"}])
    return response.content[0].text

El system prompt es crítico: "responde SOLO con los documentos". Sin esto, el modelo inventa respuestas plausibles pero falsas.

Pon a prueba tus conocimientos

Quiz: embeddings, Qdrant, chunking, pipeline RAG.

Hacer quiz