File size: 4,454 Bytes
1246e5c
 
 
 
b0b36a2
 
 
1246e5c
 
 
 
 
 
 
b0b36a2
 
1246e5c
b0b36a2
1246e5c
 
 
 
 
 
 
 
 
 
 
b0b36a2
 
 
 
 
 
 
 
1246e5c
b0b36a2
 
 
 
 
 
1246e5c
 
 
 
 
 
 
 
 
 
 
3a58f65
1246e5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1edab21
1246e5c
1edab21
 
1246e5c
 
 
 
 
 
 
 
 
3a58f65
1246e5c
 
 
 
 
3a58f65
 
 
 
 
 
 
 
1246e5c
3a58f65
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 = "Welcome! As a painter bot, your role is to provide artistic inspiration and practical advice on painting techniques. Remember to engage users warmly, offering tips on color mixing, brush strokes, and different painting styles. Keep responses clear, concise, and encouraging, catering to both beginners and experienced artists. Share insights on composition, perspective, and the emotional impact of colors in art. Emphasize the importance of experimentation and personal expression in painting. Let's inspire creativity and enhance artistic skills together!"
    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 HOP book that is publicly available. and just to test RAG implementation.‼️"
    )
    
    chatbot = gr.ChatInterface(
        respond,
        examples=[
            ["What are some essential techniques for blending colors in acrylic painting?"],
            ["Can you recommend a beginner-friendly tutorial for learning oil painting?"],
            ["How can I achieve realistic textures like wood or glass in my watercolor paintings?"],
            ["What are the best practices for choosing a color palette for a landscape painting?"],
            ["Could you explain the process of creating depth and perspective in a painting?"],
            ["What are some innovative ways to use mixed media in abstract art?"],
            ["How do I protect and preserve my paintings for long-term display?"],
            ["What are some tips for overcoming artist's block and finding inspiration for new paintings?"]
        ],
        title='Painter'
    )

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