File size: 6,111 Bytes
a6d3510
 
 
 
 
 
fed6581
 
 
 
a6d3510
fed6581
 
 
 
a6d3510
fed6581
 
 
 
 
68366ed
fed6581
 
b30c583
 
fed6581
 
21705c8
 
 
 
 
 
 
 
a6d3510
fed6581
 
a6d3510
 
 
 
 
 
 
fed6581
a6d3510
 
 
 
fed6581
 
 
a6d3510
fed6581
 
a6d3510
fed6581
a6d3510
fed6581
a6d3510
fed6581
 
 
 
 
 
 
 
21705c8
 
fed6581
 
 
11c2074
 
21705c8
 
68366ed
21705c8
fed6581
 
 
 
a6d3510
fed6581
68366ed
a6d3510
 
 
 
 
 
 
 
 
 
fed6581
 
 
 
 
 
 
 
21705c8
 
fed6581
 
 
 
 
 
11c2074
fed6581
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68366ed
fed6581
 
 
a6d3510
fed6581
 
 
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import os
import requests
import dotenv
import streamlit as st
from transformers import AutoTokenizer

# Função para carregar as configurações iniciais
def carregar_configuracoes():
    dotenv.load_dotenv()
    return os.environ['TOKEN_HF']

# Função para inicializar o modelo e o tokenizador
def inicializar_modelo_e_tokenizador(modelo, token):
    tokenizer = AutoTokenizer.from_pretrained(modelo, token=token)
    return tokenizer

# Função para configurar a sessão do usuário
def configurar_sessao(modelo):
    if 'modelo_atual' not in st.session_state or st.session_state['modelo_atual'] != modelo:
        st.session_state['modelo_atual'] = modelo
        st.session_state['mensagens'] = [
            {"role": "system", "content": "Você é um bot para investimentos, treinado para ajudar os usuários a gerenciar e otimizar seus portfólios financeiros."
                                          "Seu objetivo é fornecer análises de mercado, sugestões de investimentos personalizadas e educar os usuários sobre estratégias financeiras."
                                          "Você pode responder a perguntas sobre ações, fundos, criptomoedas, imóveis e outros tipos de investimentos."
                                          "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."
                                          "Seja sucinto em suas respostas, resumindo-as para no máximo 200 caracteres."},
            {"role": "assistant", "content": "Olá, seja bem vindo ao assistente financeiro, como posso te ajudar?"}
        ]
        st.markdown("""
            <style>
            .reportview-container .markdown-text-container p {
                line-height: 1.5;
                word-wrap: break-word;
            }
            </style>
            """, unsafe_allow_html=True)

# Função para classificar a entrada do usuário
def classificar_entrada(pergunta_usuario, opcoes_classificacao, headers, url_classificacao, limite_score=70):
    payload = {
        "inputs": pergunta_usuario,
        "parameters": {
            "candidate_labels": opcoes_classificacao
        }
    }
    response = requests.post(url_classificacao, headers=headers, json=payload)
    
    if response.status_code == 200:
        result = response.json()
        score = result['scores'][0] * 100
        label = result['labels'][0]
        
        if score > limite_score:
            return label, score
        else:
            print(f'Não atingiu mais que {limite_score}%. Score máximo {score:.2f}% para "{label}"')
            return None, score
    else:
        print(f"Erro na Classificação: {response.status_code}")
        print(response.json())
        return None, None

# Função para gerar uma resposta com base na classificação
def gerar_resposta(label, opcoes_classificacao):
    if label == opcoes_classificacao[0]:
        novo_pront = (
            "Extrato de investimentos.\n"
			"- Você possui os seguintes investimentos: \n"
			"- Valor em ações: 3.800,00 \n"
			"- Valor em Criptomoedas: 10.200,00 \n"
            "- CC: 5.000,00 \n"
			"- CP: 3.200 \n"
        )
    else:
        novo_pront = (
            "Esse é seu assessor de investimentos.\n"
			"- Você possui o assessor: \n"
			"- João da Silva \n"
			"- Tel: (11) 9 1111-1111 \n"
			"- e-mail: [email protected] \n"
			"- Empresa: Investimentos-SA \n"
        )
    
    print(novo_pront)
    return novo_pront

# Função para processar a conversa e exibir no Streamlit
def processar_conversa(url, headers, tokenizer, mensagens, token_modelo):
    template = tokenizer.apply_chat_template(mensagens, tokenize=False, add_generation_prompt=True)
    json = {
        'inputs': template,
        'parameters': {'max_new_tokens': 600},
        'options': {'use_cache': False, 'wait_for_model': True},
    }
    response = requests.post(url, json=json, headers=headers).json()
    print(response)
    mensagem_chatbot = response[0]['generated_text'].split(token_modelo)[-1]
    mensagens.append({'role': 'assistant', 'content': mensagem_chatbot})
    return mensagens

# Função para exibir as mensagens no chat
def exibir_mensagens(area_chat, mensagens):
    with area_chat.container():
        for mensagem in mensagens:
            if mensagem['role'] != 'system':  # Filtra as mensagens do tipo 'system'
                chat = st.chat_message(mensagem['role'])
                chat.markdown(mensagem['content'])
                

# Função principal que orquestra as chamadas
def main():
    token = carregar_configuracoes()
    headers = {'Authorization': f'Bearer {token}'}
    
    opcoes_classificacao =  ["Ivestimentos", "assessor"]
    modelo = 'meta-llama/Meta-Llama-3.1-8B-Instruct'
    token_modelo = '<|end_header_id|>\n'  # Adicionando a variável token_modelo
    
    configurar_sessao(modelo)
    
    nome_modelo = st.session_state['modelo_atual'] 
    tokenizer = inicializar_modelo_e_tokenizador(nome_modelo, token)
    url = f'/static-proxy?url=https%3A%2F%2Fapi-inference.huggingface.co%2Fmodels%2F%3Cspan class="hljs-subst">{nome_modelo}' 
    url_classificacao = f'/static-proxy?url=https%3A%2F%2Fapi-inference.huggingface.co%2Fmodels%2Ffacebook%2Fbart-large-mnli%26%23x27%3B%3C%2Fspan%3E
    
    mensagens = st.session_state['mensagens']
    area_chat = st.empty()
    exibir_mensagens(area_chat, mensagens)  # Exibe as mensagens iniciais, incluindo a mensagem de boas-vindas
    
    pergunta_usuario = st.chat_input('Faça sua pergunta aqui: ')
    
    if pergunta_usuario:
        label, score = classificar_entrada(pergunta_usuario, opcoes_classificacao, headers, url_classificacao)
        
        if label:
            novo_pront = gerar_resposta(label, opcoes_classificacao)
            mensagens.append({"role": "system", "content": novo_pront})
        
        mensagens.append({'role': 'user', 'content': pergunta_usuario})
        mensagens = processar_conversa(url, headers, tokenizer, mensagens, token_modelo)
        exibir_mensagens(area_chat, mensagens)
    
    print(mensagens)

# Executa a função principal
if __name__ == "__main__":
    main()