import json
import faiss
import numpy as np
import streamlit as st
from groq import Groq
from sentence_transformers import SentenceTransformer
from streamlit_extras.stylable_container import stylable_container
st.set_page_config(page_title='Psicopatologia Geral - Jaspers', layout='wide', page_icon='🧠')
STYLE = "style.css"
STYLES = "styles.html"
with open(STYLE, "r", encoding="utf-8") as f:
st.markdown(f"", unsafe_allow_html=True)
with open(STYLES, "r", encoding="utf-8") as f:
st.markdown(f"", unsafe_allow_html=True)
with stylable_container(
key="banner",
css_styles="""
img {
width: 1700px;
height: 280px;
overflow: hidden;
position: relative;
object-fit: cover;
border-radius: 20px; /* Adiciona bordas arredondadas */
mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
-webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
}
""",
):
st.image("25.jpg")
# Inicialização do modelo de embedding
@st.cache_resource
def load_embedding_model():
return SentenceTransformer('all-MiniLM-L6-v2')
model = load_embedding_model()
client = Groq(
api_key=st.secrets["GROQ_API_KEY"],
)
@st.cache_resource
def load_index_and_embeddings(index_file: str, embeddings_file: str):
index = faiss.read_index(index_file)
embeddings = np.load(embeddings_file)
return index, embeddings
def search(query: str, index, embeddings: np.ndarray, chunks: list, k: int = 5):
query_vector = model.encode([query])
distances, indices = index.search(query_vector.astype('float32'), k)
return [chunks[i] for i in indices[0]]
def query_groq(prompt, client):
chat_completion = client.chat.completions.create(
messages=[
{
"role": "user",
"content": prompt,
}
],
model="mixtral-8x7b-32768",
temperature=0.5,
max_tokens=2500,
)
return chat_completion.choices[0].message.content
# Função para converter chunk em texto
def chunk_to_text(chunk):
if isinstance(chunk, str):
return chunk
elif isinstance(chunk, list):
return " ".join(map(str, chunk))
else:
return str(chunk)
# Carregar índice, embeddings e chunks
@st.cache_resource
def load_data():
index, embeddings = load_index_and_embeddings("index.faiss", "embeddings.npy")
with open("chunks.json", "r") as f:
chunks = json.load(f)
return index, embeddings, chunks
index, embeddings, chunks = load_data()
# Interface Streamlit
st.title("Dr. Pers - Psicopatologia Geral - K. Jaspers")
# Inicializar histórico do chat
if "groq_chat_history" not in st.session_state:
st.session_state.groq_chat_history = []
# Exibição do histórico do chat
for message in st.session_state.groq_chat_history:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Input do usuário
user_message = st.chat_input("Digite sua pergunta sobre Psicopatologia Geral:")
if user_message:
# Adiciona a mensagem do usuário ao histórico
st.session_state.groq_chat_history.append({"role": "user", "content": user_message})
# Exibe a mensagem do usuário
with st.chat_message("user"):
st.markdown(user_message)
# Realiza a busca e gera a resposta
relevant_chunks = search(user_message, index, embeddings, chunks)
context = "\n".join(chunk_to_text(chunk) for chunk in relevant_chunks)
prompt = f"""Você é um velho psiquiatra, Dr. Pers, que ajudou a transcrever o livro Psicopatologia geral de Karl Jaspers.
Sua função é auxiliar jovens psiquiatras e interessados em psicopatologia a entender melhor esta grande obra.
Com base no seguinte contexto, que tem esta obra completa, responda à pergunta do usuário. Seja sempre direto
e elabore bem as respostas, porém caso o usuário queira falar sobre qualquer outro assunto, responda:
"Não tenho conhecimento concreto para tratar de outros temas senão da Psicopatologia geral." Seja sempre cortês,
e sempre dê suas respostas em português do Brasil.
Contexto:
{context}
Pergunta: {user_message}
Resposta:"""
# Gera a resposta
response = query_groq(prompt, client)
# Adiciona a resposta ao histórico
st.session_state.groq_chat_history.append({"role": "assistant", "content": response})
# Exibe a resposta
with st.chat_message("assistant"):
st.markdown(response)
# Informações adicionais
st.sidebar.title("Informações")
with stylable_container(
key="jas",
css_styles="""
img {
position: relative;
object-fit: cover;
border-radius: 18px;
}
""",
):
st.sidebar.image("jas1.jpg")
def clear_chat_history():
"""
Clears the chat history and resets the initial analysis in the session state.
This function clears the chat history and resets the initial analysis in the session state.
"""
st.session_state.groq_chat_history = []
if st.sidebar.button("Reiniciar a conversa", type="primary"):
clear_chat_history()
st.sidebar.image('ap.jpg', width=150)
st.sidebar.markdown(
"""
#### Informações:
###### - Psicopatologia Geral, I e II - Jaspers
##### - Acesso livre
### Links:
##### - [Obsidian - Dr Guilherme](http://dr-guilhermeapolinario.com) 🌎
##### - [GitHub - Dr Guilherme](http://dr-guilhermeapolinario.com) 🌎
"""
)