DanielDJ1987 commited on
Commit
fed6581
·
verified ·
1 Parent(s): b8efa00

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -72
app.py CHANGED
@@ -4,92 +4,75 @@ import dotenv
4
  import streamlit as st
5
  from transformers import AutoTokenizer
6
 
7
- dotenv.load_dotenv()
8
- token = os.environ['TOKEN_HF']
9
- headers = {'Authorization': f'Bearer {token}'}
 
10
 
11
- modelos = {
12
- 'meta-llama/Meta-Llama-3.1-8B-Instruct': '<|end_header_id|>\n',
13
- 'mistralai/Mixtral-8x7B-Instruct-v0.1': '[/INST]'
14
- }
15
 
16
- ofertas = ['Atualização', 'Quitação', 'Renegociação']
17
- opcoes_classificacao = ["Segunda via de boleto", "Conhecer as ofertas", "Renegociação", "Atualização", "Quitação"]
 
 
 
 
 
 
 
 
 
18
 
19
-
20
- modelo = st.selectbox('Selecione um modelo:', options=modelos)
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
- # Verifique a resposta
46
  if response.status_code == 200:
47
  result = response.json()
48
  score = result['scores'][0] * 100
49
  label = result['labels'][0]
50
- if score > 70:
51
- print(label)
52
- print(score)
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 70%. score maximo {score:.2f}% para "{label}"')
 
86
  else:
87
- print(f"Error Classificação: {response.status_code}")
88
  print(response.json())
 
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
-
92
- mensagens.append({'role': 'user', 'content': pergunta_usuario})
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
- with area_chat.container():
105
- for mensagem in mensagens:
106
- chat = st.chat_message(mensagem['role'])
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()