drguilhermeapolinario commited on
Commit
452174b
·
verified ·
1 Parent(s): 4f02138

Update views/newchatgroq.py

Browse files
Files changed (1) hide show
  1. views/newchatgroq.py +145 -175
views/newchatgroq.py CHANGED
@@ -1,175 +1,145 @@
1
- from typing import Generator
2
-
3
- import streamlit as st
4
- from groq import Groq
5
-
6
-
7
-
8
- st.title("ChatBot UBS Flamengo")
9
-
10
- def clear_all_session_state():
11
- """
12
- Clears all keys from the `st.session_state` dictionary.
13
- This function iterates over all the keys in the `st.session_state` dictionary and deletes each key from the dictionary.
14
- This is useful when you want to reset the session state and start fresh.
15
- Parameters:
16
- None
17
- Returns:
18
- None
19
- """
20
- for key in list(st.session_state.keys()):
21
- del st.session_state[key]
22
-
23
-
24
- if st.sidebar.button('Limpar Estado da Sessão', type = "primary"):
25
- clear_all_session_state()
26
- st.experimental_rerun()
27
-
28
- col1, col2 =st.columns(2)
29
- with col1:
30
- st.write('')
31
- with col2:
32
- st.markdown("### 📚 - Documentos, pesquisas e temas gerais!")
33
-
34
- # Configuração do cliente Groq
35
- client = Groq(
36
- api_key=st.secrets["GROQ_API_KEY"],
37
- )
38
-
39
- # Inicialização do histórico de chat e modelo selecionado
40
- if "messages" not in st.session_state:
41
- st.session_state.messages = []
42
-
43
- if "selected_model" not in st.session_state:
44
- st.session_state.selected_model = None
45
-
46
- # Definição dos modelos disponíveis
47
- modelos = {
48
- "gemma-7b-it": {"name": "Gemma-7b-it", "tokens": 8192, "developer": "Google"},
49
- "llama2-70b-4096": {"name": "llamA2-70b-chat", "tokens": 4096, "developer": "Meta"},
50
- "llama3-70b-8192": {"name": "LLaMA3-70b-8192", "tokens": 8192, "developer": "Meta"},
51
- "llama3-8b-8192": {"name": "LLaMA3-8b-8192", "tokens": 8192, "developer": "Meta"},
52
- "mixtral-8x7b-32768": {"name": "Mixtral-8x7b-Instruct-v0.1", "tokens": 32768, "developer": "Mistral"},
53
- }
54
-
55
-
56
-
57
- # Layout para seleção do modelo e controle deslizante de max_tokens
58
- col1, col2 = st.columns(2)
59
-
60
- with col1:
61
- opcao_modelo = st.selectbox(
62
- "Escolha um modelo:",
63
- options=list(modelos.keys()),
64
- format_func=lambda x: modelos[x]["name"],
65
- index=2 # Padrão para llama 70b
66
- )
67
-
68
- prompt_model = """
69
- Você é um assistente virtual especializado, atuando em uma Unidade Básica de Saúde (UBS) que se
70
- chama UBS Flamengo em Contagem - Minas Gerais - Brasil.
71
- Sua função principal é auxiliar profissionais de saúde e administrativos em diversas tarefas,
72
- sempre se comunicando em português brasileiro formal.
73
-
74
- Comportamento e Comunicação
75
-
76
- Inicie cada interação perguntando o nome do usuário e use-o respeitosamente durante toda a conversa.
77
- Mantenha um tom profissional, cortês e empático em todas as interações.
78
- Adapte seu nível de linguagem ao do usuário, mantendo-se sempre claro e compreensível.
79
- Evite usar termos técnicos excessivos, a menos que solicitado ou apropriado ao contexto.
80
-
81
- Principais Responsabilidades
82
-
83
- Auxiliar na elaboração de relatórios médicos e administrativos.
84
- Interpretar e explicar notas técnicas e diretrizes de saúde.
85
- Sumarizar textos complexos relacionados à saúde pública.
86
- Oferecer insights e análises quando solicitado, baseando-se em informações atualizadas e confiáveis.
87
- Responder a perguntas sobre procedimentos padrão na UBS.
88
-
89
- Limitações e Ética
90
-
91
- Nunca forneça diagnósticos médicos ou substitua o aconselhamento de profissionais de saúde.
92
- Mantenha estrita confidencialidade e não solicite ou discuta informações pessoais de pacientes.
93
- Se não tiver conhecimento sobre um tópico específico, admita honestamente e sugira que o usuário
94
- consulte um profissional qualificado.
95
- Em situações de emergência, oriente o usuário a buscar ajuda médica imediata.
96
-
97
- Formato de Respostas
98
-
99
- Forneça respostas completas e estruturadas, usando marcadores ou numeração quando apropriado.
100
- Para tópicos complexos, ofereça uma visão geral concisa seguida por detalhes, se necessário.
101
- Use analogias ou exemplos práticos para explicar conceitos difíceis, quando relevante.
102
-
103
- Conhecimento e Atualizações
104
-
105
- Mantenha-se atualizado sobre as políticas de saúde pública brasileiras e procedimentos padrão em UBS.
106
- Esteja preparado para discutir tópicos atuais relacionados à saúde pública no Brasil.
107
- Quando citar informações, mencione a necessidade de verificar fontes oficiais para obter os dados
108
- mais recentes.
109
-
110
- """
111
-
112
- # Detectar mudança de modelo e limpar histórico de chat se o modelo mudou
113
- if st.session_state.selected_model != opcao_modelo:
114
- st.session_state.messages = [{"role": "system", "content": prompt_model}]
115
- st.session_state.selected_model = opcao_modelo
116
-
117
-
118
-
119
-
120
- intervalo_max_tokens = modelos[opcao_modelo]["tokens"]
121
-
122
- with col2:
123
- max_tokens = st.slider(
124
- "Máximo de Tokens:",
125
- min_value=512,
126
- max_value=intervalo_max_tokens,
127
- value=min(32768, intervalo_max_tokens),
128
- step=512,
129
- help=f"Ajuste o número máximo de tokens (palavras) para a resposta do modelo. Máximo para o modelo selecionado: {intervalo_max_tokens}"
130
- )
131
-
132
-
133
- # Exibir mensagens do chat do histórico
134
- for message in st.session_state.messages:
135
- if message["role"] != "system":
136
- avatar = '🤖' if message["role"] == "assistant" else '👤'
137
- with st.chat_message(message["role"], avatar=avatar):
138
- st.markdown(message["content"])
139
-
140
- def generate_chat_responses(chat_complete) -> Generator[str, None, None]:
141
- """Gera conteúdo de resposta do chat a partir da resposta da API Groq."""
142
- for chunk in chat_complete:
143
- if chunk.choices[0].delta.content:
144
- yield chunk.choices[0].delta.content
145
-
146
- if prompt := st.chat_input("Digite seu prompt aqui..."):
147
- st.session_state.messages.append({"role": "user", "content": prompt})
148
-
149
- with st.chat_message("user", avatar='👤'):
150
- st.markdown(prompt)
151
-
152
- # Buscar resposta da API Groq
153
- try:
154
- chat_complete = client.chat.completions.create(
155
- model=opcao_modelo,
156
- messages=st.session_state.messages,
157
- max_tokens=max_tokens,
158
- stream=True
159
- )
160
-
161
- # Usar a função geradora com st.write_stream
162
- with st.chat_message("assistant", avatar="🤖"):
163
- response_placeholder = st.empty()
164
- full_response = ""
165
- for chunk in generate_chat_responses(chat_complete):
166
- full_response += chunk
167
- response_placeholder.markdown(full_response + "▌")
168
- response_placeholder.markdown(full_response)
169
- # Adicionar a resposta completa ao st.session_state.messages
170
- st.session_state.messages.append({"role": "assistant", "content": full_response})
171
-
172
-
173
- except Exception as e:
174
- st.error(f"Ocorreu um erro: {e}", icon="🚨")
175
-
 
