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()