File size: 3,806 Bytes
06d3034
 
c631798
 
 
 
 
06d3034
 
 
c631798
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92ef8a7
c631798
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
06d3034
 
c631798
 
 
 
 
 
06d3034
d15edb1
06d3034
 
 
 
 
 
 
 
 
 
c631798
 
d15edb1
c631798
06d3034
c631798
06d3034
 
c631798
06d3034
c631798
 
06d3034
 
 
 
 
c631798
06d3034
c631798
 
 
 
 
 
 
 
 
2041feb
92ef8a7
c631798
f24ca9e
c631798
 
 
06d3034
 
c631798
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
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("Mypdf.pdf")  # Replace with the actual PDF filename
        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 good presenter and advice Study material based on Mypdf guide to Focus on Goals.You provide helpful advice on managing stress. You ask one question at a time when clarification is needed. Remember to be polite and considerate in your responses. Use the guide to provide accurate and helpful information for focusing on your goals."
    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 information: " + context})

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

demo = gr.Blocks()

with demo:
    gr.Markdown(
        "‼️Disclaimer: This chatbot is based on Mypdf guide and is intended for general advice on managing stress and study schedule.‼️"
    )
    
    chatbot = gr.ChatInterface(
        respond,
        examples=[
            ["How I feel positive about my studies?"],
            ["What do meditation relax my stress?"],
            ["Can you guide me about my career Options?"],
            ["How do I ignore the negative facts and remain positive?"],
        
        ],
        title='Focus on your goals❤️🕊️'
    )

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