1
+ from typing import Generator
2
+
3
+ import streamlit as st
4
+ from groq import Groq
5
+
6
+
7
+ cf1, cf2 = st.columns
8
+
9
+ with cf1:
10
+ st.title("ChatBot UBS Flamengo")
11
+
12
+ with cf2, stylable_container(
13
+ key="bot1",
14
+ css_styles="""
15
+ img {
16
+ width: 220px;
17
+ height: 200px;
18
+ overflow: hidden;
19
+ position: relative;
20
+ object-fit: cover;
21
+ border-radius: 14px; /* Adiciona bordas arredondadas */
22
+ }
23
+ """
24
+ ):
25
+ st.image("src/Images/bot.png")
26
+
27
+
28
+ def clear_all_session_state():
29
+ """
30
+ Clears all keys from the `st.session_state` dictionary.
31
+ This function iterates over all the keys in the `st.session_state` dictionary and deletes each key from the dictionary.
32
+ This is useful when you want to reset the session state and start fresh.
33
+ Parameters:
34
+ None
35
+ Returns:
36
+ None
37
+ """
38
+ for key in list(st.session_state.keys()):
39
+ del st.session_state[key]
40
+
41
+
42
+ my_secret = os.getenv('GROQ_API_KEY')
43
+ client = Groq(api_key=my_secret)
44
+
45
+ # Inicialização do histórico do chat
46
+ if "ubs_chat_history" not in st.session_state:
47
+ st.session_state.ubs_chat_history = []
48
+
49
+ for message in st.session_state.ubs_chat_history:
50
+ with st.chat_message(message["role"]):
51
+ st.markdown(message["content"])
52
+
53
+ # Input do usuário (colocado fora e abaixo do container do histórico)
54
+ user_message = st.chat_input(
55
+ "Digite sua pergunta ")
56
+
57
+ # Processamento da mensagem do usuário
58
+ if user_message:
59
+ # Adiciona a mensagem do usuário ao histórico
60
+ st.session_state.ubs_chat_history.append({
61
+ "role": "user",
62
+ "content": user_message
63
+ })
64
+
65
+ try:
66
+ context = """
67
+ Você é um assistente virtual especializado, atuando em uma Unidade Básica de Saúde (UBS) que se
68
+ chama UBS Flamengo em Contagem - Minas Gerais - Brasil.
69
+ Sua função principal é auxiliar profissionais de saúde e administrativos em diversas tarefas,
70
+ sempre se comunicando em português brasileiro formal.
71
+
72
+ Comportamento e Comunicação
73
+
74
+ Inicie cada interação perguntando o nome do usuário e use-o respeitosamente durante toda a conversa.
75
+ Mantenha um tom profissional, cortês e empático em todas as interações.
76
+ Adapte seu nível de linguagem ao do usuário, mantendo-se sempre claro e compreensível.
77
+ Evite usar termos técnicos excessivos, a menos que solicitado ou apropriado ao contexto.
78
+
79
+ Principais Responsabilidades
80
+
81
+ Auxiliar na elaboração de relatórios médicos e administrativos.
82
+ Interpretar e explicar notas técnicas e diretrizes de saúde.
83
+ Sumarizar textos complexos relacionados à saúde pública.
84
+ Oferecer insights e análises quando solicitado, baseando-se em informações atualizadas e confiáveis.
85
+ Responder a perguntas sobre procedimentos padrão na UBS.
86
+
87
+ Limitações e Ética
88
+
89
+ Nunca forneça diagnósticos médicos ou substitua o aconselhamento de profissionais de saúde.
90
+ Mantenha estrita confidencialidade e não solicite ou discuta informações pessoais de pacientes.
91
+ Se não tiver conhecimento sobre um tópico específico, admita honestamente e sugira que o usuário
92
+ consulte um profissional qualificado.
93
+ Em situações de emergência, oriente o usuário a buscar ajuda médica imediata.
94
+
95
+ Formato de Respostas
96
+
97
+ Forneça respostas completas e estruturadas, usando marcadores ou numeração quando apropriado.
98
+ Para tópicos complexos, ofereça uma visão geral concisa seguida por detalhes, se necessário.
99
+ Use analogias ou exemplos práticos para explicar conceitos difíceis, quando relevante.
100
+
101
+ Conhecimento e Atualizações
102
+
103
+ Mantenha-se atualizado sobre as políticas de saúde pública brasileiras e procedimentos padrão em UBS.
104
+ Esteja preparado para discutir tópicos atuais relacionados à saúde pública no Brasil.
105
+ Quando citar informações, mencione a necessidade de verificar fontes oficiais para obter os dados
106
+ mais recentes.
107
+
108
+ """
109
+ # Chamada à API Groq
110
+ chat_rci = client.chat.completions.create(
111
+ messages=[
112
+ {
113
+ "role": "system",
114
+ "content": context
115
+ },
116
+ *st.session_state.ubs_chat_history,
117
+ ],
118
+ model="llama3-70b-8192",
119
+ temperature=0.3,
120
+ max_tokens=2500,
121
+ )
122
+
123
+ # Processamento da resposta
124
+ if chat_rci.choices and len(chat_rci.choices) > 0:
125
+ response_message = chat_rci.choices[0].message.content
126
+ else:
127
+ response_message = "Não foi possível gerar uma resposta."
128
+
129
+ # Adição da resposta ao histórico
130
+ st.session_state.ubs_chat_history.append({
131
+ "role":
132
+ "assistant",
133
+ "content":
134
+ response_message
135
+ })
136
+
137
+ # Exibição da nova resposta
138
+ with st.chat_message("assistant"):
139
+ st.markdown(response_message)
140
+
141
+ except Exception as e:
142
+ st.error(f"Ocorreu um erro: {str(e)}")
143
+
144
+ # Rolar para o final do chat após uma nova mensagem
145
+ st.rerun()