Asistente conversacional con voz para el Museo Papalote, construido sobre una arquitectura RAG híbrida (semántica + BM25) con respuestas de audio en español mexicano.
Un visitante del Museo Papalote puede hacer preguntas en texto o voz sobre ciencia, exhibiciones y actividades. El sistema recupera contexto de una base vectorial propia del museo, genera una respuesta con Llama 3 y la reproduce en audio con la voz de Dalia (español mexicano) — todo en una interfaz Streamlit.
Caso de uso real: Asistente educativo para niños en entorno de manufactura/exposición, orientado a explicar conceptos científicos de forma accesible.
Usuario (texto / voz)
│
▼
┌─────────────────┐
│ Streamlit UI │ ← speech_to_text (micrófono)
│ + TTS Dalia │ ← edge_tts (es-MX-DaliaNeural)
└────────┬────────┘
│
▼
┌─────────────────────────────────────────┐
│ RAG System │
│ │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ ChromaDB │ │ BM25Retriever │ │
│ │ (semántico) │ │ (léxico) │ │
│ └──────┬──────┘ └───────┬─────────┘ │
│ │ │ │
│ └──── Ensemble ────┘ │
│ weights: [0.4, 0.6] │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Llama 3-8B │ │
│ │ via Groq API │ │
│ └─────────────────┘ │
└─────────────────────────────────────────┘
│
▼
Respuesta + Audio (MP3 streaming)
Decisión de diseño clave: El EnsembleRetriever combina búsqueda semántica (ChromaDB + FastEmbed) con búsqueda léxica (BM25) con ponderación 40/60. Esto mejora el recall en preguntas con términos específicos del dominio (nombres de exhibiciones, conceptos técnicos) donde la búsqueda vectorial sola tiende a fallar.
| Capa | Tecnología |
|---|---|
| LLM | Llama 3-8B via Groq API |
| Embeddings | FastEmbed all-MiniLM-L6-v2 (local, sin costo) |
| Vector DB | ChromaDB (persistido en disco) |
| Retrieval | EnsembleRetriever (BM25 + Semántico) |
| Framework RAG | LangChain 0.2 |
| Interfaz | Streamlit + streamlit-mic-recorder |
| TTS | edge-tts es-MX-DaliaNeural |
| Token control | tiktoken (cl100k_base) |
| Cacheo | lru_cache en vectorstore y sistema RAG |
- Entrada multimodal — texto escrito o voz en tiempo real (micrófono)
- Recuperación híbrida — combina similitud semántica y coincidencia léxica para mayor precisión
- TTS en español mexicano — respuestas en audio con voz natural (Dalia, edge-tts)
- Control de costos — medición de tokens por consulta con cálculo de costo estimado en Groq
- Cacheo inteligente — vectorstore y sistema RAG cacheados con
lru_cachepara evitar recargas - Historial persistente — conversación acumulada en sesión con reproducción de audio histórico
- Prompt educativo — respuestas calibradas para audiencia infantil con analogías y emojis
# Clonar el repositorio
git clone https://github.com/AlexVitesse/RAG.git
cd RAG
# Crear entorno virtual
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Instalar dependencias
pip install langchain langchain-community chromadb streamlit \
streamlit-mic-recorder edge-tts fastembed tiktoken \
rank-bm25
# Configurar variables de entorno
export GROQ_API_KEY=your_groq_api_key_here# Paso 1: Generar la base vectorial (solo primera vez)
python vectorial.py
# Paso 2: Levantar la app
streamlit run app5.pyLa aplicación estará disponible en http://localhost:8501.
RAG/
├── rag.py # Core RAGSystem: retriever híbrido, LLM, QA chain
├── app5.py # Interfaz Streamlit con voz, TTS y chat history
├── vectorial.py # Ingesta de documentos y generación de ChromaDB
├── chroma_db_dir/ # Base vectorial persistida (generada localmente)
└── README.md
| Métrica | Valor |
|---|---|
| Tiempo de respuesta LLM (Groq) | ~1.2s promedio |
| Tiempo de generación TTS | ~0.8s promedio |
| Documentos recuperados por consulta | 10 (vector) + 10 (BM25) → reranked |
| Longitud máxima de contexto | 8,192 tokens (Llama 3-8B) |
| Costo estimado por consulta | < $0.001 USD |
- Groq + Llama 3-8B — latencia ultra-baja (~200ms TTFT) vs OpenAI, crítico para experiencia conversacional
- FastEmbed local — embeddings sin costo y sin latencia de red;
all-MiniLM-L6-v2es suficiente para corpus en español de dominio cerrado - BM25 con peso 0.6 — el corpus del Papalote tiene terminología muy específica (nombres de salas, exhibiciones) donde BM25 supera a la búsqueda vectorial pura
- edge-tts — TTS de calidad comercial sin costo, con voces en español mexicano nativas
Eric Alejandro Vázquez Góngora Backend & AI Engineer · Campeche, México
MIT © 2025 Eric Vazquez