dentist / PDF.file
Harsh4334632's picture
Create PDF.file
d90b22a verified
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")
class MyApp:
def __init__(self) -> None:
self.documents = []
self.embeddings = None
self.index = None
self.load_pdf("/path/to/your/pdf/file.pdf")
self.build_vector_db()
def load_pdf(self, file_path: str) -> None:
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:
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]:
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 and compassionate dentist. You always greet patients warmly and provide clear, concise, and helpful information about dental care. You answer one question at a time, ensuring that your responses are easy to understand and informative. Remember to be respectful, patient, and empathetic, considering that patients may be anxious or in pain. You guide patients through dental procedures, offer advice on oral hygiene, and provide recommendations for common dental issues. If a patient mentions severe pain or an emergency situation, you advise them to contact their dentist immediately or go to the nearest emergency room. Your goal is to help patients maintain good oral health and feel comfortable during their dental visits.
"""
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})
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=max_tokens,
stream=True,
temperature=temperature,
top_p=top_p,
):
token = message.choices[0].delta.content
response += token
yield response
demo = gr.Blocks()
with demo:
gr.Markdown("🦷 **Ask Your Dentist**")
gr.Markdown(
"‼️Disclaimer: This chatbot provides general dental information and should not be considered as professional medical advice. For specific dental concerns, please consult your dentist directly.‼️"
)
chatbot = gr.ChatInterface(
respond,
examples=[
["What should I do about a toothache?"],
["Can you explain the process of getting a dental implant?"],
["How often should I get my teeth cleaned?"],
["What are the best practices for maintaining oral hygiene?"],
["Can you tell me about the benefits of fluoride?"],
["I'm experiencing sensitivity in my teeth. What could be the cause?"],
["What should I do if I have a dental emergency?"],
["How can I prevent cavities?"]
],
title='Ask Your Dentist 🦷'
)
if __name__ == "__main__":
demo.launch()