Spaces:
Sleeping
Sleeping
DanielDJ1987
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -4,92 +4,75 @@ import dotenv
|
|
4 |
import streamlit as st
|
5 |
from transformers import AutoTokenizer
|
6 |
|
7 |
-
|
8 |
-
|
9 |
-
|
|
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
|
16 |
-
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
-
|
20 |
-
|
21 |
-
token_modelo = modelos[modelo]
|
22 |
-
|
23 |
-
if ('modelo_atual' not in st.session_state or st.session_state['modelo_atual'] != modelo):
|
24 |
-
st.session_state['modelo_atual'] = modelo
|
25 |
-
st.session_state['mensagens'] = [ {"role": "system", "content": "Você é um atendente de central de atendimento de negociação de dívidas. "
|
26 |
-
"Você é empático e gostaria sempre de entender a situação do cliente, como o que o levou a ficar em dívida. Seja sucinto nas suas respostas."},]
|
27 |
-
|
28 |
-
nome_modelo = st.session_state['modelo_atual']
|
29 |
-
tokenizer = AutoTokenizer.from_pretrained(nome_modelo, token=token)
|
30 |
-
url = f'https://api-inference.huggingface.co/models/{nome_modelo}'
|
31 |
-
url_classificacao = f'https://api-inference.huggingface.co/models/facebook/bart-large-mnli'
|
32 |
-
mensagens = st.session_state['mensagens']
|
33 |
-
|
34 |
-
area_chat = st.empty()
|
35 |
-
pergunta_usuario = st.chat_input('Faça sua pergunta aqui: ')
|
36 |
-
if pergunta_usuario:
|
37 |
payload = {
|
38 |
"inputs": pergunta_usuario,
|
39 |
"parameters": {
|
40 |
"candidate_labels": opcoes_classificacao
|
41 |
}
|
42 |
}
|
43 |
-
|
44 |
response = requests.post(url_classificacao, headers=headers, json=payload)
|
45 |
-
|
46 |
if response.status_code == 200:
|
47 |
result = response.json()
|
48 |
score = result['scores'][0] * 100
|
49 |
label = result['labels'][0]
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
if label == ofertas[1]:
|
54 |
-
novo_pront = (
|
55 |
-
"Você deve fornecer as seguintes informações.\n"
|
56 |
-
"- Relizamos o fechamento da sua quitação \n"
|
57 |
-
"- Valor total do contrato de R$ 6.000,00 foi fechado\n"
|
58 |
-
"- Foi enviado um email para '[email protected]' com mais detalhes"
|
59 |
-
)
|
60 |
-
else:
|
61 |
-
novo_pront = (
|
62 |
-
"Você deve fornecer as seguintes informações.\n"
|
63 |
-
"- Valor total do contrato: R$ 6.000,00\n"
|
64 |
-
"- Valor em aberto: R$ 2.000 \n"
|
65 |
-
"Ofertas disponíveis:\n"
|
66 |
-
"1 - Renegociação de dívida:\n"
|
67 |
-
"* Prazo de pagamento: 10 meses\n"
|
68 |
-
"* Valor mensal: R$ 590,00\n"
|
69 |
-
"* Desconto total: R$ 100,00\n"
|
70 |
-
"2 - Atualização de dívida atrasada:\n"
|
71 |
-
"* Prazo de pagamento: 1 parcela\n"
|
72 |
-
"* Valor a pagar: R$ 1.500,00\n"
|
73 |
-
"* Desconto total: R$ 500,00\n"
|
74 |
-
"* E continua pagando as parcelas do contrato \n"
|
75 |
-
"3 - Quitação de dívida:\n"
|
76 |
-
"- Prazo de pagamento: 1 vez\n"
|
77 |
-
"- Valor a pagar: R$ 5.000,00\n"
|
78 |
-
"- Desconto total: R$ 1.000,00\n"
|
79 |
-
)
|
80 |
-
|
81 |
-
print(novo_pront)
|
82 |
-
|
83 |
-
mensagens.append({"role": "system", "content": novo_pront})
|
84 |
else:
|
85 |
-
print(f'Não atingiu mais que
|
|
|
86 |
else:
|
87 |
-
print(f"
|
88 |
print(response.json())
|
|
|
89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
|
91 |
-
|
92 |
-
|
93 |
template = tokenizer.apply_chat_template(mensagens, tokenize=False, add_generation_prompt=True)
|
94 |
json = {
|
95 |
'inputs': template,
|
@@ -100,9 +83,51 @@ if pergunta_usuario:
|
|
100 |
print(response)
|
101 |
mensagem_chatbot = response[0]['generated_text'].split(token_modelo)[-1]
|
102 |
mensagens.append({'role': 'assistant', 'content': mensagem_chatbot})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
chat.markdown(mensagem['content'])
|
108 |
-
print(mensagens)
|
|
|
4 |
import streamlit as st
|
5 |
from transformers import AutoTokenizer
|
6 |
|
7 |
+
# Função para carregar as configurações iniciais
|
8 |
+
def carregar_configuracoes():
|
9 |
+
dotenv.load_dotenv()
|
10 |
+
return os.environ['TOKEN_HF']
|
11 |
|
12 |
+
# Função para inicializar o modelo e o tokenizador
|
13 |
+
def inicializar_modelo_e_tokenizador(modelo, token):
|
14 |
+
tokenizer = AutoTokenizer.from_pretrained(modelo, token=token)
|
15 |
+
return tokenizer
|
16 |
|
17 |
+
# Função para configurar a sessão do usuário
|
18 |
+
def configurar_sessao(modelo):
|
19 |
+
if 'modelo_atual' not in st.session_state or st.session_state['modelo_atual'] != modelo:
|
20 |
+
st.session_state['modelo_atual'] = modelo
|
21 |
+
st.session_state['mensagens'] = [
|
22 |
+
{"role": "system", "content": "Você é um assistente de investimentos inteligente, treinado para ajudar os usuários a gerenciar e otimizar seus portfólios financeiros."
|
23 |
+
"Seu objetivo é fornecer análises de mercado, sugestões de investimentos personalizadas e educar os usuários sobre estratégias financeiras."
|
24 |
+
"Você pode responder a perguntas sobre ações, fundos, criptomoedas, imóveis e outros tipos de investimentos."
|
25 |
+
"Além disso, você oferece insights sobre tendências de mercado e ajuda os usuários a tomar decisões informadas com base no perfil de risco deles."},
|
26 |
+
{"role": "assistant", "content": "Olá, seja bem vindo ao assistente financeiro, como posso te ajudar?"}
|
27 |
+
]
|
28 |
|
29 |
+
# Função para classificar a entrada do usuário
|
30 |
+
def classificar_entrada(pergunta_usuario, opcoes_classificacao, headers, url_classificacao, limite_score=70):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
payload = {
|
32 |
"inputs": pergunta_usuario,
|
33 |
"parameters": {
|
34 |
"candidate_labels": opcoes_classificacao
|
35 |
}
|
36 |
}
|
|
|
37 |
response = requests.post(url_classificacao, headers=headers, json=payload)
|
38 |
+
|
39 |
if response.status_code == 200:
|
40 |
result = response.json()
|
41 |
score = result['scores'][0] * 100
|
42 |
label = result['labels'][0]
|
43 |
+
|
44 |
+
if score > limite_score:
|
45 |
+
return label, score
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
else:
|
47 |
+
print(f'Não atingiu mais que {limite_score}%. Score máximo {score:.2f}% para "{label}"')
|
48 |
+
return None, score
|
49 |
else:
|
50 |
+
print(f"Erro na Classificação: {response.status_code}")
|
51 |
print(response.json())
|
52 |
+
return None, None
|
53 |
|
54 |
+
# Função para gerar uma resposta com base na classificação
|
55 |
+
def gerar_resposta(label, opcoes_classificacao):
|
56 |
+
if label == opcoes_classificacao[0]:
|
57 |
+
novo_pront = (
|
58 |
+
"Extrato de investimentos.\n"
|
59 |
+
"- Você possui os seguintes investimentos: \n"
|
60 |
+
"- Valor em ações: 3.800,00 \n"
|
61 |
+
"- Valor em Criptomoedas: 10.200,00 \n"
|
62 |
+
)
|
63 |
+
else:
|
64 |
+
novo_pront = (
|
65 |
+
"Esse é o saldo atual do cliente na carteira.\n"
|
66 |
+
"- Você possui um saldo de: \n"
|
67 |
+
"- CC: 5.000,00 \n"
|
68 |
+
"- CP: 3.200 \n"
|
69 |
+
)
|
70 |
+
|
71 |
+
print(novo_pront)
|
72 |
+
return novo_pront
|
73 |
|
74 |
+
# Função para processar a conversa e exibir no Streamlit
|
75 |
+
def processar_conversa(pergunta_usuario, url, headers, tokenizer, mensagens, token_modelo):
|
76 |
template = tokenizer.apply_chat_template(mensagens, tokenize=False, add_generation_prompt=True)
|
77 |
json = {
|
78 |
'inputs': template,
|
|
|
83 |
print(response)
|
84 |
mensagem_chatbot = response[0]['generated_text'].split(token_modelo)[-1]
|
85 |
mensagens.append({'role': 'assistant', 'content': mensagem_chatbot})
|
86 |
+
return mensagens
|
87 |
+
|
88 |
+
# Função para exibir as mensagens no chat
|
89 |
+
def exibir_mensagens(area_chat, mensagens):
|
90 |
+
with area_chat.container():
|
91 |
+
for mensagem in mensagens:
|
92 |
+
if mensagem['role'] != 'system': # Filtra as mensagens do tipo 'system'
|
93 |
+
chat = st.chat_message(mensagem['role'])
|
94 |
+
chat.code(mensagem['content'])
|
95 |
+
|
96 |
+
# Função principal que orquestra as chamadas
|
97 |
+
def main():
|
98 |
+
token = carregar_configuracoes()
|
99 |
+
headers = {'Authorization': f'Bearer {token}'}
|
100 |
+
|
101 |
+
opcoes_classificacao = ["Valor investido", "saldo atual"]
|
102 |
+
modelo = 'meta-llama/Meta-Llama-3.1-8B-Instruct'
|
103 |
+
token_modelo = '<|end_header_id|>\n' # Adicionando a variável token_modelo
|
104 |
+
|
105 |
+
configurar_sessao(modelo)
|
106 |
+
|
107 |
+
nome_modelo = st.session_state['modelo_atual']
|
108 |
+
tokenizer = inicializar_modelo_e_tokenizador(nome_modelo, token)
|
109 |
+
url = f'https://api-inference.huggingface.co/models/{nome_modelo}'
|
110 |
+
url_classificacao = f'https://api-inference.huggingface.co/models/facebook/bart-large-mnli'
|
111 |
+
|
112 |
+
mensagens = st.session_state['mensagens']
|
113 |
+
area_chat = st.empty()
|
114 |
+
exibir_mensagens(area_chat, mensagens) # Exibe as mensagens iniciais, incluindo a mensagem de boas-vindas
|
115 |
+
|
116 |
+
pergunta_usuario = st.chat_input('Faça sua pergunta aqui: ')
|
117 |
+
|
118 |
+
if pergunta_usuario:
|
119 |
+
label, score = classificar_entrada(pergunta_usuario, opcoes_classificacao, headers, url_classificacao)
|
120 |
+
|
121 |
+
if label:
|
122 |
+
novo_pront = gerar_resposta(label, opcoes_classificacao)
|
123 |
+
mensagens.append({"role": "system", "content": novo_pront})
|
124 |
+
|
125 |
+
mensagens.append({'role': 'user', 'content': pergunta_usuario})
|
126 |
+
mensagens = processar_conversa(pergunta_usuario, url, headers, tokenizer, mensagens, token_modelo)
|
127 |
+
exibir_mensagens(area_chat, mensagens)
|
128 |
+
|
129 |
+
print(mensagens)
|
130 |
|
131 |
+
# Executa a função principal
|
132 |
+
if __name__ == "__main__":
|
133 |
+
main()
|
|
|
|