Crear una cadena RetrievalQA en LangChain te permite conectar un modelo de lenguaje con tu base de datos vectorial para responder preguntas sobre documentos propios. Aquí verás cómo construir la función process_qa_query, qué hace cada argumento y cómo encaja en un flujo completo con embeddings, Chroma y GPT-3.5-turbo. Útil si estás armando un chatbot sobre documentación técnica.
Cómo defines la función process_qa_query paso a paso
La función recibe tres entradas mínimas y devuelve una respuesta generada por el modelo a partir de tu base vectorial.
Dentro de process_qa_query recibes un query (el texto de la pregunta), un retriever y un modelo de lenguaje. Con esos tres ingredientes construyes una instancia de RetrievalQA, que importas así: from langchain.chains import RetrievalQA.
La cadena se crea con el método from_chain_type y necesita estos argumentos:
- llm: el modelo de chat que recibes como parámetro, por ejemplo GPT-3.5-turbo.
- chain_type: usa
"stuff" cuando quieres que solo entre al prompt lo que quepa directamente, sin resúmenes intermedios.
- retriever: el retriever que recibes, encargado de buscar los fragmentos más parecidos a la pregunta.
Antes de ejecutar la cadena, imprime en consola un mensaje tipo la inteligencia artificial está pensando para que la persona usuaria sepa que el proceso está corriendo, sobre todo si tarda unos segundos. Finalmente ejecutas la cadena con qa_chain.run(query).
¿Qué hace chain_type="stuff" en RetrievalQA? Mete todos los fragmentos recuperados directamente en el prompt del modelo, sin resumirlos. Funciona bien cuando los fragmentos caben en la ventana de contexto.
Por qué aparece el error de max_tokens
Un detalle fácil de pasar por alto: el parámetro correcto es max_tokens, no max_token. Si lo escribes en singular, el modelo no lo reconoce y la ejecución falla. Cambia max_token por max_tokens, vuelve a correr y la chroma existente carga sin problema.
Para mantener el código ordenado puedes apoyarte en dos herramientas:
- Black: formatea el código Python con un estilo consistente.
- isort: ordena los imports automáticamente.
Qué pasa cuando le preguntas al chatbot sobre Transformers
Una vez corriendo, el flujo se siente natural. Le preguntas qué son los Transformers y el modelo procesa la pregunta, busca las respuestas más probables dentro de la base vectorial y devuelve algo como: son una biblioteca de modelos preentrenados y más. Si después preguntas qué es Accelerate y cómo puedo usarlo, recibes la definición y un ejemplo de código en Python listo para usar la librería de Hugging Face.
Hay un punto importante: este chat no tiene memoria. Cada pregunta empieza desde cero, así que no puedes referirte a lo que dijiste antes. Si quieres continuidad, necesitas agregar un componente de memoria, que es justo lo que viene en las siguientes clases.
¿RetrievalQA tiene memoria de conversación? No por defecto. RetrievalQA responde cada pregunta de forma independiente. Para recordar el historial necesitas usar cadenas con memoria como ConversationalRetrievalChain.
Cómo encaja todo el pipeline desde los JSON hasta la respuesta
El chatbot final es la última pieza de un pipeline más largo. Así se conectan las partes:
- La documentación de Hugging Face vive en archivos JSON, uno por cada pieza de contenido.
- Importas esos JSON como documents de LangChain, uno por archivo.
- Partes cada document en fragmentos más pequeños con un splitter, generando nuevos documents.
- Conviertes esos fragmentos en vectores numéricos con los embeddings de OpenAI.
- Guardas los vectores en una base de datos vectorial Chroma.
- Transformas la base en un retriever, que devuelve los fragmentos más parecidos a un texto de entrada.
- Combinas retriever, modelo y query en una cadena
RetrievalQA que entrega la respuesta.
Con ese flujo ya tienes un producto funcional: una interfaz donde cualquier persona puede hacer preguntas sobre toda la documentación de Hugging Face y recibir respuestas fundamentadas en los fragmentos recuperados.
Qué conceptos clave te llevas de esta implementación
- RetrievalQA: cadena de LangChain que combina recuperación vectorial con generación de respuestas.
- chain_type stuff: estrategia que inserta los fragmentos completos en el prompt.
- Retriever: componente que devuelve los fragmentos más relevantes para una consulta.
- Embeddings: representaciones numéricas del texto que permiten medir similitud semántica.
- Chroma: base de datos vectorial donde guardas y consultas esos embeddings.
- Splitter: utilidad que parte documentos largos en fragmentos manejables.
¿Qué tipo de memoria le agregarías tú a este chatbot para que recuerde el contexto de la conversación? Cuéntame en los comentarios cómo lo estás implementando en tu propio proyecto.