import gradio as gr from ctransformers import AutoModelForCausalLM import textwrap import os import logging from tqdm import tqdm # Configurar logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Diretório para cache CACHE_DIR = os.path.join(os.path.expanduser("~"), ".bible_qa_cache") os.makedirs(CACHE_DIR, exist_ok=True) def load_model(progress=gr.Progress()): logger.info("Iniciando carregamento do modelo...") progress(0, desc="Iniciando carregamento do modelo") try: model = AutoModelForCausalLM.from_pretrained( "TheBloke/Llama-2-7B-Chat-GGML", model_file="llama-2-7b-chat.ggmlv3.q4_0.bin", model_type="llama", max_new_tokens=512, temperature=0.7, context_length=2048, cache_dir=CACHE_DIR ) progress(1, desc="Modelo carregado com sucesso!") logger.info("Modelo carregado com sucesso!") return model except Exception as e: logger.error(f"Erro ao carregar o modelo: {str(e)}") raise def format_prompt(question): return f"""Você é um assistente especializado em conhecimento bíblico. Por favor, responda à seguinte pergunta com base nas escrituras bíblicas: Pergunta: {question} Resposta baseada na Bíblia:""" def generate_biblical_response(question, model): try: prompt = format_prompt(question) response = model(prompt, max_new_tokens=512) return textwrap.fill(response, width=80) except Exception as e: logger.error(f"Erro ao gerar resposta: {str(e)}") return f"Erro ao gerar resposta: {str(e)}" def create_interface(): with gr.Blocks() as demo: gr.Markdown("""# Consultor Bíblico Virtual Faça perguntas sobre a Bíblia e receba respostas baseadas nas escrituras.""") # Carrega o modelo uma única vez model = load_model() with gr.Row(): with gr.Column(): question_input = gr.Textbox( lines=2, placeholder="Digite sua pergunta sobre a Bíblia aqui...", label="Sua Pergunta" ) submit_btn = gr.Button("Enviar Pergunta") with gr.Column(): answer_output = gr.Textbox( lines=10, label="Resposta" ) # Exemplos sem cache gr.Examples( examples=[ "O que a Bíblia diz sobre amor ao próximo?", "Como é descrita a criação do mundo no livro de Gênesis?", "Quais são os principais ensinamentos de Jesus sobre perdão?" ], inputs=question_input, cache_examples=False # Desativa o cache dos exemplos ) def process_question(question): logger.info(f"Processando pergunta: {question}") return generate_biblical_response(question, model) submit_btn.click( fn=process_question, inputs=question_input, outputs=answer_output ) return demo if __name__ == "__main__": logger.info("Iniciando aplicação...") demo = create_interface() demo.queue(concurrency_count=1).launch( server_name="0.0.0.0", share=True, show_error=True, cache_examples=False )