Este proyecto implementa un chatbot avanzado utilizando la técnica de Retrieval Augmented Generation (RAG). Permite realizar preguntas en lenguaje natural sobre un corpus de documentos distribuidos en múltiples colecciones de ChromaDB, obteniendo respuestas generadas por el modelo Gemini de Google AI, fundamentadas en la información recuperada.
- Retrieval Augmented Generation (RAG): Combina la potencia de los modelos de lenguaje grandes (LLMs) con la recuperación de información específica de bases de datos vectoriales.
- Multi-Colección: Capaz de consultar simultáneamente múltiples colecciones de documentos almacenadas en ChromaDB. Incluye una configuración especial para una colección "biblia" en una instancia/directorio de ChromaDB separada.
- Retriever Paralelo Personalizado: Utiliza un
ParallelEnsembleRetriever
para ejecutar búsquedas en las diferentes colecciones de ChromaDB de forma concurrente, optimizando el tiempo de recuperación. - Modelo LLM Gemini: Integra el modelo
gemini-2.5-flash-lite-preview-06-17
(configurable) de Google AI para la generación de respuestas. - Embeddings Locales: Emplea
jinaai/jina-embeddings-v2-base-es
(configurable) para generar embeddings de las consultas, ejecutándose localmente (CPU/GPU). - Interfaz de Usuario con Gradio: Proporciona una interfaz web interactiva y amigable construida con Gradio para facilitar la interacción con el chatbot.
- Logging Detallado: Registra interacciones del chat, llamadas al LLM (con prompts, respuestas, tokens, duración, documentos recuperados) y feedback del usuario en una base de datos SQLite (
rag_monitoring.db
) para monitoreo y análisis. - Mecanismo de Feedback: Permite a los usuarios valorar las respuestas (útil/no útil) y dejar comentarios, que se almacenan para futuras mejoras.
- Configurable: Parámetros clave como modelos, rutas de ChromaDB, y comportamiento de búsqueda son fácilmente ajustables a través de
config_ui.py
.
- Entrada del Usuario: El usuario introduce una pregunta a través de la interfaz de Gradio.
- Generación de Embedding de Consulta: La pregunta del usuario se transforma en un vector (embedding) utilizando el modelo de embeddings local (
jinaai/jina-embeddings-v2-base-es
). - Recuperación Paralela:
- El
ParallelEnsembleRetriever
(definido encustom_retriever.py
) toma el embedding de la consulta. - Lanza búsquedas de similitud en paralelo a través de todas las colecciones de ChromaDB configuradas en
config_ui.py
. - Cada sub-retriever (uno por colección) devuelve los
k
documentos más relevantes (SEARCH_K_PER_COLLECTION
).
- El
- Agregación de Contexto: Los documentos recuperados de todas las colecciones se combinan para formar el contexto.
- Formateo del Prompt: La pregunta original y el contexto recuperado se insertan en una plantilla de prompt (definida en
prompt_template.txt
). - Generación de Respuesta por LLM: El prompt formateado se envía al modelo Gemini (
ChatGoogleGenerativeAI
). - Respuesta al Usuario: La respuesta generada por Gemini, junto con las fuentes de los documentos recuperados, se muestra en la interfaz de Gradio.
- Logging:
- La interacción del usuario y la respuesta del asistente se registran en la tabla
chat_interactions
. - Los detalles de la llamada al LLM (incluyendo el prompt, la respuesta cruda, los documentos recuperados, tokens, duración) se registran en
llm_calls
medianteSQLiteLoggingCallbackHandler
. - Cualquier feedback del usuario (like/dislike, comentarios) se registra en
user_feedback
.
- La interacción del usuario y la respuesta del asistente se registran en la tabla
- Python 3.9+
- LangChain: Framework para construir aplicaciones con LLMs.
langchain_community.vectorstores.Chroma
langchain.chains.RetrievalQA
langchain_google_genai.ChatGoogleGenerativeAI
langchain_huggingface.HuggingFaceEmbeddings
langchain_core.callbacks
- Google Generative AI SDK: Para interactuar con los modelos Gemini.
- ChromaDB: Base de datos vectorial para almacenar y buscar embeddings de documentos.
- Hugging Face Transformers & Sentence Transformers: Para el modelo de embeddings local.
- Gradio: Para crear la interfaz de usuario web.
- SQLite3: Para el logging de datos.
- Dotenv: Para la gestión de variables de entorno (API Keys).
- Torch: Para inferencia de embeddings (con soporte CUDA opcional).
- Python 3.9 o superior.
pip
para instalar paquetes.- Git para clonar el repositorio.
- Una clave API de Google AI válida (para Gemini).
- (Opcional pero recomendado) Una GPU NVIDIA con CUDA configurado si deseas acelerar la generación de embeddings.
-
Clonar el Repositorio:
git clone <[URL_DEL_REPOSITORIO](https://github.com/elimorals/Agente_AI_JW.git)> cd <Agente_AI_JW>
-
Crear un Entorno Virtual (Recomendado):
python -m venv venv source venv/bin/activate # En Linux/macOS # venv\Scripts\activate # En Windows
-
Instalar Dependencias: Crea un archivo
requirements.txt
con las siguientes dependencias (o las que detectes necesarias de los imports):langchain langchain-community langchain-google-genai langchain-huggingface chromadb sentence-transformers torch --index-url https://download.pytorch.org/whl/cu118 # o cpuonly si no tienes GPU gradio python-dotenv # Añade otras si son necesarias, ej: transformers
Luego instala:
pip install -r requirements.txt
Nota sobre Torch: Ajusta el comando de instalación de
torch
según tu sistema (CPU, o versión específica de CUDA). Visita pytorch.org para obtener el comando correcto. -
Configurar ChromaDB:
- Este pipeline espera que las bases de datos ChromaDB ya existan y estén pobladas con los embeddings de tus documentos.
- Asegúrate de que los directorios especificados en
config_ui.py
existan y contengan las bases de datos ChromaDB:CHROMA_PERSIST_DIR = "chroma_db_por_documento"
(para colecciones generales)BIBLIA_CHROMA_PERSIST_DIR = "biblia"
(para la colección 'biblia')
- Las colecciones listadas en
TARGET_COLLECTION_NAMES
deben existir dentro de estos directorios.
-
Configurar la Clave API de Google:
- Crea un archivo
.env
en la raíz del proyecto. - Añade tu clave API de Google:
GOOGLE_API_KEY="TU_API_KEY_DE_GOOGLE_AI"
- El script
UI.py
cargará esta variable de entorno.
- Crea un archivo
-
Plantilla de Prompt:
- Asegúrate de que el archivo
prompt_template.txt
exista en la raíz del proyecto y contenga la plantilla de prompt deseada. Debe incluir las variables{context}
y{question}
. Ejemplo:Eres un asistente útil que responde preguntas basándose únicamente en el siguiente contexto. Si la respuesta no se encuentra en el contexto, di "No tengo suficiente información para responder a esa pregunta según los documentos proporcionados.". No inventes información. Cita las fuentes si es posible. Contexto: {context} Pregunta: {question} Respuesta:
- Asegúrate de que el archivo
Una vez completada la instalación y configuración:
python UI.py