|
|
import gradio as gr |
|
|
|
|
|
theme = gr.themes.Soft( |
|
|
primary_hue="pink", |
|
|
secondary_hue="pink", |
|
|
neutral_hue="fuchsia", |
|
|
).set( |
|
|
link_text_color='*secondary_700' |
|
|
) |
|
|
|
|
|
|
|
|
from huggingface_hub import InferenceClient |
|
|
from sentence_transformers import SentenceTransformer |
|
|
import torch |
|
|
import numpy as np |
|
|
|
|
|
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 teens ages 10-18. You give clear kid-appropiate explainations with {info} and keep your explainations to 10 sentences maximum." |
|
|
}] |
|
|
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" |
|
|
|
|
|
with gr.Blocks (theme = theme) as chatbot: |
|
|
gr.Image(display_image()) |
|
|
gr.ChatInterface(respond, type = "messages", |
|
|
|
|
|
|
|
|
|
|
|
title = "Hi, I'm BloomBot! 🌸", |
|
|
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 different types of period products? ", |
|
|
"What are some vitamins that are good for teenage girls?", |
|
|
"What should I know about puberty?", |
|
|
"Where can I find my nearest OBGYN?"] |
|
|
) |
|
|
with gr.Tab("Resources"): |
|
|
gr.Markdown("### Resources") |
|
|
gr.HTML(""" |
|
|
<a href="https://drive.google.com/file/d/1_KNELAUDLLidwAT3fs2JBuO1yPgMGoDv/view" target="_blank"> |
|
|
# <button style="font-size:16px;padding:10px 20px;margin-top:10px;"> |
|
|
# 📄 Period Tracker |
|
|
# </button> |
|
|
</a> |
|
|
# """) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chatbot.launch(debug=True) |
|
|
|
|
|
|
|
|
|