Spaces:
Runtime error
Runtime error
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() |