Skip to content

Repository files navigation

🤖 Chatbot GenAI - Caso de Estudio Recursos Humanos

Este proyecto demuestra cómo construir, evaluar y automatizar un chatbot de tipo RAG (Retrieval Augmented Generation) con buenas prácticas de GenAIOps.


🧠 Caso de Estudio

El chatbot responde preguntas sobre beneficios, políticas internas y roles de una empresa ficticia (Contoso Electronics), usando como base una colección de documentos PDF internos.


📂 Estructura del Proyecto

├── app/
│   ├── ui_streamlit.py           ← interfaz simple del chatbot
│   ├── main_interface.py         ← interfaz combinada con métricas
│   ├── run_eval.py               ← evaluación automática
│   ├── rag_pipeline.py           ← lógica de ingestión y RAG
│   └── prompts/
│       ├── v1_asistente_rrhh.txt
│       └── v2_resumido_directo.txt
├── data/pdfs/                    ← documentos fuente
├── tests/
│   ├── test_run_eval.py
│   ├── eval_dataset.json         ← dataset de evaluación
│   └── eval_dataset.csv
├── .env.example
├── Dockerfile
├── .devcontainer/
│   └── devcontainer.json
├── .github/workflows/
│   ├── eval.yml
│   └── test.yml

🚦 Ciclo de vida GenAIOps aplicado

1. 🧱 Preparación del entorno

git clone https://github.com/darkanita/GenAIOps_Pycon2025 chatbot-genaiops
cd chatbot-genaiops
conda create -n chatbot-genaiops python=3.10 -y
conda activate chatbot-genaiops
pip install -r requirements.txt
cp .env.example .env  # Agrega tu API KEY de OpenAI

2. 🔍 Ingesta y vectorización de documentos

Procesa los PDFs y genera el índice vectorial:

python -c "from app.rag_pipeline import save_vectorstore; save_vectorstore()"

Esto:

  • Divide los documentos en chunks (por defecto chunk_size=512, chunk_overlap=50)
  • Genera embeddings con OpenAI
  • Guarda el índice vectorial en vectorstore/
  • Registra los parámetros en MLflow

🔧 Para personalizar:

save_vectorstore(chunk_size=1024, chunk_overlap=100)

♻️ Para reutilizarlo directamente:

vectordb = load_vectorstore_from_disk()

3. 🧠 Construcción del pipeline RAG

from app.rag_pipeline import build_chain
chain = build_chain(vectordb, prompt_version="v1_asistente_rrhh")
  • Soporta múltiples versiones de prompt
  • Usa ConversationalRetrievalChain con LangChain + OpenAI

4. 💬 Interacción vía Streamlit

Versión básica:

streamlit run app/ui_streamlit.py

Versión combinada con métricas:

streamlit run app/main_interface.py

5. 🧪 Evaluación automática de calidad

Ejecuta:

python app/run_eval.py

Esto:

  • Usa tests/eval_dataset.json como ground truth
  • Genera respuestas usando el RAG actual
  • Evalúa con LangChain Eval (QAEvalChain)
  • Registra resultados en MLflow

6. 📈 Visualización de resultados

Dashboard completo:

streamlit run app/dashboard.py
  • Tabla con todas las preguntas evaluadas
  • Gráficos de precisión por configuración (prompt + chunk_size)
  • Filtrado por experimento MLflow

7. 🔁 Automatización con GitHub Actions

  • CI de evaluación: .github/workflows/eval.yml
  • Test unitarios: .github/workflows/test.yml

8. 🧪 Validación automatizada

pytest tests/test_run_eval.py
  • Evalúa que el sistema tenga al menos 80% de precisión con el dataset base

🔍 ¿Qué puedes hacer?

  • 💬 Hacer preguntas al chatbot
  • 🔁 Evaluar diferentes estrategias de chunking y prompts
  • 📊 Comparar desempeño con métricas semánticas
  • 🧪 Trazar todo en MLflow
  • 🔄 Adaptar a otros dominios (legal, salud, educación…)

⚙️ Stack Tecnológico

  • OpenAI + LangChain – LLM + RAG
  • FAISS – Vectorstore
  • Streamlit – UI
  • MLflow – Registro de experimentos
  • LangChain Eval – Evaluación semántica
  • GitHub Actions – CI/CD
  • DevContainer – Desarrollo portable

🎓 Desafío para estudiantes

🧩 Parte 1: Personalización

  1. Elige un nuevo dominio Ejemplos: salud, educación, legal, bancario, etc.

  2. Reemplaza los documentos PDF Ubícalos en data/pdfs/.

  3. Modifica o crea tus prompts Edita los archivos en app/prompts/.

  4. Crea un conjunto de pruebas En tests/eval_dataset.json, define preguntas y respuestas esperadas para evaluar a tu chatbot.

✅ Parte 2: Evaluación Automática

  1. Ejecuta run_eval.py para probar tu sistema actual. Actualmente, la evaluación está basada en QAEvalChain de LangChain, que devuelve una métrica binaria: correcto / incorrecto.

🔧 Parte 3: ¡Tu reto! (👨‍🔬 nivel investigador)

  1. Mejora el sistema de evaluación:

    • Agrega evaluación con LabeledCriteriaEvalChain usando al menos los siguientes criterios:

      • "correctness" – ¿Es correcta la respuesta?
      • "relevance" – ¿Es relevante respecto a la pregunta?
      • "coherence" – ¿Está bien estructurada la respuesta?
      • "toxicity" – ¿Contiene lenguaje ofensivo o riesgoso?
      • "harmfulness" – ¿Podría causar daño la información?
    • Cada criterio debe registrar:

      • Una métrica en MLflow (score)
    • Y opcionalmente, un razonamiento como artefacto (reasoning)

    📚 Revisa la documentación de LabeledCriteriaEvalChain para implementarlo.

📊 Parte 4: Mejora el dashboard

  1. Extiende dashboard.py o main_interface.py para visualizar:

    • Las métricas por criterio (correctness_score, toxicity_score, etc.).
    • Una opción para seleccionar y comparar diferentes criterios en gráficos.
    • (Opcional) Razonamientos del modelo como texto.

🧪 Parte 5: Presenta y reflexiona

  1. Compara configuraciones distintas (chunk size, prompt) y justifica tu selección.
    • ¿Cuál configuración genera mejores respuestas?
    • ¿En qué fallan los modelos? ¿Fueron tóxicos o incoherentes?
    • Usa evidencias desde MLflow y capturas del dashboard.

🚀 Bonus

  • ¿Te animas a crear un nuevo criterio como "claridad" o "creatividad"? Puedes definirlo tú mismo y usarlo con LabeledCriteriaEvalChain.

¡Listo para ser usado en clase, investigación o producción educativa! 🚀

About

Chatbot interno que responde preguntas sobre documentación usando un modelo generativo (LLM) alojado y RAG con LlamaIndex. Implementa principios básicos de GenAIOps como recuperación contextual, logging y orquestación de prompts.

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages