Spaces:
Running
Running
from langchain_community.document_loaders import PyPDFLoader | |
from langchain_community.embeddings import HuggingFaceBgeEmbeddings | |
from langchain.storage import LocalFileStore | |
from langchain.embeddings import CacheBackedEmbeddings | |
from langchain_community.vectorstores import FAISS | |
from langchain_groq import ChatGroq | |
from langchain_core.runnables import RunnablePassthrough | |
from langchain_core.prompts import ChatPromptTemplate | |
from langchain_core.output_parsers import StrOutputParser | |
import streamlit as st | |
import os | |
import shutil | |
from dotenv import load_dotenv | |
from streamlit_chat import message | |
load_dotenv() | |
os.environ['GROQ_API_KEY'] = os.getenv('GROQ_API') | |
os.environ["LANGCHAIN_TRACING_V2"] = "true" | |
os.environ["LANGCHAIN_API_KEY"] = os.getenv('LANGSMITH_API') | |
UPLOAD_DIR = "uploaded_files" | |
def cleanup_files(): | |
if os.path.isdir(UPLOAD_DIR): | |
shutil.rmtree(UPLOAD_DIR, ignore_errors=True) | |
if 'file_handle' in st.session_state: | |
st.session_state.file_handle.close() | |
if 'cleanup_done' not in st.session_state: | |
st.session_state.cleanup_done = False | |
if not st.session_state.cleanup_done: | |
cleanup_files() | |
if not os.path.exists(UPLOAD_DIR): | |
os.makedirs(UPLOAD_DIR) | |
st.title("Chat with Your PDF!!") | |
uploaded_file = st.file_uploader("Upload a file") | |
if uploaded_file is not None: | |
file_path = os.path.join(UPLOAD_DIR, uploaded_file.name) | |
file_path = os.path.abspath(file_path) | |
with open(file_path, 'wb') as f: | |
f.write(uploaded_file.getbuffer()) | |
st.write("You're Ready For a Chat with your PDF") | |
docs = PyPDFLoader(file_path).load_and_split() | |
embedding = HuggingFaceBgeEmbeddings( | |
model_name='BAAI/llm-embedder', | |
) | |
store = LocalFileStore("./cache/") | |
cached_embedder = CacheBackedEmbeddings.from_bytes_store( | |
embedding, store, namespace='embeddings' | |
) | |
vector_base = FAISS.from_documents( | |
docs, | |
embedding | |
) | |
template = '''You are an Experienced Business Person Having a | |
great Knowledge About Various Types of Business Activities | |
but here you are hired to Give the answers to the {question} only based on {context} | |
.if you are unaware of the question Just reply it with I\'m Unaware of your Query. | |
Use three sentences maximum and keep the answer concise.''' | |
prompt = ChatPromptTemplate.from_template(template) | |
retriever = vector_base.as_retriever() | |
llm = ChatGroq( | |
model='mixtral-8x7b-32768', | |
temperature=0, | |
) | |
if 'history' not in st.session_state: | |
st.session_state.history = [] | |
query = st.text_input("Enter your question") | |
if st.button("Submit !"): | |
if query: | |
chain = ( | |
{'context': retriever, 'question': RunnablePassthrough()} | |
| prompt | llm | StrOutputParser() | |
) | |
answer = chain.invoke(query) | |
st.session_state.history.append({'question': query, 'answer': answer}) | |
if st.session_state.history: | |
st.write("### Previous Questions and Answers") | |
for idx, entry in enumerate(st.session_state.history): | |
message(f"**Q{idx + 1}:** {entry['question']}", is_table=True, key=f"question_{idx}",avatar_style='no-avatar') | |
message(f"**A{idx + 1}:** {entry['answer']}", is_table=True, key=f"answer_{idx}",avatar_style='no-avatar') | |
if st.session_state.cleanup_done: | |
cleanup_files() | |