HandelAI/ChatBot_JavaScript
0
1import os2import sqlite33import pandas as pd4from dotenv import load_dotenv5from bs4 import BeautifulSoup6import requests7from langchain_community.document_loaders import WebBaseLoader8from langchain.text_splitter import RecursiveCharacterTextSplitter9from langchain_community.vectorstores import FAISS10from langchain_huggingface import HuggingFaceEmbeddings11from langchain_openai import ChatOpenAI12from langchain.chains import ConversationalRetrievalChain13from langchain.memory import ConversationBufferMemory14import gradio as gr15 16# Carrega chave da API17load_dotenv()18os.environ["OPENAI_API_KEY"] = os.getenv("OPENROUTER_API_KEY")19os.environ["OPENAI_API_BASE"] = "https://openrouter.ai/api/v1"20 21# Embeddings fixos22embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")23 24# Mapeamento de temas para documentação de Data Science25temas_para_links = {26 "classificação": "https://scikit-learn.org/stable/modules/classification.html",27 "regressão": "https://scikit-learn.org/stable/modules/linear_model.html",28 "dataframes": "https://pandas.pydata.org/docs/user_guide/dsintro.html",29 "séries temporais": "https://pandas.pydata.org/docs/user_guide/timeseries.html",30 "visualização": "https://matplotlib.org/stable/users/index.html",31 "aprendizado não supervisionado": "https://scikit-learn.org/stable/modules/unsupervised_learning.html",32 "pré-processamento": "https://scikit-learn.org/stable/modules/preprocessing.html",33 "análise exploratória": "https://pandas.pydata.org/docs/getting_started/intro_tutorials/01_table_oriented.html",34 "machine learning": "https://scikit-learn.org/stable/user_guide.html",35 "deep learning": "https://pytorch.org/tutorials/beginner/basics/intro.html"36}37 38# Detecta tema com base na pergunta39def identificar_tema(pergunta):40 pergunta = pergunta.lower()41 for tema, link in temas_para_links.items():42 if tema in pergunta:43 return link44 return None45 46# Cria banco de dados SQLite se não existir47conn = sqlite3.connect("historico_conversas.db")48cursor = conn.cursor()49cursor.execute('''50CREATE TABLE IF NOT EXISTS conversas (51 id INTEGER PRIMARY KEY AUTOINCREMENT,52 aluno TEXT,53 pergunta TEXT,54 resposta TEXT,55 timestamp DATETIME DEFAULT CURRENT_TIMESTAMP56)57''')58conn.commit()59conn.close()60 61# LLM da OpenRouter62llm = ChatOpenAI(model="deepseek/deepseek-r1:free", temperature=0.4)63 64# Memória da conversa65memoria = ConversationBufferMemory(memory_key="chat_history", return_messages=True, output_key="answer")66 67# Função para salvar no banco68def salvar_conversa(nome, pergunta, resposta):69 conn = sqlite3.connect("historico_conversas.db")70 cursor = conn.cursor()71 cursor.execute("INSERT INTO conversas (aluno, pergunta, resposta) VALUES (?, ?, ?)",72 (nome or "Anônimo", pergunta, str(resposta)))73 conn.commit()74 conn.close()75 76# Função principal com roteamento por tema77def responder(pergunta, nome):78 try:79 link = identificar_tema(pergunta)80 81 if link:82 loader = WebBaseLoader(link)83 docs = loader.load()84 splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)85 documents = splitter.split_documents(docs)86 87 if len(documents) > 0:88 vectordb = FAISS.from_documents(documents, embeddings)89 retriever = vectordb.as_retriever()90 91 resultado = ConversationalRetrievalChain.from_llm(92 llm=llm,93 retriever=retriever,94 memory=memoria,95 return_source_documents=True,96 output_key="answer"97 ).invoke({"question": pergunta})98 99 raw = resultado["answer"]100 resposta = raw.content if hasattr(raw, "content") else str(raw)101 102 else:103 resposta = llm.invoke(pergunta).content104 else:105 resposta = llm.invoke(pergunta).content106 107 salvar_conversa(nome, pergunta, resposta)108 return resposta109 110 except Exception as e:111 import traceback112 return f"❌ **Erro:**\n```\n{traceback.format_exc()}\n```"113 114# Resetar memória115def resetar_memoria():116 memoria.clear()117 return "✅ Memória resetada com sucesso!"118 119# Exportar conversas para arquivos120def exportar_conversas():121 conn = sqlite3.connect("historico_conversas.db")122 df = pd.read_sql_query("SELECT * FROM conversas ORDER BY timestamp DESC", conn)123 df.to_csv("conversas_exportadas.csv", index=False)124 df.to_excel("conversas_exportadas.xlsx", index=False, engine="openpyxl")125 conn.close()126 return "✅ Arquivos 'conversas_exportadas.csv' e 'conversas_exportadas.xlsx' foram salvos!"127 128# Interface Gradio129with gr.Blocks() as app:130 gr.Markdown("## 📊 Tutor de Data Science com IA + Documentação Técnica")131 nome = gr.Textbox(label="Seu nome (opcional)", placeholder="Ex: Ana")132 pergunta = gr.Textbox(label="Sua dúvida sobre Data Science", placeholder="Ex: Como funciona a validação cruzada?")133 resposta = gr.Markdown(value="ℹ️ Aguardando sua pergunta...")134 135 botao_enviar = gr.Button("Enviar")136 botao_resetar = gr.Button("🔁 Resetar Memória")137 botao_exportar = gr.Button("📤 Exportar Histórico")138 139 botao_enviar.click(fn=responder, inputs=[pergunta, nome], outputs=resposta)140 botao_resetar.click(fn=resetar_memoria, outputs=resposta)141 botao_exportar.click(fn=exportar_conversas, outputs=resposta)142 143app.launch(share=True)