"Quiero un ChatGPT, pero que responda basándose en los documentos internos de la empresa y los manuales internos". Esta es, sin duda, la necesidad primera que se me ocurre siempre.
El problema es que entrenar o afinar (Fine-tune) un modelo masivo como GPT-4 con nuestros PDFs corporativos cuesta decenas de miles de dólares y el conocimiento se queda obsoleto al día siguiente. La solución definitiva de la industria, la arquitectura que se ha coronado como el estándar absoluto para IA corporativa en producción, se llama RAG (Retrieval-Augmented Generation).
La revolución de la base de datos vectorial
La arquitectura RAG parte de una premisa humilde: el LLM es muy listo, pero sufre de amnesia. No sabe nada de tu empresa. Si le haces una pregunta, en lugar de enviársela directamente a la IA, primero hacemos una búsqueda en nuestra base de datos, extraemos los párrafos relevantes y se los inyectamos en el Prompt (el texto de contexto) para que lea la respuesta de ahí.
Aquí es donde entra la tecnología que está cambiando el panorama: las Bases de Datos Vectoriales (como Pinecone, Chroma o extensiones como pgvector).
No buscamos por coincidencia exacta de palabras como en un SQL clásico (LIKE '%vacaciones%'). Convertimos cada párrafo de nuestros documentos en un "Embedding": un vector matemático (una lista de miles de números flotantes) que representa el significado semántico del texto.
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 1. Cargamos el manual de la empresa
loader = PyPDFLoader("manual_empleado_2023.pdf")
paginas = loader.load_and_split()
# 2. Convertimos el texto a vectores matemáticos (Embeddings)
embeddings = OpenAIEmbeddings()
# 3. Guardamos los vectores en una base de datos vectorial local (Chroma)
base_datos_vectorial = Chroma.from_documents(paginas, embeddings)
# 4. Cuando el usuario pregunta, buscamos por similitud semántica (Coseno)
pregunta = "¿Cuántos días libres me corresponden si me caso?"
documentos_relevantes = base_datos_vectorial.similarity_search(pregunta, k=2)
# Ahora inyectaríamos estos documentos en el Prompt del LLM...
La base de datos vectorial compara matemáticamente la pregunta con los textos y devuelve los más cercanos en significado, aunque la pregunta use sinónimos que no existen en el manual.
Reflexión: El futuro de la búsqueda corporativa
Esto es un salto de gigante para la ingeniería de datos. Pasamos la última década obsesionados con imponer esquemas a los Data Lakes para estructurar el caos.
Ahora, con RAG y los Embeddings, no nos importa que el texto sea no estructurado. La búsqueda semántica encuentra la aguja en el pajar y el LLM te la presenta perfectamente redactada. Esta combinación elimina las alucinaciones de las IAs, ya que el modelo solo resume lo que la base de datos le entregra. La era de navegar por carpetas compartidas buscando un triste PDF para leerlo manualmente acaba de terminar para siempre.