# coding=utf8 from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings from langchain.chains import RetrievalQA import gradio as gr import time import os # Carregar chave da API OpenAI api_key = os.getenv("OPENAI_API_KEY") if not api_key: raise ValueError("OPENAI_API_KEY não está definido no ambiente.") else: print("Chave API carregada com sucesso.") # Variáveis globais para armazenamento dos objetos carregados global bd, chain # Load CSS from a separate file try: with open("src/css/styles.css", "r") as css_file: css = css_file.read() print("Arquivo CSS carregado com sucesso.") except Exception as e: print(f"Erro ao carregar o arquivo CSS: {e}") def initialize_chatbot(): global bd, chain try: llm = ChatOpenAI( temperature=0.0, model="gpt-3.5-turbo", api_key=api_key, ) print("Modelo ChatOpenAI inicializado com sucesso.") except Exception as e: print(f"Erro ao inicializar o modelo ChatOpenAI: {e}") try: carregador = TextLoader("docs/Produtos.txt", encoding="utf-8") documentos = carregador.load() print("Documentos carregados com sucesso.") except Exception as e: print(f"Erro ao carregar documentos: {e}") try: quebrador = CharacterTextSplitter(separator="\n\n\n", chunk_overlap=200) textos = quebrador.split_documents(documentos) print("Documentos divididos com sucesso.") except Exception as e: print(f"Erro ao dividir documentos: {e}") try: embeddings = OpenAIEmbeddings() bd = FAISS.from_documents(textos, embeddings) chain = RetrievalQA.from_chain_type(llm, retriever=bd.as_retriever()) print("FAISS e RetrievalQA inicializados com sucesso.") except Exception as e: print(f"Erro ao inicializar FAISS ou RetrievalQA: {e}") def chatbot(input_text): modelo_prompt = PromptTemplate.from_template( """ Você é um sommelier altamente experiente trabalhando para a Adega Hippo, uma adega renomada por sua vasta seleção de vinhos de alta qualidade. Um cliente entra na adega e pede uma recomendação de vinho. Utilize seu extenso conhecimento sobre vinhos, incluindo variedades de uvas, regiões vinícolas, harmonizações gastronômicas e preferências pessoais, para fornecer a melhor recomendação possível. Seja amigável, acolhedor e pronto para oferecer sugestões detalhadas e úteis. Lembre-se de perguntar ao cliente sobre suas preferências pessoais, como tipos de vinho que gosta (tinto, branco, rosé, espumante), ocasiões especiais, e qualquer outra informação relevante que possa ajudá-lo a fazer uma recomendação personalizada. O cliente diz: {pergunta} """, ) prompt = modelo_prompt.format(pergunta=input_text) try: response = chain({"query": prompt}) print(response['result']) return response['result'] except Exception as e: print(f"Erro ao obter resposta do chatbot: {e}") return "Desculpe, houve um erro ao processar sua solicitação." def respond(message, chat_history): try: response = chatbot(message) chat_history.append((message, response)) time.sleep(1) return "", chat_history except Exception as e: print(f"Erro ao responder mensagem: {e}") return "Erro ao processar a mensagem.", chat_history with gr.Blocks(css=css, title='Adega Hippo') as demo: realPath = str(os.path.dirname(os.path.realpath(__file__))) img1 = gr.Image("images/adega_hippo.png", elem_classes="img svelte-ms5bsk", elem_id="img-svelte-ms5bsk") gpt = gr.Chatbot(label=".", elem_classes="wrap svelte-1o68geq", elem_id="chatbot") msg = gr.Textbox(elem_id="div-svelte-awbtu4", elem_classes="textBoxBot", show_label=False, placeholder="Bem vindo ao Hippo Supermercados, em que posso ajuda-lo?", ) msg.submit(respond, [msg, gpt], [msg, gpt]) # Inicializar o chatbot initialize_chatbot() # Lançar o aplicativo sem a opção share demo.launch()