CoolFace
Apppublic

renanceron/lgpdassistente

sourceHugging Facemitupdated 1y agoView on Hugging Face
0likes
app.py129 linesDownload Raw Back to root
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()