File size: 3,579 Bytes
235b1ba
f20e203
 
 
 
 
 
 
 
 
 
1141e72
6a07e12
 
3b2955b
6a07e12
ef74b61
41bc4c0
5365751
fef5776
235b1ba
5365751
 
 
 
 
 
 
 
 
 
 
7a49b3f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5365751
d988bde
dad409f
c63d6bc
 
522c4c0
a7bd1f8
d988bde
 
a45d244
d988bde
a45d244
a7bd1f8
 
d988bde
f4f569e
d988bde
0d31859
 
d988bde
 
 
c8355cc
23ea263
d988bde
a666c04
5229086
 
 
 
 
f715e9b
baf17f8
4813d63
baf17f8
a0541ae
c0e3a66
65a1ec1
 
 
 
4813d63
b50b32a
4ea7bf8
762a536
6b3d127
 
762a536
45b2e6b
ad150b6
 
 
 
 
 
 
 
22c87f5
6ec3458
 
d988bde
 
235b1ba
0bc90b3
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
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,
        #temperature = .2
        top_p = .2
    ):
        token = message.choices[0].delta.content
        response += token
       # print(response)
    yield response 
        

#theme = gr.themes.Ocean(
#    primary_hue="pink",
#    secondary_hue="pink",
#    neutral_hue="fuchsia"
#    )

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", #theme = gr.themes.Soft(
    #primary_hue="pink",
    #secondary_hue="pink",
    #neutral_hue="fuchsia"),
    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>
   # """)
         
     #with gr.Tab("Educational PDFs"):
       # gr.Markdown("### 📘 Helpful Resources")

chatbot.launch(debug=True)