PregQandA / app.py
bash98's picture
Create app.py
64d6833 verified
import torch
import gradio as gr
import faiss
import numpy as np
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from sentence_transformers import SentenceTransformer
GEN_MODEL_NAME = "google/flan-t5-small"
EMB_MODEL_NAME = "sentence-transformers/all-MiniLM-L6-v2"
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
tokenizer = AutoTokenizer.from_pretrained(GEN_MODEL_NAME)
gen_model = AutoModelForSeq2SeqLM.from_pretrained(GEN_MODEL_NAME).to(DEVICE)
embedder = SentenceTransformer(EMB_MODEL_NAME, device=DEVICE)
DISCLAIMER = (
"Disclaimer: This pregnancy assistant provides general educational information only. "
"It is not a substitute for antenatal care or professional medical advice. "
"If you have warning signs (heavy bleeding, severe headache, severe abdominal pain, reduced baby movements) "
"or feel unsafe, please go to a clinic or hospital immediately."
)
pregnancy_facts = [
{
"id": 1,
"topic": "Antenatal care",
"text": (
"Pregnant women should attend regular antenatal visits to monitor their own health "
"and the baby's development. Early booking in the first trimester is recommended so "
"that any health issues can be detected and managed early. During antenatal visits, "
"healthcare providers may check blood pressure, weight, urine, and the baby's heartbeat, "
"and may request simple laboratory tests or scans when needed. These visits are also a "
"good time to ask questions about nutrition, exercise, birth preparation, and any symptoms "
"that are worrying you. Skipping antenatal care can make it easier to miss important warning "
"signs, so it is better to keep appointments and follow the advice of qualified health professionals."
)
},
{
"id": 2,
"topic": "Warning signs",
"text": (
"Some warning signs in pregnancy need urgent medical attention. These include severe or sudden "
"headache, blurred vision, swelling of the face or hands, heavy vaginal bleeding, severe abdominal "
"or pelvic pain, or fluid leaking from the vagina before labour starts. Other serious signs are fever, "
"painful urination, convulsions, difficulty breathing, or a sudden reduction or change in the baby's "
"movements. If a pregnant woman notices any of these symptoms, she should go to a clinic or hospital "
"as soon as possible or call a healthcare professional for guidance. It is safer to be checked and told "
"that everything is fine than to ignore a possible emergency."
)
},
{
"id": 3,
"topic": "Nutrition",
"text": (
"During pregnancy, eating a balanced diet helps support the health of the mother and the growing baby. "
"Meals should include vegetables, fruits, whole grains, and sources of protein such as beans, eggs, fish, "
"or lean meat, depending on what is culturally acceptable and available. Pregnant women are often advised "
"by healthcare providers to take folic acid and iron supplements to help reduce the risk of anaemia and "
"support the baby's development. Drinking enough clean water throughout the day is also important. "
"Highly processed foods, very sugary drinks, or large amounts of junk food should be limited. "
"For any supplements or herbal products, it is safer to ask a qualified healthcare professional before use."
)
},
{
"id": 4,
"topic": "Substances to avoid",
"text": (
"Alcohol, tobacco, and illicit or non-prescribed drugs should be avoided in pregnancy because they may "
"harm the baby and affect the mother's health. Smoking or exposure to second-hand smoke can increase the "
"risk of complications in pregnancy and after birth. Some medicines that are safe for non-pregnant adults "
"may not be safe in pregnancy, especially if taken without medical advice. Before starting, stopping, or "
"changing any medicine, including herbal remedies or over-the-counter drugs, a pregnant woman should speak "
"to a qualified healthcare professional. It is better to check first than to take a product that could be "
"unsafe for the baby."
)
},
{
"id": 5,
"topic": "Exercise",
"text": (
"For many women, moderate physical activity during pregnancy can be safe and beneficial. Simple activities "
"like walking, gentle stretching, or pregnancy-safe exercises can help improve mood, sleep, and general "
"fitness. However, very intense exercise, activities with a high risk of falling, or contact sports may not "
"be suitable in pregnancy. Pregnant women who were not exercising before pregnancy should start slowly and "
"listen to their bodies, stopping if they feel pain, dizziness, or shortness of breath. It is always a good "
"idea to discuss exercise plans with a healthcare professional, especially if there are any medical problems "
"or previous pregnancy complications."
)
},
]
corpus = [item["text"] for item in pregnancy_facts]
corpus_embeddings = embedder.encode(corpus, convert_to_numpy=True)
dimension = corpus_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(corpus_embeddings)
def retrieve_pregnancy_facts(query: str, k: int = 3):
query_embedding = embedder.encode([query], convert_to_numpy=True)
distances, indices = index.search(query_embedding, k)
results = []
for idx in indices[0]:
results.append(pregnancy_facts[idx]["text"])
return results
def pregnancy_qa_pipeline(question: str) -> str:
question = question.strip()
if not question:
return "Please type a question about pregnancy."
contexts = retrieve_pregnancy_facts(question, k=3)
context_str = "\n\n".join(contexts)
prompt = f"""You are an educational pregnancy information assistant.
Context:
{context_str}
Instructions:
- Give general educational information only.
- Do not diagnose or confirm pregnancy status.
- Do not provide medication doses, prescriptions, or step-by-step instructions for taking medicines.
- Do not provide instructions for ending a pregnancy.
- If the question sounds urgent or includes warning signs, strongly recommend immediate in-person care.
- If the context is insufficient, say what you can safely say and recommend seeing a healthcare professional.
Question: {question}
Answer:"""
inputs = tokenizer(
prompt,
return_tensors="pt",
truncation=True,
max_length=1024
).to(DEVICE)
with torch.no_grad():
outputs = gen_model.generate(
**inputs,
max_new_tokens=256,
num_beams=4,
early_stopping=True
)
answer = tokenizer.decode(outputs[0], skip_special_tokens=True).strip()
return f"{answer}\n\n{DISCLAIMER}"
def pregnancy_qa_interface(question: str) -> str:
return pregnancy_qa_pipeline(question)
with gr.Blocks() as demo:
gr.Markdown("# 🤰 Pregnancy Information Assistant (Educational Use Only)")
gr.Markdown(
"Ask general questions about pregnancy, antenatal care, warning signs, and lifestyle. "
"This tool is for education only and does not replace a healthcare professional."
)
with gr.Row():
with gr.Column():
q_box = gr.Textbox(
label="Ask a question about pregnancy",
placeholder="e.g. Is it safe to exercise during pregnancy?",
lines=2
)
ask_btn = gr.Button("Ask")
with gr.Column():
a_box = gr.Textbox(
label="Answer",
lines=10
)
ask_btn.click(
pregnancy_qa_interface,
inputs=q_box,
outputs=a_box
)
if __name__ == "__main__":
demo.launch()