File size: 4,380 Bytes
8ad03c1
2d0c971
 
 
 
 
 
 
8ad03c1
 
 
 
86e8342
0d6fbea
 
 
cf8ca68
 
8ad03c1
86e8342
 
8ad03c1
d551a1b
cf8ca68
4f900c1
 
cf8ca68
 
 
d551a1b
86e8342
 
2d0c971
cf8ca68
 
 
 
 
 
 
 
 
3cb6896
cf8ca68
 
 
 
 
 
 
 
4f900c1
cf8ca68
 
 
 
 
 
 
 
 
 
 
 
2d0c971
86e8342
 
3eef9c9
 
 
 
 
 
 
86e8342
 
 
 
f4e83a4
 
 
 
 
 
 
8ad03c1
4f900c1
 
 
 
 
 
 
 
 
 
09ba70b
8ad03c1
6382838
4f900c1
cf8ca68
8ad03c1
2d0c971
 
6382838
8ad03c1
86e8342
 
8ad03c1
cf8ca68
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# 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()