Spaces:
Running
Running
File size: 5,290 Bytes
b39298d 6f4225b 8a9cc5d 53a56c8 b39298d a5b1980 53a56c8 6fc35ba 6f4225b dcbf46f 53a56c8 6f4225b a5b1980 dcbf46f 6f4225b b39298d 6f4225b b39298d 6f4225b b39298d 6f4225b 030c076 6f4225b 53a56c8 6f4225b b39298d 53a56c8 a5b1980 53a56c8 a5b1980 53a56c8 a5b1980 53a56c8 8a9cc5d a5b1980 8a9cc5d a5b1980 8a9cc5d 6f4225b a5b1980 6f4225b 6fc35ba 6f4225b 53a56c8 a5b1980 6fc35ba 53a56c8 6fc35ba 53a56c8 6fc35ba 53a56c8 1d758a2 53a56c8 8dca813 34ef943 a5b1980 1d758a2 8bae51a 3dfb1ed 1d758a2 29f9704 53a56c8 5454d65 53a56c8 1d758a2 030c076 8a9cc5d 1d758a2 a5b1980 8a9cc5d 74da2db 8a9cc5d 030c076 1d758a2 030c076 53a56c8 63c3a41 1d758a2 53a56c8 5454d65 1d758a2 53a56c8 5454d65 53a56c8 1c63611 |
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 |
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 llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
from youtube_transcript_api import YouTubeTranscriptApi
import shutil
import os
import time
icons = {"assistant": "robot.png", "user": "man-kddi.png"}
# Configure the Llama index settings
Settings.llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mistral-7B-Instruct-v0.2",
tokenizer_name="mistralai/Mistral-7B-Instruct-v0.2",
context_window=3900,
token=os.getenv("HF_TOKEN"),
# max_new_tokens=1000,
generate_kwargs={"temperature": 0},
)
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 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 remove_old_files():
# Specify the directory path you want to clear
directory_path = "data"
# Remove all files and subdirectories in the specified directory
shutil.rmtree(directory_path)
# Recreate an empty directory if needed
os.makedirs(directory_path)
def extract_transcript_details(youtube_video_url):
try:
video_id=youtube_video_url.split("=")[1]
transcript_text=YouTubeTranscriptApi.get_transcript(video_id)
transcript = ""
for i in transcript_text:
transcript += " " + i["text"]
return transcript
except Exception as e:
st.error(e)
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 Q&A assistant named CHATTO, created by Pachaiappan [linkdin](https://www.linkedin.com/in/pachaiappan) an AI Specialist. 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, you only say the user to 'Please ask a 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."
def streamer(text):
for i in text:
yield i
time.sleep(0.001)
# Streamlit app initialization
st.title("Chat with your PDF📄")
st.markdown("**Built by [Pachaiappan❤️](https://mr-vicky-01.github.io/Portfolio/)**")
if 'messages' not in st.session_state:
st.session_state.messages = [{'role': 'assistant', "content": 'Hello! Upload a PDF/Youtube Video link and ask me anything about the content.'}]
for message in st.session_state.messages:
with st.chat_message(message['role'], avatar=icons[message['role']]):
st.write(message['content'])
with st.sidebar:
st.title("Menu:")
uploaded_file = st.file_uploader("Upload your PDF Files and Click on the Submit & Process Button")
video_url = st.text_input("Enter Youtube Video Link: ")
if st.button("Submit & Process"):
with st.spinner("Processing..."):
if len(os.listdir("data")) !=0:
remove_old_files()
if uploaded_file:
filepath = f"data/{uploaded_file.name}"
print(filepath)
with open(filepath, "wb") as f:
f.write(uploaded_file.getbuffer())
if video_url:
extracted_text = extract_transcript_details(video_url)
with open("data/saved_text.txt", "w") as file:
file.write(extracted_text)
data_ingestion() # Process PDF every time new file is uploaded
st.success("Done")
user_prompt = st.chat_input("Ask me anything about the content of the PDF:")
if user_prompt and (uploaded_file or video_url):
st.session_state.messages.append({'role': 'user', "content": user_prompt})
with st.chat_message("user", avatar="man-kddi.png"):
st.write(user_prompt)
# Trigger assistant's response retrieval and update UI
with st.spinner("Thinking..."):
response = handle_query(user_prompt)
with st.chat_message("user", avatar="robot.png"):
st.write_stream(streamer(response))
st.session_state.messages.append({'role': 'assistant', "content": response}) |