renanceron/lgpdassistente
0
1from langchain_openai import OpenAIEmbeddings2from langchain_community.vectorstores import Pinecone as PineconeVectorStore3from langchain.chains import ConversationalRetrievalChain4from langchain.memory import ConversationSummaryBufferMemory5from langchain.schema import SystemMessage6from langchain_openai import ChatOpenAI7#from pinecone import Pinecone, ServerlessSpec8from pinecone import Pinecone9import gradio as gr10import os11import requests12 13# Obtendo as variáveis de ambiente14PINECONE_API_KEY = os.environ.get('PINECONE_API_KEY')15OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')16PINECONE_ENV = os.environ.get('PINECONE_ENV', 'us-east1-gcp')17 18# Configurando as variáveis de ambiente para as bibliotecas19os.environ['PINECONE_API_KEY'] = PINECONE_API_KEY20os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY21os.environ['PINECONE_ENV'] = PINECONE_ENV22 23# Criando a função para conversar com o chatbot24def converse_com_bot(message, chat_history):25 # Gerar embedding da pergunta26 embedding = embeddings.embed_query(message)27 # Buscar diretamente no Pinecone com score28 resultados = vector_store.similarity_search_with_score(message, k=3)29 score_threshold = 0.7530 documentos_validos = []31 resultados_raw = []32 for doc, score in resultados:33 chunk_resumido = doc.page_content[:120].replace("\n", " ")34 resultados_raw.append(f"Score: {round(score, 3)} | Chunk: {chunk_resumido}")35 if score >= score_threshold:36 documentos_validos.append(doc)37 38 # Se nenhum documento for relevante, retorna fora do escopo39 if not documentos_validos:40 # Sem documento relevante — resposta padrão41 resposta_texto = (42 "Essa pergunta parece estar fora do escopo da LGPD ou não encontrei informações relevantes nos documentos fornecidos. "43 "Por favor, reformule sua pergunta com foco na Lei Geral de Proteção de Dados."44 )45 contexto_concatenado = "-"46 else:47 resposta = rag_chain.invoke({"question": message})48 resposta_texto = resposta["answer"]49 contexto_concatenado = " ||| ".join([doc.page_content[:500].replace("\n", " ") for doc in documentos_validos])50 51 chat_history.append({"role": "user", "content": message})52 chat_history.append({"role": "assistant", "content": resposta_texto})53 54 enviar_log(message,resposta_texto,contexto_concatenado,resultados_raw)55 56 return "", chat_history57 58# Criando a função para resetar o chatbot59def resetar_chat():60 memory.clear()61 return []62 63def enviar_log(pergunta, resposta, contexto, resultados):64 url = os.environ.get("LOG_DIR")65 data = {66 "pergunta": pergunta,67 "resposta": resposta,68 "contexto": contexto,69 "resultados": resultados70 }71 try:72 response = requests.post(url, json=data)73 if response.status_code == 200:74 print("✅ Log enviado com sucesso para o Google Sheets")75 else:76 print(f"⚠️ Falha ao enviar log ({response.status_code})")77 except Exception as e:78 print("❌ Erro ao enviar log:", e)79 80embeddings = OpenAIEmbeddings(model='text-embedding-ada-002',openai_api_key=os.environ['OPENAI_API_KEY'])81 82index_name = 'lgpd'83vector_store = PineconeVectorStore.from_existing_index(index_name=index_name, embedding=embeddings)84 85llm = ChatOpenAI(model='gpt-3.5-turbo', temperature=0.2)86 87memory = ConversationSummaryBufferMemory(88 llm=llm,89 memory_key="chat_history",90 return_messages=True,91 max_token_limit=512,92 output_key="answer"93)94 95rag_chain = ConversationalRetrievalChain.from_llm(96 llm=llm,97 retriever=vector_store.as_retriever(),98 memory=memory,99 return_source_documents=True,100 output_key="answer"101)102 103memory.chat_memory.add_message(SystemMessage(104 content="Você é um assistente jurídico especializado na LGPD. Responda de forma clara, objetiva e baseado no input fornecido. Quando a pergunta estiver fora do escopo, solicite que refaça a pergunta sobre a LGPD."105))106 107# Teste de Embedding108#resultados = vector_store.similarity_search("teste LGPD", k=3)109#for i, doc in enumerate(resultados):110# print(f"\n🔹 Documento {i+1}:")111# print(doc.page_content[:300]) # Limita os primeiros 300 caracteres112# print("Metadata:", doc.metadata)113 114# Criando a interface com gradio115with gr.Blocks() as demo:116 gr.Markdown('# 🧠 Assistente de LGPD 🤖')117 gr.Markdown('''118 📝 Este assistente foi desenvolvido como parte de um TCC para apoiar o time de LGPD institucional. 119 O intuito é ajudar a esclarecer dúvidas e a orientar sobre a Lei Geral de Proteção de Dados, tornando o tema mais acessível e prático no dia a dia.120 ''')121 gr.Markdown('📊 **Pesquisa de validação da ferramenta:** <a href="https://forms.gle/eY12Xhgo5Emkjtdn8" target="_blank">clique aqui para responder</a>.')122 chatbot = gr.Chatbot(type='messages')123 msg = gr.Textbox(label='Digite a sua mensagem')124 limpar = gr.Button('Limpar')125 msg.submit(converse_com_bot, [msg, chatbot], [msg, chatbot])126 limpar.click(resetar_chat, None, chatbot, queue=False)127 128# Inicia a interface do Gradio129demo.launch()