import streamlit as st import torch from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModelForQuestionAnswering def carregar_modelos(): # Caminhos no Hugging Face Hub caminho_gpt = "mateuscasare/GPTNeo-Vade-Mecum-2023" caminho_bert = "mateuscasare/BERT-Vade-Mecum-2023" caminho_bert_juridico = "mateuscasare/modelo_juridico_pt" dispositivo = "cuda" if torch.cuda.is_available() else "cpu" # Carregar modelos do Hugging Face Hub tokenizer_gpt = AutoTokenizer.from_pretrained(caminho_gpt) model_gpt = AutoModelForCausalLM.from_pretrained(caminho_gpt).to(dispositivo) tokenizer_bert = AutoTokenizer.from_pretrained(caminho_bert) model_bert = AutoModelForQuestionAnswering.from_pretrained(caminho_bert).to(dispositivo) tokenizer_bert_juridico = AutoTokenizer.from_pretrained(caminho_bert_juridico) model_bert_juridico = AutoModelForQuestionAnswering.from_pretrained(caminho_bert_juridico).to(dispositivo) return tokenizer_gpt, model_gpt, tokenizer_bert, model_bert, tokenizer_bert_juridico, model_bert_juridico, dispositivo def main(): st.set_page_config(page_title="Assistente Jurídico", layout="wide") st.title("⚖️ Assistente Jurídico") # Carregar modelos tokenizer_gpt, model_gpt, tokenizer_bert, model_bert, tokenizer_bert_juridico, model_bert_juridico, dispositivo = carregar_modelos() # Interface principal tab1, tab2, tab3 = st.tabs(["Geração de Texto", "Perguntas e Respostas", "Perguntas Jurídicas Específicas"]) with tab1: st.subheader("📝 Gerador de Textos Jurídicos") prompt = st.text_area("Descreva sua necessidade:", height=150, placeholder="Ex: Preciso de uma petição de habeas corpus...") col1, col2 = st.columns(2) with col1: max_length = st.slider("Tamanho da resposta", 100, 2000, 500) temperatura = st.slider("Criatividade", 0.0, 1.0, 0.7) if st.button("Gerar", type="primary"): with st.spinner("Gerando texto..."): inputs = tokenizer_gpt(prompt, return_tensors="pt").to(dispositivo) outputs = model_gpt.generate(**inputs, max_length=max_length, temperature=temperatura, do_sample=True) texto_gerado = tokenizer_gpt.decode(outputs[0], skip_special_tokens=True) st.text_area("Texto gerado:", texto_gerado, height=400) with tab2: st.subheader("❓ Consulta Jurídica (Modelo Genérico)") contexto = st.text_area("Contexto:", height=150, placeholder="Insira o contexto jurídico aqui...") pergunta = st.text_input("Sua pergunta:", placeholder="Ex: Qual o prazo para...?") if st.button("Responder (Modelo Genérico)", type="primary"): with st.spinner("Analisando..."): inputs = tokenizer_bert(pergunta, contexto, return_tensors="pt").to(dispositivo) outputs = model_bert(**inputs) answer_start = torch.argmax(outputs.start_logits) answer_end = torch.argmax(outputs.end_logits) + 1 answer = tokenizer_bert.decode(inputs["input_ids"][0][answer_start:answer_end]) st.success(f"Resposta: {answer}") with tab3: st.subheader("⚖️ Consulta Jurídica Específica") contexto_juridico = st.text_area("Contexto Jurídico:", height=150, placeholder="Insira o contexto jurídico específico aqui...") pergunta_juridica = st.text_input("Sua pergunta jurídica:", placeholder="Ex: Qual o prazo para recorrer?") if st.button("Responder (Modelo Jurídico)", type="primary"): with st.spinner("Analisando..."): inputs = tokenizer_bert_juridico(pergunta_juridica, contexto_juridico, return_tensors="pt").to(dispositivo) outputs = model_bert_juridico(**inputs) answer_start = torch.argmax(outputs.start_logits) answer_end = torch.argmax(outputs.end_logits) + 1 answer = tokenizer_bert_juridico.decode(inputs["input_ids"][0][answer_start:answer_end]) st.success(f"Resposta Jurídica: {answer}") with st.expander("ℹ️ Sobre os Modelos"): st.markdown(""" Este assistente utiliza três modelos de IA: - **GPTNeo Vade-Mecum**: Para geração de textos jurídicos. - **BERT Vade-Mecum**: Para responder perguntas gerais sobre direito. - **Modelo Jurídico PT**: Treinado especificamente com textos jurídicos brasileiros para maior precisão. """) if __name__ == "__main__": main()