File size: 8,125 Bytes
64d6833 |
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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
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()
|