Skip to content

AlexVitesse/RAG

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Papalote Museum RAG Assistant 🤖🎙️

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.

Python LangChain Streamlit Groq ChromaDB License


¿Qué hace este proyecto?

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.


Arquitectura

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.


Stack técnico

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

Características

  • 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_cache para 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

Instalación

# 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

Uso

# Paso 1: Generar la base vectorial (solo primera vez)
python vectorial.py

# Paso 2: Levantar la app
streamlit run app5.py

La aplicación estará disponible en http://localhost:8501.


Estructura del proyecto

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étricas del sistema

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

Por qué este stack

  • 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-v2 es 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

Autor

Eric Alejandro Vázquez Góngora Backend & AI Engineer · Campeche, México

LinkedIn GitHub


Licencia

MIT © 2025 Eric Vazquez

About

RAG híbrido + voz para asistente educativo en español

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages