CoolFace
Apppublic

HandelAI/ChatBot_JavaScript

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