Modelo de Chat para Preguntas y Respuestas con LangChain y Chroma

Clase 26 de 37Curso de LangChain

Contenido del curso

Introducción a LangChain

Manejo de documentos con índices

Embeddings y bases de datos vectoriales

Chats y memoria con LangChain

Resumen

Construir un sistema de preguntas y respuestas que consulte documentación técnica en tiempo real es una de las aplicaciones más prácticas de los modelos de lenguaje. En este recorrido se configura un chatbot funcional que utiliza una base de datos vectorial en Chroma, un modelo de ChatOpenAI y un retriever para responder consultas sobre la documentación de HuggingFace, todo orquestado con LangChain.

¿Cómo se inicializa el modelo de chat con ChatOpenAI?

El primer paso consiste en importar e instanciar el modelo de lenguaje que generará las respuestas. Se importa ChatOpenAI desde langchain [0:16] y se crea una instancia llamada llm con tres hiperparámetros clave:

  • model_name: define qué modelo se utiliza, en este caso gpt-3.5-turbo [1:33].
  • temperature: controla la creatividad de las respuestas; un valor de 0.2 produce respuestas más sobrias y precisas [0:55].
  • max_tokens: establece la longitud máxima de cada respuesta; se fija en 1000 para permitir respuestas amplias sin escatimar [1:08].

Estos valores son hiperparámetros ajustables. Reducir max_tokens hace el sistema más económico, mientras que modificar la temperature altera el grado de variabilidad en las respuestas. La recomendación es experimentar progresivamente hasta encontrar el equilibrio entre calidad y costo.

¿Cómo se diseña la función de conversación con el usuario?

Para simular la experiencia de un chat se crea la función run_conversation, que recibe tres argumentos: la vector store (ChromaDB), el tipo de chat y el modelo de lenguaje [1:50].

El parámetro chat_type define el modo de interacción. Al asignarle el valor "QA" se indica que el chatbot opera en modo de preguntas y respuestas sin memoria [2:22], es decir, cada consulta se procesa de forma independiente sin considerar el historial previo.

¿Por qué convertir la vector store en un retriever?

Antes de responder cualquier pregunta, la vector store debe transformarse en un retriever mediante el método as_retriever [3:20]. Este componente se encarga de buscar los fragmentos de texto más similares a la consulta del usuario.

El parámetro search_kwargs controla la búsqueda. Se configura k=3, lo que significa que el retriever devuelve los tres fragmentos más relevantes [3:42]. Este valor también es un hiperparámetro:

  • Con k=1 la información puede ser insuficiente.
  • Con valores altos aumenta la precisión pero también el consumo de tokens en el prompt [4:08].

¿Cómo funciona el loop de interacción?

La experiencia de chat se implementa con un bucle infinito (while True) [4:18] que sigue este flujo:

  • Se imprime un indicador visual para que el usuario sepa que es su turno.
  • Se captura la entrada con la función get_query_from_user, ubicada en los utils del proyecto [4:42].
  • Si el usuario escribe "salir" (convertido a minúsculas), el bucle se rompe y la conversación termina [5:00].
  • Cuando el chat_type es "QA", la consulta se procesa mediante process_qa_query, función que recibe el query, el retriever y el modelo llm [5:15].
  • La respuesta generada se muestra en consola con formato visual diferenciado por colores.

Esta arquitectura es extensible: se pueden agregar nuevos modos de chat, como uno con memoria, simplemente añadiendo una condición elif dentro del mismo bucle [5:40].

¿Qué componentes se necesitan para resolver una pregunta?

El flujo completo de respuesta requiere cuatro elementos trabajando en conjunto:

  • Query: la pregunta que ingresa el usuario.
  • Retriever: busca los fragmentos relevantes en la base de datos vectorial.
  • LLM: genera la respuesta procesando los fragmentos recuperados.
  • Vector store: almacena los embeddings de toda la documentación.

Cada consulta pasa por el retriever, que extrae contexto de ChromaDB, y luego el modelo de lenguaje construye una respuesta fundamentada exclusivamente en esa información. Este patrón se conoce como RAG (Retrieval-Augmented Generation) y garantiza que las respuestas estén ancladas a los datos reales de la documentación.

¿Has probado ajustar el valor de k en el retriever o la temperature del modelo para ver cómo cambian las respuestas? Comparte tu experiencia y los resultados que obtuviste.