| | import gradio as gr |
| | from huggingface_hub import InferenceClient |
| | from sentence_transformers import SentenceTransformer |
| | import torch |
| | import numpy as np |
| |
|
| | theme = gr.themes.Soft( |
| | primary_hue="rose", |
| | secondary_hue="zinc", |
| | neutral_hue="pink" |
| | ) |
| |
|
| | custom_css = """ |
| | :root { /* This applies to the light mode */ |
| | --background-fill-primary: *primary_100 !important; /* Light pink */ |
| | } |
| | |
| | .dark { /* This applies to the dark mode */ |
| | --background-fill-primary: #FFB6C1 !important; /* Hot pink */ |
| | } |
| | """ |
| |
|
| |
|
| | with open("knowledge.txt" , "r", encoding="utf-8") as f: |
| | knowledge_base = f.read() |
| |
|
| | print("Knowledge base loaded.") |
| |
|
| | cleaned_text = knowledge_base.strip() |
| |
|
| | chunks = cleaned_text.split("\n") |
| | cleaned_chunks = [] |
| |
|
| | for chunk in chunks: |
| | stripped_chunk = chunk.strip() |
| | if stripped_chunk: |
| | cleaned_chunks.append(stripped_chunk) |
| | print(cleaned_chunks) |
| |
|
| | model = SentenceTransformer('all-MiniLM-L6-v2') |
| | chunk_embeddings = model.encode(cleaned_chunks, convert_to_tensor=True) |
| | print(chunk_embeddings) |
| |
|
| | def get_top_chunks(query): |
| | query_embedding = model.encode(query, convert_to_tensor=True) |
| | query_embedding_normalized = query_embedding / query_embedding.norm() |
| | chunk_embeddings_normalized = chunk_embeddings / chunk_embeddings.norm(dim=1, keepdim=True) |
| |
|
| | similarities = torch.matmul(chunk_embeddings_normalized, query_embedding_normalized) |
| | print(similarities) |
| |
|
| | top_indices = torch.topk(similarities, k=3).indices |
| | print(top_indices) |
| |
|
| | top_chunks = [] |
| |
|
| | for i in top_indices: |
| | chunk = chunks[i] |
| | top_chunks.append(chunk) |
| |
|
| | return top_chunks |
| |
|
| | client = InferenceClient("google/gemma-3-27b-it") |
| |
|
| | def respond(message,history): |
| | info = get_top_chunks(message) |
| | messages = [{"role": "system" , "content": f"Your name is BloomBot and you're a supportive and helpful chatbot catered towards women of all ages. You're friendly and caring. You give clear appropiate explainations with {info} and keep your explainations to 10 sentences maximum. You should make sure of the users age so you can give the most appropiate answer." |
| | }] |
| | if history: |
| | messages.extend(history) |
| | |
| | messages.append({"role" : "user", "content" : message}) |
| | |
| | response = "" |
| | |
| | for message in client.chat_completion( |
| | messages, |
| | max_tokens = 500, |
| | stream=True, |
| | top_p = .2 |
| | ): |
| | token = message.choices[0].delta.content |
| | response += token |
| | yield response |
| | |
| | def display_image(): |
| | return "Screenshot 2025-06-12 at 10.53.59 AM.png" |
| |
|
| | def show_info(topic): |
| | responses = { |
| | "General Health": 18009949662, |
| | "Maternal Mental Health": 18338526262, |
| | "Domestic Violence": 18007997233, |
| | "Postpartum Support": 18009944773 |
| | } |
| | return responses.get(topic, "Select a topic to see more info.") |
| |
|
| |
|
| | with gr.Blocks (theme = theme) as chatbot: |
| | gr.Image(display_image()) |
| | gr.ChatInterface(respond, type = "messages", |
| | title = "Hi, I'm BloomBot! 🌸", |
| | textbox= gr.Textbox(placeholder="Share Your Age and Ask Me Anything!"), |
| | description = "This tool is here to listen and provide information on female health topics, and all discussions will be kept confidential. ❤️🩹", |
| | examples = ["What are the common symptoms of menopause?", |
| | "What are some vitamins that are good for teenage girls?", |
| | "What should I know about puberty?", |
| | "Where can I find my nearest OBGYN?"] |
| | ) |
| | title_hotline= "# Select To Get Hotline Number" |
| | |
| | with gr.Tabs(): |
| | with gr.TabItem("Resources"): |
| | gr.Markdown("### Resources") |
| | open_google = gr.Button(value="🗓️ Period Tracker", link="https://drive.google.com/file/d/1_KNELAUDLLidwAT3fs2JBuO1yPgMGoDv/view") |
| | open_google = gr.Button(value="👩🏻🍼 New Moms Support Group", link="https://www.instagram.com/firsttimemomsacademy/") |
| | |
| | |
| | with gr.TabItem("Call a Hotline"): |
| | gr.Markdown(title_hotline) |
| | |
| | dropdown = gr.Dropdown(choices=["General Health", "Maternal Mental Health", "Domestic Violence", "Postpartum Support"], |
| | label="Choose Your Hotline" |
| | ) |
| | output = gr.Textbox(label="Hotline Info", interactive=False) |
| | |
| | dropdown.change(fn=show_info, inputs=dropdown, outputs=output) |
| | |
| | |
| |
|
| | chatbot.launch(debug=True) |
| |
|
| |
|
| |
|