RAG_XP / app.py
peterciank's picture
Update app.py
ed879c1 verified
import streamlit as st
from llama_index.core import StorageContext, load_index_from_storage, VectorStoreIndex, SimpleDirectoryReader, ChatPromptTemplate
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
from dotenv import load_dotenv
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
import os
import base64
# Load environment variables
load_dotenv()
# Configure the Llama index settings
Settings.llm = HuggingFaceInferenceAPI(
model_name="google/gemma-1.1-7b-it",
tokenizer_name="google/gemma-1.1-7b-it",
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"
DATA_DIR = "data"
# Ensure data directory exists
os.makedirs(DATA_DIR, exist_ok=True)
os.makedirs(PERSIST_DIR, exist_ok=True)
def displayPDF(file):
with open(file, "rb") as f:
base64_pdf = base64.b64encode(f.read()).decode('utf-8')
pdf_display = f'<iframe src="data:application/pdf;base64,{base64_pdf}" width="100%" height="600" type="application/pdf"></iframe>'
st.markdown(pdf_display, unsafe_allow_html=True)
def data_ingestion():
documents = SimpleDirectoryReader(DATA_DIR).load_data()
storage_context = StorageContext.from_defaults()
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir=PERSIST_DIR)
def handle_query(query):
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
index = load_index_from_storage(storage_context)
chat_text_qa_msgs = [
(
"user",
"""You are a Scrum Master Q&A assistant named Scrummy, created by Pedro.
You will answer specific questions based on the knowledge provided by the user.
In the case you don't have answers, your response will be that the information provided does not contain the answer.
In the case the user is asking about your creator, your response is:
"You were created by Pedro, an AI enthusiast. He is an specialist on solving complex problems, delivering innovative solutions and creating high performing organizations.
With a strong focus on digital product management, Agile Delivery and AI, Pedro is passionate about pushing innovation forward with technology and leadership."
For all other inquiries, your main goal is to provide answers as accurately as possible, based on the instructions and context you have been given.
If a question does not match the provided context or is outside the scope of the document, kindly advise the user to ask questions within the context of the document.
Context:
{context_str}
Question:
{query_str}
"""
)
]
text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs)
query_engine = index.as_query_engine(text_qa_template=text_qa_template)
answer = query_engine.query(query)
if hasattr(answer, 'response'):
return answer.response
elif isinstance(answer, dict) and 'response' in answer:
return answer['response']
else:
return "Sorry, I couldn't find an answer with the information provided."
# Streamlit app initialization
st.title("RAG XP - Experiment 1 - Gemma")
st.markdown("Retrieval-Augmented Generation")
st.markdown("Start conversation...")
if 'messages' not in st.session_state:
st.session_state.messages = [{'role': 'assistant', "content": 'Hey! Upload a PDF and ask me anything about its content.'}]
with st.sidebar:
st.title("Menu:")
uploaded_file = st.file_uploader("Upload your PDF File (1) and Click on the Send & Embed Button")
if st.button("Send & Embed"):
with st.spinner("Embedding..."):
filepath = "data/saved_pdf.pdf"
with open(filepath, "wb") as f:
f.write(uploaded_file.getbuffer())
# displayPDF(filepath) # Display the uploaded PDF
data_ingestion() # Process PDF every time new file is uploaded
st.success("Embedding Complete")
user_prompt = st.chat_input("Ask me anything about the PDF content:")
if user_prompt:
st.session_state.messages.append({'role': 'user', "content": user_prompt})
response = handle_query(user_prompt)
st.session_state.messages.append({'role': 'assistant', "content": response})
for message in st.session_state.messages:
with st.chat_message(message['role']):
st.write(message['content'])