cd2-ai-hippo / app.py
renatozimmer's picture
Update app.py
3eef9c9
raw
history blame contribute delete
No virus
4.38 kB
# 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()