File size: 8,403 Bytes
522071e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e75e2c
522071e
2e75e2c
522071e
 
 
2e75e2c
522071e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e75e2c
522071e
2e75e2c
522071e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b08b384
1e5ab8d
 
 
 
522071e
 
2e75e2c
522071e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b08b384
522071e
b08b384
522071e
 
b08b384
 
2e75e2c
 
522071e
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# 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

# 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-small-en-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 = []

# 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 Respiratory Health Solutions chatbot. Your goal is to provide accurate, evidence-based, and helpful answers to user queries about managing, preventing, and understanding a range of respiratory diseases, including Atelectasis, Consolidation, Infiltration, Pneumothorax, Edema, Emphysema, Fibrosis, Effusion, Pneumonia, Pleural Thickening, Cardiomegaly, Nodule Mass, and Hernia. Ensure your responses are clear, actionable, and tailored to each user's question, focusing on practical guidance, treatment options, and preventive measures based on the latest medical information available.
#             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, 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="Hey I Am ChestDiseaseCyclopedia, Ask me anything about diseases..."
# )

# output_component = gr.Textbox()

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

# # Create the Gradio interface
# interface = gr.Interface(
#     fn=chatbot_handler,
#     inputs=input_component,
#     outputs=output_component,
#     title="Welcome to Disease Solutions",
#     description="I am here to assist you with any questions you have about disease Prevention. How can I help you today?"
# )

# # Launch the Gradio interface
# interface.launch()



import gradio as gr
import os
from langchain_groq import ChatGroq
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import create_retrieval_chain
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain_huggingface import HuggingFaceEmbeddings

from dotenv import load_dotenv
load_dotenv()

# --- Initialize LLM
groq_api_key = "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"
llm = ChatGroq(groq_api_key=groq_api_key, model_name="meta-llama/llama-4-scout-17b-16e-instruct")

# --- Prompt Template
prompt = ChatPromptTemplate.from_template(
    """
    You are the Respiratory Health Solutions chatbot. Your goal is to provide accurate, evidence-based, and helpful answers to user queries about managing, preventing, and understanding a range of respiratory diseases, including Atelectasis, Consolidation, Infiltration, Pneumothorax, Edema, Emphysema, Fibrosis, Effusion, Pneumonia, Pleural Thickening, Cardiomegaly, Nodule Mass, and Hernia. Ensure your responses are clear, actionable, and tailored to each user's question, focusing on practical guidance, treatment options, and preventive measures based on the latest medical information available.
    <context>
    {context}
    <context>
    Question:{input}
    """
)

# --- Build the vector DB at startup
def load_embeddings():
    embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
    loader = PyPDFDirectoryLoader("data")
    docs = loader.load()
    
    if not docs:
        raise ValueError("No PDF documents found in the 'data/' directory.")

    splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    final_docs = splitter.split_documents(docs[:50])
    
    if not final_docs:
        raise ValueError("Text splitting returned no valid document chunks.")

    return FAISS.from_documents(final_docs, embeddings)

# --- Prepare retriever and chain
vector_store = load_embeddings()
retriever = vector_store.as_retriever()
document_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever, document_chain)

# --- Gradio inference function
def chat_with_clara(query):
    if not query.strip():
        return "Please enter a valid question."

    response = retrieval_chain.invoke({'input': query})
    answer = response['answer']
    
    docs = response.get('context', [])
    similar_chunks = "\n\n".join([f"• {doc.page_content[:300]}..." for doc in docs])

    return answer, similar_chunks or "No similar document chunks found."

# --- Launch Gradio Interface
iface = gr.Interface(
    fn=chat_with_clara,
    inputs=gr.Textbox(label="Ask ChestDiseaseCyclopedia ", placeholder="Hey I Am ChestDiseaseCyclopedia, Ask me anything about diseases..."),
    outputs=[
        gr.Textbox(label="ChestDiseaseCyclopedia's Answer"),
        gr.Textbox(label="Similar Document Context (from PDFs)", lines=6)
    ],
    title="Welcome to Disease Solutions",
    description="I am here to assist you with any questions you have about disease Prevention. How can I help you today?" 
)

iface.launch()