Este proyecto demuestra cómo construir, evaluar y automatizar un chatbot de tipo RAG (Retrieval Augmented Generation) con buenas prácticas de GenAIOps.
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.
├── 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
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 OpenAIProcesa 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()from app.rag_pipeline import build_chain
chain = build_chain(vectordb, prompt_version="v1_asistente_rrhh")- Soporta múltiples versiones de prompt
- Usa
ConversationalRetrievalChainconLangChain+OpenAI
Versión básica:
streamlit run app/ui_streamlit.pyVersión combinada con métricas:
streamlit run app/main_interface.pyEjecuta:
python app/run_eval.pyEsto:
- Usa
tests/eval_dataset.jsoncomo ground truth - Genera respuestas usando el RAG actual
- Evalúa con
LangChain Eval (QAEvalChain) - Registra resultados en MLflow
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
- CI de evaluación:
.github/workflows/eval.yml - Test unitarios:
.github/workflows/test.yml
pytest tests/test_run_eval.py- Evalúa que el sistema tenga al menos 80% de precisión con el dataset base
- 💬 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…)
- 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
🧩 Parte 1: Personalización
-
Elige un nuevo dominio Ejemplos: salud, educación, legal, bancario, etc.
-
Reemplaza los documentos PDF Ubícalos en data/pdfs/.
-
Modifica o crea tus prompts Edita los archivos en app/prompts/.
-
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
- 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)
-
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
-
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
- 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! 🚀