File size: 5,661 Bytes
ad40e72
 
83436b6
ad40e72
0bc03e1
ad40e72
 
0388786
ad40e72
dfd8177
 
 
35dae8f
dfd8177
 
 
 
 
 
 
 
ad40e72
 
 
 
01e9056
 
ad40e72
 
 
 
 
 
01e9056
ad40e72
 
 
 
 
 
 
 
 
 
 
 
 
26d7ce5
c377671
3c35e3b
ad40e72
 
 
 
 
 
 
 
 
 
 
 
695545c
ad40e72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
695545c
ad40e72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7010e96
d9dd1aa
ad40e72
 
 
 
 
 
 
7a35f23
83436b6
 
ad40e72
 
 
 
 
 
d9dd1aa
695545c
dfd8177
695545c
 
 
 
 
 
 
 
 
 
 
ad40e72
 
 
 
 
7a35f23
dfd8177
695545c
 
ad40e72
83436b6
ad40e72
695545c
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import os
from dotenv import load_dotenv
import gradio as gr
from llama_index.core import StorageContext, load_index_from_storage, VectorStoreIndex, SimpleDirectoryReader, ChatPromptTemplate, Settings
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from sentence_transformers import SentenceTransformer
import spaces

MARKDOWN = """
This demo utilizes <a href="https://huggingface.co/meta-llama">LLaMA 3 8B Instructor Model</a> by Meta LLaMA.

Furthermore, the feature extraction is performed using <a href="https://huggingface.co/BAAI/bge-large-zh-v1.5"> BGE Model Series </a> by BAAI.

I am looking for more specific data to refine the responses of the chatbot, so if any specialist wants to collaborate, you are welcome to do so. My details are provided below.

**Demo by [Sunder Ali Khowaja](https://sander-ali.github.io) - [X](https://x.com/SunderAKhowaja) -[Github](https://github.com/sander-ali) -[Hugging Face](https://huggingface.co/SunderAli17)**

**The Savior Bot is here to assist you with any questions you have about Heart Disease Preventions. How can the Savior Bot help you?"**
"""

load_dotenv()

# Configure the Llama index settings
Settings.llm = HuggingFaceInferenceAPI(
    model_name="meta-llama/Meta-Llama-3-8B-Instruct",
    tokenizer_name="meta-llama/Meta-Llama-3-8B-Instruct",
    context_window=3000,
    token=os.getenv("HF_TOKEN"),
    max_new_tokens=512,
    generate_kwargs={"temperature": 0.1},
)
Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-large-zh-v1.5"
)

# Define the directory for persistent storage and data
PERSIST_DIR = "db"
PDF_DIRECTORY = 'data'  # Changed to the directory containing PDFs

# Ensure directories exist
os.makedirs(PDF_DIRECTORY, exist_ok=True)
os.makedirs(PERSIST_DIR, exist_ok=True)

# Variable to store current chat conversation
current_chat_history = []

#@spaces.GPU


def data_ingestion_from_directory():
    # Use SimpleDirectoryReader on the directory containing the PDF files
    documents = SimpleDirectoryReader(PDF_DIRECTORY).load_data()
    storage_context = StorageContext.from_defaults()
    index = VectorStoreIndex.from_documents(documents)
    index.storage_context.persist(persist_dir=PERSIST_DIR)

def handle_query(query):
    chat_text_qa_msgs = [
        (
            "user",
            """
            You are the Savior Bot. Your goal is to provide accurate, preventions, and helpful answers to user queries based on the available data. Always ensure your responses are clear and concise. 
    
            Context:
            {context_str}
    
            Question:
            {query_str}
            """
        )
    ]

    text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs)

    # Load index from storage
    storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
    index = load_index_from_storage(storage_context)

    # Use chat history to enhance response
    context_str = ""
    for past_query, response in reversed(current_chat_history):
        if past_query.strip():
            context_str += f"User asked: '{past_query}'\nBot answered: '{response}'\n"

    query_engine = index.as_query_engine(text_qa_template=text_qa_template, context_str=context_str)
    answer = query_engine.query(query)

    if hasattr(answer, 'response'):
        response = answer.response
    elif isinstance(answer, dict) and 'response' in answer:
        response = answer['response']
    else:
          response = "Sorry, SAK solutions are trying to improve my knowledge further, however, as per my current knowledge I am unable to answer this question. Is there anything else I can help you with?"

    # Remove sensitive information and unwanted sections from the response
    sensitive_keywords = [PERSIST_DIR, PDF_DIRECTORY, "/", "\\", ".pdf", ".doc", ".txt"]
    for keyword in sensitive_keywords:
        response = response.replace(keyword, "")

    # Remove sections starting with specific keywords
    unwanted_sections = ["Page Label","Page Label:","page_label","page_label:","file_path:","file_path",]
    for section in unwanted_sections:
        if section in response:
            response = response.split(section)[0]

    # Additional cleanup for any remaining artifacts from replacements
    response = ' '.join(response.split())

    # Update current chat history
    current_chat_history.append((query, response))

    return response



# Example usage: Process PDF ingestion from directory
print("Processing PDF ingestion from directory:", PDF_DIRECTORY)
data_ingestion_from_directory()

# Define the input and output components for the Gradio interface
input_component = gr.Textbox(
    show_label=False,
    placeholder="Savior Bot is at your service ... Let me know what you are feeling"
)

output_component = gr.Textbox()

# Function to handle queries
def chatbot_handler(query):
    response = handle_query(query)
    return response

theme = gr.themes.Soft(
    font=[gr.themes.GoogleFont('Bree Serif'), gr.themes.GoogleFont('Public Sans'), 'system-ui', 'sans-serif'],
)
js_func = """
function refresh() {
    const url = new URL(window.location);
    if (url.searchParams.get('__theme') !== 'dark') {
        url.searchParams.set('__theme', 'dark');
        window.location.href = url.href;
    }
}
"""

# Create the Gradio interface
interface = gr.Interface(
    fn=chatbot_handler,
    inputs=input_component,
    outputs=output_component,
    title="Welcome to SAK solutions",
    description=MARKDOWN,
    theme = theme,
    js = js_func
)

# Launch the Gradio interface
interface.launch(share=True)