rag_template / app.py
Guilherme Favaron
Major update: Add hybrid search, reranking, multiple LLMs, and UI improvements
1b447de
"""
RAG Template - Aplicação Educativa com PostgreSQL + pgvector
Interface interativa mostrando cada passo do processo RAG:
- Ingestão de documentos com visualizações
- Exploração da base de conhecimento
- Chat RAG com contextos visíveis
- Playground de parâmetros
- Monitoramento de métricas
"""
import os
import uuid
import gradio as gr
from src.config import DATABASE_URL, APP_PORT
from src.database import DatabaseManager
from src.embeddings import EmbeddingManager
from src.generation import GenerationManager
from ui.ingestion_tab import create_ingestion_tab
from ui.exploration_tab import create_exploration_tab
from ui.chat_tab import create_chat_tab
from ui.playground_tab import create_playground_tab
from ui.monitoring_tab import create_monitoring_tab
from ui.chunking_comparison_tab import create_chunking_comparison_tab
from ui.hybrid_search_tab import create_hybrid_search_tab
from ui.visualizations_tab import create_visualizations_tab
from ui.custom_css import CUSTOM_CSS
def create_app():
"""Cria aplicação Gradio com todas as abas"""
# Inicializa gerenciadores
db_manager = DatabaseManager()
embedding_manager = EmbeddingManager()
generation_manager = GenerationManager()
# Inicializa schema do banco
db_ok = db_manager.init_schema()
# Gera session ID único
session_id = str(uuid.uuid4())
# Interface Gradio
with gr.Blocks(title="RAG Template", css=CUSTOM_CSS) as demo:
# Header
with gr.Row():
gr.Markdown("""
# RAG Template
Template interativo de Retrieval-Augmented Generation com PostgreSQL + pgvector
Explore cada etapa do processo RAG de forma visual e educativa.
""")
# Status da conexão
with gr.Row():
if db_ok:
connection_status = gr.Markdown("**Status**: Banco de dados conectado", elem_classes=["success"])
else:
error_msg = db_manager.last_error if db_manager.last_error else "Erro desconhecido"
connection_status = gr.Markdown(
f"**Status**: Erro de conexão com banco - {error_msg}. Configure a variável DATABASE_URL corretamente.",
elem_classes=["error"]
)
# Abas principais
with gr.Tabs():
# Aba 1: Ingestão
create_ingestion_tab(db_manager, embedding_manager, session_id)
# Aba 2: Exploração
create_exploration_tab(db_manager, embedding_manager, session_id)
# Aba 3: Chat RAG
create_chat_tab(db_manager, embedding_manager, generation_manager, session_id)
# Aba 4: Playground
create_playground_tab(db_manager, embedding_manager, generation_manager, session_id)
# Aba 5: Comparação de Chunking
create_chunking_comparison_tab()
# Aba 6: Busca Híbrida
create_hybrid_search_tab(db_manager, embedding_manager, session_id)
# Aba 7: Visualizações
create_visualizations_tab(db_manager, embedding_manager, session_id)
# Aba 8: Monitoramento
create_monitoring_tab(db_manager)
# Footer
with gr.Row():
gr.Markdown("""
---
**Tecnologias**: PostgreSQL + pgvector | Sentence Transformers | Hugging Face | Gradio
[Documentação](https://github.com/guifav/rag_template) |
[Reportar Issue](https://github.com/guifav/rag_template/issues) |
[GitHub](https://github.com/guifav/rag_template)
""")
return demo
if __name__ == "__main__":
app = create_app()
# Launch
app.queue().launch(
server_name="0.0.0.0",
server_port=APP_PORT,
share=False,
show_error=True
)