imunologic / app.py
vilsongreinert-tech's picture
Update app.py
df04ad4 verified
import os
import streamlit as st
import numpy as np
import faiss
from pypdf import PdfReader
from sentence_transformers import SentenceTransformer
from openai import OpenAI
# API Key da OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
st.set_page_config(page_title="Professor de Medicina IA")
st.title("🧠 Professor de Medicina IA")
model = SentenceTransformer("all-MiniLM-L6-v2")
# ---------- Ler todos os PDFs ----------
def load_pdfs(folder="pdfs"):
textos = []
if not os.path.exists(folder):
st.error(f"Pasta '{folder}' não encontrada.")
return textos
for file in os.listdir(folder):
if file.endswith(".pdf"):
caminho = os.path.join(folder, file)
reader = PdfReader(caminho)
for page in reader.pages:
txt = page.extract_text()
if txt and txt.strip():
textos.append(txt.strip())
return textos
# ---------- Criar índice vetorial ----------
@st.cache_resource
def build_index():
textos = load_pdfs()
if not textos:
return None, []
embeddings = model.encode(textos)
embeddings = np.array(embeddings).astype("float32")
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings)
return index, textos
index, textos = build_index()
# ---------- Interface ----------
pergunta = st.text_input("Pergunte sobre medicina:")
if pergunta:
if index is None:
st.error("Nenhum texto foi carregado dos PDFs.")
else:
q_embed = model.encode([pergunta])
q_embed = np.array(q_embed).astype("float32")
D, I = index.search(q_embed, k=3)
contexto = ""
for i in I[0]:
if i < len(textos):
contexto += textos[i] + "\n\n"
prompt = f"""
Use apenas o conteúdo abaixo para responder.
Se a resposta não estiver no conteúdo, diga que não encontrou informação suficiente.
Conteúdo:
{contexto}
Pergunta:
{pergunta}
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
st.write(response.choices[0].message.content)