Los embeddings son la pieza que conecta una pregunta en texto con la información relevante guardada en tu sistema. Si estás construyendo un chatbot con LangChain, entender cómo funcionan los índices, los embeddings y las bases de datos vectoriales te permite entregarle al modelo de lenguaje justo el fragmento que necesita para responder bien.
¿Qué hace un índice en un sistema con LLM?
Un índice tiene una misión clara: darle al modelo de lenguaje la información más adecuada para resolver una pregunta. La pregunta es cómo decidimos qué fragmento es el más adecuado, y ahí entran los embeddings [0:15].
Cuando llega una pregunta en texto, una función de embedding la convierte en números. No son números cualquiera, son vectores inteligentes que viven en un espacio vectorial con muchas dimensiones, por ejemplo 768.
En ese mismo espacio también colocamos los fragmentos de texto que ya tenemos guardados como documents. Todos quedan representados como vectores y eso permite compararlos.
¿Qué es un embedding? Es la representación numérica de un texto en forma de vector dentro de un espacio multidimensional. Sirve para que un modelo pueda comparar significados entre textos.
¿Cómo se encuentra la información relevante para una pregunta?
La magia ocurre con una función de similitud. Esta función compara el vector de la pregunta con los vectores de los fragmentos guardados y devuelve los más parecidos [1:05].
Los fragmentos que más se parecen al query son los que tienen más probabilidad de resolver lo que pidió el usuario. Esos son los que le pasamos al modelo de lenguaje como contexto.
En otras palabras, el índice no responde la pregunta: filtra el material para que el LLM responda con base en información útil.
¿Dónde se almacenan los embeddings?
Generar vectores no basta, hay que guardarlos en un lugar pensado para buscarlos rápido. Para eso existen las bases de datos vectoriales o vector stores [2:10].
Una vector store almacena los vectores y se encarga internamente de la función de similitud, así no tienes que implementarla a mano. Cuando entra un query, lo conviertes en embedding, consultas la base de datos y obtienes los fragmentos más cercanos.
Algunas integraciones disponibles en LangChain:
- Chroma, ideal para empezar localmente.
- Pinecone, orientada a producción en la nube.
- Faiss, la vector store creada por Meta.
- Weaviate, con capacidades adicionales de búsqueda.
Cada vez aparecen más opciones, así que conviene revisar la documentación antes de elegir.
¿Por qué LangChain usa una embedding class estándar?
Existen varios proveedores de modelos de embedding y cada uno tiene su propia API. Para evitar reescribir código cada vez que cambias de proveedor, LangChain ofrece la embedding class, una interfaz común con los mismos atributos y métodos [1:55].
Los dos métodos que vas a usar todo el tiempo son:
embed_documents, que recibe una lista de textos y devuelve sus vectores.
embed_query, que convierte un solo texto, normalmente la pregunta del usuario.
¿Cuál es la diferencia entre embed_documents y embed_query? embed_documents procesa varios textos a la vez, útil para indexar tu base de conocimiento. embed_query procesa solo uno, pensado para la pregunta entrante.
¿Qué proveedores de embeddings puedo usar?
Dentro de LangChain encuentras integraciones con varios servicios:
- Cohere, con modelos comerciales de embedding.
- Hugging Face, incluyendo Sentence Transformers e Instruct.
- OpenAI, con sus modelos de embedding propietarios.
Gracias a la interfaz estándar, cambiar de uno a otro es cuestión de ajustar la configuración, no de reescribir tu pipeline.
¿Cómo se conecta todo en un flujo real?
Imagina el recorrido completo cuando alguien pregunta algo a tu chatbot:
- El usuario envía un query en texto.
- La función de embedding lo convierte en vector.
- La vector store compara ese vector con los fragmentos guardados.
- Devuelve los textos más similares.
- El modelo de lenguaje recibe esos fragmentos y genera la respuesta.
¿Para qué sirve una base de datos vectorial? Para almacenar embeddings y recuperar rápidamente los más parecidos a una consulta, sin tener que programar la lógica de similitud desde cero.
Con esta base ya tienes lo necesario para construir tu propio índice usando embeddings y una vector store. ¿Cuál vas a probar primero, Chroma o Pinecone? Cuéntalo en los comentarios.