Conectar una base de datos vectorial con un modelo de lenguaje es el paso que convierte tus documentos en un asistente que responde preguntas reales. Aquí verás cómo crear un retriever en Chroma, ensamblar una cadena con LangChain y obtener respuestas redactadas por un modelo de chat de OpenAI, ideal si trabajas con PDFs, CSVs o cualquier corpus interno.
Qué es un retriever y cómo se crea en Chroma
Un retriever es el componente que busca dentro de tu base vectorial los fragmentos más parecidos a la pregunta del usuario. Es la pieza que conecta tu vector store con la cadena que generará la respuesta.
En el código, defines una variable retriever_chroma y llamas al método as_retriever sobre tu vector store en Chroma. Ahí pasas argumentos de búsqueda, y el más relevante es K, que indica cuántos fragmentos parecidos al query quieres que regrese.
¿Qué hace el parámetro K en un retriever? Define el número de documentos similares que el retriever devuelve por consulta. Si pones K=2, recibirás los dos fragmentos más cercanos en el espacio vectorial a tu pregunta.
Cómo probar el retriever con get_relevant_documents
Una vez creado, puedes probarlo de inmediato con el método get_relevant_documents. Le pasas una pregunta como "What are the recent advances in public key cryptography?" y obtienes los fragmentos relacionados.
La pregunta va en inglés porque el modelo de embeddings usado, el instruct de Hugging Face, solo soporta ese idioma. El flujo interno es claro: tu pregunta se convierte en embedding con el mismo modelo que generó la base, y luego se compara contra todos los documentos para encontrar los más parecidos.
Cómo armar una cadena de QA con RetrievalQAWithSourcesChain
La cadena más usada en empresas para responder preguntas sobre documentos es RetrievalQAWithSourcesChain. La importas desde langchain.chains y te permite obtener no solo la respuesta, sino también la fuente de dónde proviene.
Crear la instancia es directo con el método from_chain_type. Necesitas tres ingredientes:
- Un modelo de lenguaje que redactará la respuesta final.
- El tipo de cadena, en este caso
stuff, que inserta los fragmentos directamente en el prompt.
- El retriever, que será tu
retriever_chroma creado antes.
La variante with sources es útil cuando necesitas trazabilidad: saber si la respuesta vino del PDF A, del documento B o del CSV C.
Por qué usar un modelo de chat en vez de un LLM clásico
Para el modelo de lenguaje, importas ChatOpenAI desde langchain.chat_models. Los modelos de chat están afinados para responder de forma conversacional, mientras que un LLM tradicional simplemente completa texto.
¿Cuál es la diferencia entre un modelo de chat y un LLM? Un modelo de chat usa un LLM por debajo, pero está optimizado para mantener conversaciones naturales. Por eso se siente más fluido al responder preguntas que un modelo completion puro.
La configuración del modelo incluye tu OpenAI API key, el nombre del modelo (gpt-3.5-turbo funciona bien, aunque puedes probar otros) y una temperature de 0 para que las respuestas sean estrictas y poco creativas, justo lo que quieres en un sistema de QA sobre documentos.
Cómo hacer preguntas a tus documentos en producción
Con la cadena lista, llamas a qa_chain_with_sources pasándole la pregunta directamente. Por ejemplo: "What is the relevance of public key cryptography?".
El flujo completo ocurre así:
- La cadena recibe el query.
- Busca en Chroma los dos documentos más cercanos en el espacio vectorial.
- Inyecta esos fragmentos al modelo de chat de OpenAI.
- El modelo redacta una respuesta basada en ese contexto.
El resultado es una respuesta natural, anclada en tu PDF original, con las fuentes incluidas. Si haces una segunda pregunta como "what is crypto?", el proceso se repite y obtienes otra respuesta tomada del mismo documento.
¿Para qué sirve el tipo de cadena "stuff" en LangChain? Toma todos los documentos recuperados y los inserta tal cual dentro del prompt enviado al modelo. Es la opción más simple y rápida cuando los fragmentos caben en la ventana de contexto.
Esto es lo interesante: una vez tienes este pipeline funcionando con un PDF, puedes escalarlo a dos, diez o miles de documentos sin cambiar la lógica. Es prácticamente lo que muchas empresas están llevando a producción hoy.
Reto para aplicar lo aprendido
Retoma la base de datos vectorial que creaste en un ejercicio anterior con Chroma, ya sea con PDFs, CSVs u otros formatos, y conviértela en un retriever. Luego elige un modelo de chat de OpenAI, como gpt-3.5-turbo o un DaVinci, y arma tu cadena.
A partir de ahí, empieza a preguntarle cosas a tus propios datos. ¿Qué tipo de preguntas le harías a tus documentos? Cuéntame en los comentarios qué corpus elegiste y qué resultados te dio.