educational_rag
Descripción General
Sistema RAG (Retrieval-Augmented Generation) educativo para aprender sobre Máquinas de Boltzmann Restringidas usando papers científicos y Groq AI. Combina búsqueda semántica con generación de respuestas.
Clases Principales
EducationalRAG
Métodos de Inicialización
_init_groq
Inicializa el cliente de Groq AI.
- Configuración:
Busca API key en
st.secrets['GROQ_API_KEY']O en variable de entorno
GROQ_API_KEYModelo: Llama 3.3 70B Versatile
Configurar API key:
En .streamlit/secrets.toml:
GROQ_API_KEY = "gsk_..."
_init_chromadb
Inicializa ChromaDB para almacenamiento vectorial.
- Configuración:
Directorio:
chroma_rbm_db/Colección:
rbm_papersModo: Persistente
Métodos de Gestión de Papers
get_available_papers
Obtiene lista de papers PDF disponibles.
- Returns:
Lista de nombres de archivos PDF
Ejemplo:
papers = rag.get_available_papers()
print(f"Papers disponibles: {len(papers)}")
for paper in papers:
print(f" - {paper}")
get_paper_references
Carga referencias bibliográficas desde JSON.
- Returns:
Diccionario con referencias completas
Estructura de referencias:
{
"Hinton_2010_Practical_Guide.pdf": {
"title": "A Practical Guide to Training RBMs",
"authors": "Geoffrey E. Hinton",
"year": 2010,
"publication": "Technical Report UTML TR 2010-003",
"citation": "Hinton, G. E. (2010). A Practical Guide..."
}
}
load_papers_to_db
Carga papers a ChromaDB si no están cargados.
- Returns:
True si exitoso
Proceso:
Verificar si ya hay documentos en la colección
Si no hay PDFs, crear base de conocimiento básica
Indexar documentos con embeddings
_create_basic_knowledge
Crea base de conocimiento básica sobre RBMs.
Temas cubiertos:
Introducción: Qué es una RBM
Arquitectura: Estructura bipartita
Contrastive Divergence: Algoritmo de entrenamiento
Función de energía: Definición matemática
Aplicaciones: Usos prácticos
Comparación: RBM vs redes neuronales
Proceso de entrenamiento: Pasos detallados
Limitaciones: Desventajas conocidas
Deep Belief Networks: Apilamiento de RBMs
PCD: Persistent Contrastive Divergence
Métodos de Búsqueda
query_papers
Busca información relevante en los papers usando similitud coseno.
- Parameters:
question(str): Pregunta del usuarion_results(int): Número de fragmentos a retornar (default: 3)
- Returns:
Lista de diccionarios con fragmentos relevantes
- Métrica de similitud:
Similitud Coseno: Mide ángulo entre vectores de embeddings
Rango: [0, 1] donde 1 = idéntico
Ejemplo:
# Buscar información
question = "¿Cómo funciona Contrastive Divergence?"
context = rag.query_papers(question, n_results=3)
# Ver resultados
for i, doc in enumerate(context):
print(f"\nFragmento {i+1}:")
print(f" Similitud: {doc['similarity']:.2%}")
print(f" Fuente: {doc['metadata']['source']}")
print(f" Autor: {doc['metadata']['author']}")
print(f" Contenido: {doc['content'][:200]}...")
Métodos de Generación
generate_response
Genera respuesta usando Groq AI basada en el contexto recuperado.
- Parameters:
question(str): Pregunta del usuariocontext(List[Dict]): Fragmentos relevantes de papers
- Returns:
Respuesta generada en lenguaje natural
- Configuración del LLM:
Modelo: Llama 3.3 70B Versatile
Temperature: 0.7 (balance creatividad/precisión)
Max tokens: 2000
Ejemplo:
# Buscar contexto
context = rag.query_papers("¿Qué es la función de energía en RBMs?", n_results=3)
# Generar respuesta
response = rag.generate_response(
question="¿Qué es la función de energía en RBMs?",
context=context
)
print(response)
_get_reference_mapping
Obtiene mapeo de referencias bibliográficas.
- Returns:
Diccionario con información de citación
Papers incluidos:
Hinton (2010): Practical Guide to Training RBMs
Hinton (2002): Contrastive Divergence
Hinton & Salakhutdinov (2006): Reducing Dimensionality
Salakhutdinov et al. (2007): Collaborative Filtering
Bengio (2013): Deep Learning of Representations
Tieleman (2008): Persistent Contrastive Divergence
Funciones de Renderizado
render_educational_rag_module
Renderiza la interfaz completa del sistema RAG en Streamlit.
Funcionalidades:
Gestión de papers:
Ver lista de papers disponibles
Descargar papers desde URL
Editar referencias bibliográficas
Eliminar papers
Interfaz de chat:
Preguntas sugeridas (Básico/Intermedio/Avanzado)
Campo de texto para preguntas personalizadas
Búsqueda con similitud coseno
Visualización de fragmentos relevantes
Respuestas generadas con IA
Historial:
Últimas 5 conversaciones
Preguntas y respuestas guardadas
Preguntas Sugeridas
Nivel Básico
¿Qué es una Máquina de Boltzmann Restringida?
¿Cuál es la diferencia entre RBM y una red neuronal tradicional?
¿Para qué se usan las RBMs?
Nivel Intermedio
¿Cómo funciona el algoritmo Contrastive Divergence?
¿Qué son las unidades visibles y ocultas en una RBM?
¿Cómo se entrenan las RBMs?
Nivel Avanzado
¿Cuáles son las limitaciones de las RBMs?
¿Cómo se apilan RBMs para crear Deep Belief Networks?
¿Qué es Persistent Contrastive Divergence?
Ejemplo Completo de Uso
from src.educational_rag import EducationalRAG
# Inicializar sistema
rag = EducationalRAG()
# Verificar configuración
if not rag.groq_client:
print("❌ Configura GROQ_API_KEY")
exit()
# Cargar papers
success = rag.load_papers_to_db()
if success:
print(f"✅ Base de conocimiento lista")
print(f" Documentos: {rag.collection.count()}")
# Lista de preguntas
questions = [
"¿Qué es una RBM?",
"¿Cómo funciona Contrastive Divergence?",
"¿Cuáles son las aplicaciones de las RBMs?",
"¿Qué es la función de energía?",
"¿Cómo se apilan RBMs en DBNs?"
]
# Procesar cada pregunta
for question in questions:
print(f"\n{'='*60}")
print(f"❓ {question}")
print(f"{'='*60}")
# Buscar contexto
context = rag.query_papers(question, n_results=3)
print(f"\n📚 Fragmentos encontrados: {len(context)}")
for i, doc in enumerate(context):
print(f"\n Fragmento {i+1}:")
print(f" Similitud: {doc['similarity']:.2%}")
print(f" Fuente: {doc['metadata']['source']}")
print(f" Autor: {doc['metadata']['author']} ({doc['metadata']['year']})")
# Generar respuesta
response = rag.generate_response(question, context)
print(f"\n💡 Respuesta:")
print(f"{response}")
print(f"\n{'='*60}")
Gestión de Papers Personalizados
Agregar Paper desde URL
import requests
from pathlib import Path
# Descargar paper
url = "https://ejemplo.com/paper.pdf"
response = requests.get(url)
# Guardar
papers_dir = Path("articles")
papers_dir.mkdir(exist_ok=True)
filepath = papers_dir / "nuevo_paper.pdf"
with open(filepath, 'wb') as f:
f.write(response.content)
print(f"✅ Paper descargado: {filepath}")
Editar Referencias
import json
from pathlib import Path
# Cargar referencias existentes
ref_file = Path("articles/papers_references.json")
if ref_file.exists():
with open(ref_file, 'r') as f:
references = json.load(f)
else:
references = {}
# Agregar nueva referencia
references["nuevo_paper.pdf"] = {
"title": "Título del Paper",
"authors": "Autor et al.",
"year": 2024,
"publication": "Journal Name, Vol(Issue), Pages",
"citation": "Autor et al. (2024). Título del Paper. Journal Name."
}
# Guardar
with open(ref_file, 'w', encoding='utf-8') as f:
json.dump(references, f, indent=2, ensure_ascii=False)
print("✅ Referencia agregada")
Arquitectura del Sistema RAG
Flujo de Procesamiento
┌─────────────────┐
│ Pregunta del │
│ Usuario │
└────────┬────────┘
│
▼
┌─────────────────┐
│ ChromaDB │
│ Búsqueda de │
│ Similitud │
│ Coseno │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Top-K Papers │
│ Relevantes │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Groq AI │
│ (Llama 3.3) │
│ Generación │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Respuesta │
│ Educativa │
└─────────────────┘
Embeddings y Similitud
ChromaDB usa embeddings para representar documentos:
Embedding: Convierte texto a vector denso
Similitud Coseno: Mide ángulo entre vectores
Rango: [-1, 1], normalizado a [0, 1]
1.0 = Idéntico
0.0 = Completamente diferente
Métodos de Búsqueda
query_papers
Busca fragmentos relevantes usando similitud vectorial.
- Parameters:
question(str): Pregunta del usuarion_results(int): Número de fragmentos (default: 3)
- Returns:
Lista de diccionarios con:
content: Texto del fragmentometadata: Información del paper (source, author, year, topic)distance: Distancia L2similarity: Similitud coseno (1 - distance)
Ejemplo:
# Buscar información sobre CD
results = rag.query_papers(
"Explica el algoritmo Contrastive Divergence",
n_results=5
)
# Analizar resultados
for i, result in enumerate(results):
print(f"\nResultado {i+1}:")
print(f" Similitud: {result['similarity']:.2%}")
print(f" Fuente: {result['metadata']['source']}")
print(f" Tema: {result['metadata']['topic']}")
print(f" Contenido: {result['content'][:150]}...")
Métodos de Generación
generate_response
Genera respuesta educativa usando Groq AI.
- Parameters:
question(str): Pregunta del usuariocontext(List[Dict]): Fragmentos relevantes
- Returns:
Respuesta generada
Configuración del prompt:
system_prompt = """Eres un asistente educativo experto en
Máquinas de Boltzmann Restringidas (RBMs) y Deep Learning.
Tu objetivo es explicar conceptos de manera clara y pedagógica,
usando los papers científicos como referencia."""
user_prompt = f"""Basándote en los siguientes fragmentos de
papers científicos, responde la pregunta:
CONTEXTO:
{context_text}
PREGUNTA: {question}
Por favor proporciona una respuesta clara, detallada y educativa."""
Ejemplo:
# Pregunta compleja
question = """¿Cuál es la diferencia entre Contrastive Divergence
y Persistent Contrastive Divergence?"""
# Buscar contexto
context = rag.query_papers(question, n_results=4)
# Generar respuesta
response = rag.generate_response(question, context)
print(f"Pregunta: {question}\n")
print(f"Respuesta:\n{response}")
Funciones de Renderizado
render_educational_rag_module
Renderiza la interfaz completa del sistema RAG en Streamlit.
Componentes de la interfaz:
Información de papers:
Lista de papers disponibles
Referencias bibliográficas completas
Estadísticas de la base de datos
Gestión de papers:
Descargar desde URL
Editar referencias
Eliminar papers
Preguntas sugeridas:
Nivel Básico (3 preguntas)
Nivel Intermedio (3 preguntas)
Nivel Avanzado (3 preguntas)
Chat interactivo:
Campo de texto para preguntas
Configuración de número de fragmentos
Visualización de fragmentos encontrados
Respuesta generada con IA
Historial:
Últimas 5 conversaciones
Preguntas y respuestas guardadas
Papers Científicos Incluidos
La base de conocimiento incluye información de:
Paper |
Autor |
Año |
|---|---|---|
A Practical Guide to Training RBMs |
Geoffrey E. Hinton |
2010 |
Training Products of Experts by Minimizing CD |
Geoffrey E. Hinton |
2002 |
Reducing Dimensionality with Neural Networks |
Hinton & Salakhutdinov |
2006 |
RBMs for Collaborative Filtering |
Salakhutdinov et al. |
2007 |
Deep Learning of Representations |
Yoshua Bengio |
2013 |
A Fast Learning Algorithm for DBNs |
Hinton et al. |
2006 |
Training RBMs using PCD |
Tijmen Tieleman |
2008 |
Ejemplo de Sesión Educativa
from src.educational_rag import EducationalRAG
# Inicializar
rag = EducationalRAG()
rag.load_papers_to_db()
# Sesión de aprendizaje progresivo
learning_path = [
# Nivel 1: Fundamentos
"¿Qué es una Máquina de Boltzmann Restringida?",
"¿Cuál es la arquitectura de una RBM?",
"¿Qué es la función de energía?",
# Nivel 2: Entrenamiento
"¿Cómo se entrena una RBM?",
"¿Qué es Contrastive Divergence?",
"¿Cuáles son los hiperparámetros importantes?",
# Nivel 3: Aplicaciones
"¿Para qué se usan las RBMs?",
"¿Qué son las Deep Belief Networks?",
"¿Cuáles son las limitaciones de las RBMs?"
]
# Procesar cada pregunta
for i, question in enumerate(learning_path, 1):
print(f"\n{'='*60}")
print(f"Pregunta {i}/{len(learning_path)}")
print(f"{'='*60}")
print(f"❓ {question}\n")
# Buscar y generar respuesta
context = rag.query_papers(question, n_results=3)
response = rag.generate_response(question, context)
print(f"💡 {response}\n")
# Mostrar fuentes
print("📚 Fuentes consultadas:")
for doc in context:
meta = doc['metadata']
print(f" - {meta['author']} ({meta['year']}): {meta['source']}")
Configuración Avanzada
Personalizar Modelo de IA
# Modificar configuración de Groq
response = rag.groq_client.chat.completions.create(
model="llama-3.3-70b-versatile", # O "mixtral-8x7b-32768"
messages=[...],
temperature=0.5, # Más determinístico
max_tokens=3000, # Respuestas más largas
top_p=0.9,
frequency_penalty=0.0,
presence_penalty=0.0
)
Personalizar Búsqueda
# Búsqueda con filtros de metadata
results = rag.collection.query(
query_texts=["pregunta"],
n_results=5,
where={"author": "Geoffrey E. Hinton"}, # Filtrar por autor
where_document={"$contains": "energy"} # Filtrar por contenido
)
Dependencias Requeridas
pip install chromadb groq
- ChromaDB:
Base de datos vectorial
Búsqueda por similitud
Persistencia local
- Groq:
API de LLMs rápidos
Llama 3.3 70B
Gratis con límites generosos
Troubleshooting
Error: «ChromaDB no está instalado»
pip install chromadb
Error: «Groq no está instalado»
pip install groq
Error: «No se encontró GROQ_API_KEY»
Crear archivo .streamlit/secrets.toml:
GROQ_API_KEY = "gsk_tu_api_key_aqui"
Obtener API key gratis: https://console.groq.com
Ver también
rbm_model - Implementación de RBM
Papers científicos en
articles/