|
from dotenv import load_dotenv |
|
import gradio as gr |
|
import os |
|
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() |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
PERSIST_DIR = "db" |
|
PDF_DIRECTORY = 'data' |
|
|
|
|
|
os.makedirs(PDF_DIRECTORY, exist_ok=True) |
|
os.makedirs(PERSIST_DIR, exist_ok=True) |
|
|
|
|
|
current_chat_history = [] |
|
|
|
def data_ingestion_from_directory(): |
|
|
|
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 now the RedFerns Tech chatbot. Your aim is to provide answers to the user based on the conversation flow only. |
|
{context_str} |
|
Question: |
|
{query_str} |
|
""" |
|
) |
|
] |
|
text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs) |
|
|
|
|
|
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR) |
|
index = load_index_from_storage(storage_context) |
|
|
|
|
|
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, I couldn't find an answer." |
|
|
|
|
|
current_chat_history.append((query, response)) |
|
|
|
return response |
|
|
|
|
|
print("Processing PDF ingestion from directory:", PDF_DIRECTORY) |
|
data_ingestion_from_directory() |
|
|
|
|
|
def predict(message,history): |
|
response = handle_query(message) |
|
return response |
|
|
|
|
|
css = ''' |
|
/* Style the chat container */ |
|
.gradio-container { |
|
display: flex; |
|
flex-direction: column; |
|
width: 450px; |
|
margin: 0 auto; |
|
padding: 20px; |
|
border: 1px solid #ddd; |
|
border-radius: 10px; |
|
background-color: #fff; |
|
box-shadow: 0 4px 8px rgba(0,0,0,0.1); |
|
position: relative; |
|
} |
|
|
|
/* Style the logo and title container */ |
|
.gradio-header { |
|
display: flex; |
|
align-items: center; |
|
margin-bottom: 20px; |
|
padding-bottom: 10px; |
|
border-bottom: 1px solid #ddd; |
|
} |
|
|
|
.gradio-logo img { |
|
height: 50px; |
|
margin-right: 10px; |
|
} |
|
|
|
.gradio-title { |
|
font-weight: bold; |
|
font-size: 24px; |
|
color: #4A90E2; |
|
} |
|
|
|
/* Style the chat history */ |
|
.gradio-chat-history { |
|
flex: 1; |
|
overflow-y: auto; |
|
padding: 15px; |
|
background-color: #f9f9f9; |
|
border-radius: 5px; |
|
margin-bottom: 10px; |
|
max-height: 500px; /* Increase the height of the chat history */ |
|
} |
|
|
|
/* Style the chat messages */ |
|
.gradio-message { |
|
margin-bottom: 15px; |
|
display: flex; |
|
flex-direction: column; /* Stack messages vertically */ |
|
} |
|
|
|
.gradio-message.user .gradio-message-content { |
|
background-color: #E1FFC7; |
|
align-self: flex-end; |
|
border: 1px solid #c3e6cb; |
|
border-radius: 15px 15px 0 15px; |
|
padding: 10px; |
|
font-size: 16px; |
|
margin-bottom: 5px; |
|
max-width: 80%; |
|
} |
|
|
|
.gradio-message.bot .gradio-message-content { |
|
background-color: #fff; |
|
align-self: flex-start; |
|
border: 1px solid #ced4da; |
|
border-radius: 15px 15px 15px 0; |
|
padding: 10px; |
|
font-size: 16px; |
|
margin-bottom: 5px; |
|
max-width: 80%; |
|
} |
|
|
|
.gradio-message-content { |
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|
} |
|
|
|
/* Style the user input field */ |
|
.gradio-chat-input { |
|
display: flex; |
|
border: 1px solid #ddd; |
|
border-radius: 20px; |
|
padding: 10px; |
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|
background-color: #fff; |
|
} |
|
|
|
.gradio-chat-input input { |
|
width: 100%; |
|
padding: 10px; |
|
border: none; |
|
outline: none; |
|
font-size: 16px; |
|
border-radius: 20px; |
|
} |
|
|
|
.gradio-chat-input button { |
|
padding: 10px 15px; |
|
background-color: #4A90E2; |
|
border: none; |
|
border-radius: 20px; |
|
color: white; |
|
font-size: 16px; |
|
cursor: pointer; |
|
margin-left: 10px; |
|
} |
|
|
|
.gradio-chat-input button:hover { |
|
background-color: #357ABD; |
|
} |
|
|
|
/* Remove Gradio footer */ |
|
footer { |
|
display: none !important; |
|
} |
|
''' |
|
|
|
|
|
header_html = ''' |
|
<div class="gradio-header"> |
|
<div class="gradio-logo"> |
|
<img src="https://redfernstech.com/wp-content/uploads/2024/05/RedfernsLogo_FinalV1.0-3-2048x575.png" alt="Company Logo"> |
|
</div> |
|
<div class="gradio-title">RedFerns Tech</div> |
|
</div> |
|
''' |
|
|
|
|
|
with gr.Blocks(css=css) as demo: |
|
gr.HTML(header_html) |
|
gr.ChatInterface(predict) |
|
|
|
|
|
demo.launch() |
|
|
|
|
|
|