Spaces:
Sleeping
Sleeping
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()
|