File size: 4,115 Bytes
1246e5c
 
 
 
b0b36a2
 
 
1246e5c
 
 
 
 
 
 
b0b36a2
 
1246e5c
b0b36a2
1246e5c
 
 
 
 
 
 
 
 
 
 
b0b36a2
 
 
 
 
 
 
 
1246e5c
b0b36a2
 
 
 
 
 
1246e5c
 
 
 
 
 
 
 
 
 
 
c54c897
1246e5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1edab21
1246e5c
1edab21
 
1246e5c
 
 
 
 
 
 
 
 
c54c897
1246e5c
 
 
 
 
c54c897
 
 
 
 
 
b0b36a2
 
1246e5c
c54c897
1246e5c
 
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient
from typing import List, Tuple
import fitz  # PyMuPDF
from sentence_transformers import SentenceTransformer, util
import numpy as np
import faiss

client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")

# Placeholder for the app's state
class MyApp:
    def __init__(self) -> None:
        self.documents = []
        self.embeddings = None
        self.index = None
        self.load_pdf("THEDIA1.pdf")
        self.build_vector_db()

    def load_pdf(self, file_path: str) -> None:
        """Extracts text from a PDF file and stores it in the app's documents."""
        doc = fitz.open(file_path)
        self.documents = []
        for page_num in range(len(doc)):
            page = doc[page_num]
            text = page.get_text()
            self.documents.append({"page": page_num + 1, "content": text})
        print("PDF processed successfully!")

    def build_vector_db(self) -> None:
        """Builds a vector database using the content of the PDF."""
        model = SentenceTransformer('all-MiniLM-L6-v2')
        self.embeddings = model.encode([doc["content"] for doc in self.documents])
        self.index = faiss.IndexFlatL2(self.embeddings.shape[1])
        self.index.add(np.array(self.embeddings))
        print("Vector database built successfully!")

    def search_documents(self, query: str, k: int = 3) -> List[str]:
        """Searches for relevant documents using vector similarity."""
        model = SentenceTransformer('all-MiniLM-L6-v2')
        query_embedding = model.encode([query])
        D, I = self.index.search(np.array(query_embedding), k)
        results = [self.documents[i]["content"] for i in I[0]]
        return results if results else ["No relevant documents found."]

app = MyApp()

def respond(
    message: str,
    history: List[Tuple[str, str]],
    system_message: str,
    max_tokens: int,
    temperature: float,
    top_p: float,
):
    system_message = "You are a knowledgeable mental health therapist. My goal is to provide a safe, supportive, and non-judgmental space where you can explore your thoughts and feelings. Whether you're dealing with stress, anxiety, depression, or any other challenges, I'm here to help you navigate through them. Let's work together to find the best path forward for your well-being. How are you feeling today?"
    messages = [{"role": "system", "content": system_message}]

    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    messages.append({"role": "user", "content": message})

    # RAG - Retrieve relevant documents
    retrieved_docs = app.search_documents(message)
    context = "\n".join(retrieved_docs)
    messages.append({"role": "system", "content": "Relevant documents: " + context})

    response = ""
    for message in client.chat_completion(
        messages,
        max_tokens=100,
        stream=True,
        temperature=0.98,
        top_p=0.7,
    ):
        token = message.choices[0].delta.content
        response += token
        yield response

demo = gr.Blocks()

with demo:
    gr.Markdown(
        "‼️Disclaimer: This chatbot is based on a mental health exercise book that is publicly available. and just to test RAG implementation.‼️"
    )
    
    chatbot = gr.ChatInterface(
        respond,
        examples=[
            ["What strategies can help me manage my anxiety?"],
            ["How can I improve my coping skills during tough times?"],
            ["What techniques can I use to build better relationships?"],
            ["Can you help me understand my emotions better?"],
            ["What are some effective ways to set and achieve my goals?"],
            ["How can I better manage stress"],
            ["I feel restless. Please help me."],
            ["I have destructive thoughts coming to my mind repetatively."]
        ],
        title='Mental Health Therapist👩‍⚕️🧘‍♀️'
    )

if __name__ == "__main__":
    demo.launch()