Un sistema completo y modular para generar preguntas y respuestas (Q&A) a partir de prompts temáticos y documentos, con soporte para múltiples modelos de IA y exportación a diversos formatos.
- Generación por prompts: Crea Q&A desde temas y descripciones textuales
- Procesamiento de documentos: Extrae Q&A de PDF, DOCX, TXT y MD
- Búsqueda avanzada: Integración con Perplexity para información actualizada
- OpenAI GPT: GPT-4, GPT-3.5-turbo
- Anthropic Claude: Claude-3-Sonnet, Claude-3-Haiku
- Google Gemini: Gemini-Pro
- Configuración flexible: Cambio dinámico entre proveedores
- Unificación de datos: Combina múltiples fuentes en un formato estándar
- Detección de duplicados: Fusión inteligente de contenido similar
- Filtrado avanzado: Por categoría, nivel, confianza, fecha, etc.
- Estadísticas detalladas: Análisis completo de los datos generados
- Múltiples formatos: CSV, JSON, Excel, YAML
- Metadatos incluidos: Información completa de origen y generación
- Descarga directa: Desde la interfaz web
- Streamlit Web App: Interfaz moderna y responsiva
- Configuración en tiempo real: Cambios dinámicos de configuración
- Visualización rica: Gráficos y estadísticas interactivas
- Experiencia fluida: Diseño centrado en el usuario
- Python 3.11+
- Docker (opcional)
- API Keys de al menos uno de los proveedores soportados
-
Clonar el repositorio
git clone https://github.com/tu-usuario/generador-modular-qa.git cd generador-modular-qa -
Crear entorno virtual
python -m venv venv # Windows venv\\Scripts\\activate # macOS/Linux source venv/bin/activate
-
Instalar dependencias
pip install -r requirements.txt # Descargar modelo de spaCy para español python -m spacy download es_core_news_sm -
Configurar variables de entorno
# Copiar archivo de configuración cp .env.example .env # Editar .env con tus API keys nano .env
-
Ejecutar la aplicación
streamlit run app.py
La aplicación estará disponible en
http://localhost:8501
-
Usando docker-compose (recomendado)
# Configurar variables de entorno cp .env.example .env nano .env # Ejecutar docker-compose up -d
-
Docker manual
# Construir imagen docker build -t qa-generator . # Ejecutar contenedor docker run -p 8501:8501 -v $(pwd)/.env:/app/.env qa-generator
Edita el archivo .env con tus claves de API:
# Configurar al menos una API key
OPENAI_API_KEY=tu_clave_openai
ANTHROPIC_API_KEY=tu_clave_anthropic
GOOGLE_API_KEY=tu_clave_google
PERPLEXITY_API_KEY=tu_clave_perplexity
# Configuración opcional
DEFAULT_MODEL_PROVIDER=openai
MAX_QUESTIONS_PER_BATCH=50
DEFAULT_LANGUAGE=esfrom src.generators.prompt_generator import generate_qa_from_prompt
# Generar Q&A desde un tema
batch = await generate_qa_from_prompt(
prompt="Inteligencia artificial en medicina",
categoria="tecnologia",
nivel="intermedio",
num_preguntas=10,
modelo="openai",
usar_busqueda=True
)from src.extractors.document_processor import process_document_to_qa
# Procesar documento PDF
batch = await process_document_to_qa(
file_path="ruta/al/documento.pdf",
categoria="educacion",
nivel="avanzado",
preguntas_por_chunk=5
)from src.unifiers.data_unifier import QADataManager, ExportConfig
# Crear manager y agregar datos
manager = QADataManager()
manager.add_data([batch1, batch2, batch3])
# Exportar a CSV
config = ExportConfig(formato="csv", incluir_metadatos=True)
output_path = manager.process_and_export(config)generador-modular-qa/
├── 📁 src/ # Código fuente principal
│ ├── 📁 generators/ # Generadores de Q&A
│ │ └── prompt_generator.py # Generación por prompts + LLMs
│ ├── 📁 extractors/ # Extractores de documentos
│ │ └── document_processor.py # Procesamiento de PDF/DOCX/TXT
│ ├── 📁 unifiers/ # Unificadores y exportadores
│ │ └── data_unifier.py # Gestión y exportación de datos
│ └── 📁 utils/ # Utilidades compartidas
│ ├── data_models.py # Modelos Pydantic
│ └── logger.py # Sistema de logging
├── 📁 config/ # Configuración
│ └── settings.py # Configuración central
├── 📁 data/ # Datos del proyecto
│ ├── documents/ # Documentos de entrada
│ └── output/ # Archivos exportados
├── 📁 examples/ # Ejemplos de uso
├── 📁 tests/ # Tests unitarios
├── 📄 app.py # Aplicación Streamlit
├── 📄 requirements.txt # Dependencias Python
├── 📄 Dockerfile # Imagen Docker
├── 📄 docker-compose.yml # Orquestación Docker
└── 📄 README.md # Este archivo
class QAItem(BaseModel):
pregunta: str # La pregunta formulada
respuesta: str # La respuesta correspondiente
categoria: str # Categoría temática
nivel: str # Nivel: básico, intermedio, avanzado
tema: str # Tema específico
fuentes: List[str] # Fuentes de información
confianza: float # Nivel de confianza (0.0-1.0)
idioma: str # Idioma del contenido
metadatos: Dict[str, Any] # Metadatos adicionalesclass QABatch(BaseModel):
items: List[QAItem] # Lista de elementos Q&A
origen: str # prompt, documento, manual, api
prompt_original: str # Prompt usado (si aplica)
documento_fuente: str # Documento fuente (si aplica)
parametros_generacion: Dict # Parámetros de generación
estadisticas: Dict # Estadísticas del loteasync def generate_qa_from_prompt(
prompt: str,
categoria: str = "general",
nivel: str = "intermedio",
num_preguntas: int = 10,
modelo: str = "openai",
usar_busqueda: bool = False
) -> QABatchasync def process_document_to_qa(
file_path: str,
categoria: str = "general",
nivel: str = "intermedio",
preguntas_por_chunk: int = 3,
modelo: str = "openai"
) -> QABatch-
Implementar interfaz base
class NuevoProvider(LLMProvider): async def generate_qa(self, prompt: str, **kwargs) -> str: # Implementar lógica específica pass
-
Registrar en el generador
# En prompt_generator.py self.providers["nuevo"] = NuevoProvider
-
Configurar API key
# En .env NUEVO_API_KEY=tu_clave_api
Modifica los templates en config/settings.py:
CUSTOM_PROMPT_TEMPLATE = """
Tu prompt personalizado aquí...
Tema: {topic}
Nivel: {difficulty}
...
"""-
Implementar método en QAExporter
def export_to_nuevo_formato(self, items: List[QAItem], file_path: str): # Lógica de exportación pass
-
Registrar formato
self.supported_formats.append('nuevo_formato')
# Ejecutar todos los tests
pytest
# Tests con coverage
pytest --cov=src tests/
# Tests específicos
pytest tests/test_generators.py -vEl sistema incluye logging detallado y métricas:
- Logs estructurados: Con rotación automática
- Métricas de rendimiento: Tiempo de generación, tokens usados
- Estadísticas de calidad: Confianza, distribución por categorías
- Análisis de datos: Visualizaciones en Streamlit
# Usando gunicorn para mejor rendimiento
pip install gunicorn
gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:appHeroku
git push heroku mainRailway
railway upGoogle Cloud Run
gcloud run deploy --source .- Fork el proyecto
- Crea una rama feature (
git checkout -b feature/nueva-caracteristica) - Commit tus cambios (
git commit -am 'Añadir nueva característica') - Push a la rama (
git push origin feature/nueva-caracteristica) - Abre un Pull Request
- Código: Seguir PEP 8, usar type hints
- Documentación: Documentar funciones públicas
- Tests: Incluir tests para nuevas funcionalidades
- Commits: Mensajes descriptivos en español
- Soporte para LLaMA y modelos locales
- Fine-tuning automático basado en feedback
- Evaluación automática de calidad de Q&A
- Procesamiento distribuido con Celery
- Base de datos PostgreSQL/MongoDB
- API REST completa
- Plugin para WordPress/Drupal
- Integración con LMS (Moodle, Canvas)
- API para integración empresarial
Error: "No module named 'src'"
export PYTHONPATH="${PYTHONPATH}:$(pwd)"Error: "API key not found"
- Verificar que
.envesté en la raíz del proyecto - Confirmar que las variables tengan el formato correcto
Streamlit no carga
- Verificar puerto 8501 disponible
- Revisar logs en
logs/qa_generator.log
Docker no construye
- Verificar Docker daemon activo
- Limpiar caché:
docker system prune -a
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.
Tu Nombre
- GitHub: @tu-usuario
- Email: [email protected]
- LinkedIn: Tu Perfil
- OpenAI por GPT API
- Anthropic por Claude API
- Google por Gemini API
- Streamlit por el framework web
- Comunidad open source por las librerías utilizadas
⭐ Si este proyecto te resulta útil, considera darle una estrella en GitHub