import streamlit as st
from streamlit_option_menu import option_menu
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceBgeEmbeddings
from qdrant_client import QdrantClient
from langchain_huggingface import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
# Initialize the embeddings model
model_name = "BAAI/bge-large-en"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
embeddings = HuggingFaceBgeEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
# Initialize the Qdrant client
url = "http://localhost:6333"
client = QdrantClient(
url=url, prefer_grpc=False
)
# Initialize the Qdrant database
db = Qdrant(client=client, embeddings=embeddings, collection_name="books")
# Load the Hugging Face model and tokenizer
model_id = "FPHam/Free_Sydney_13b_HF"
model = AutoModelForCausalLM.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=100)
hf = HuggingFacePipeline(pipeline=pipe)
# Streamlit app
st.title("BookFinder: Autonomous LLM-based Book Recommendation Agent")
with st.sidebar:
st.markdown("
Welcome
", unsafe_allow_html=True)
page = option_menu(
"Navigation",
["Home", "Generate Response", "Contact Us"],
icons=["house", "search", "envelope"],
menu_icon="cast",
default_index=0,
)
st.sidebar.success("This app demonstrates Retrieval-Augmented Generation (RAG) using the Hugging Face Open Source Model.")
st.sidebar.warning("Developed by [Harsh Kumawat](https://www.linkedin.com/in/harsh-k04/)")
if page == "Home":
col1, col2, col3 = st.columns([1, 2, 1])
with col2:
st.image("img.jpeg", width=600, caption="RAG with LLM", use_column_width=True) # Replace with a valid image URL
st.subheader("Home")
st.success("Retrieval-Augmented Generation (RAG) using the Hugging Face Open Source Model.")
st.write("Welcome to the Chat application. Select 'Generate Response' from the menu to get started.")
st.write("Using cutting-edge AI technology, BookFinder is an independent LLM-based book recommendation agent. By utilizing cutting-edge models like the Open Source Model from Hugging Face and the BGE-Large-EN embeddings from BAAI, BookFinder provides an advanced retrieval-augmented generation (RAG) capacity. Through a conversational chat interface, users may interact with BookFinder and receive tailored book suggestions based on their inquiries. Semantic search and deep learning models are easily integrated by the application to deliver precise and contextually relevant results. BookFinder was created with the user in mind, combining the effectiveness of AI-driven recommendation algorithms with natural user interfaces to improve the book discovery experience.")
elif page == "Generate Response":
st.subheader("Start Chatting with the Assistant")
if "messages" not in st.session_state:
st.session_state.messages = [
{"role": "assistant", "content": "Hello! How can I assist you today?"}
]
# Display all messages
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Chat input
if prompt := st.chat_input("Say something"):
# Add user message to session state
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
with st.spinner("Generating response..."):
# Perform a semantic search
docs = db.similarity_search_with_score(query=prompt, k=5)
# Prepare the context for the Hugging Face model
context = "\n".join([doc.page_content for doc, score in docs])
# Generate a response using the Hugging Face model
response = hf.invoke(f"Using the following context,{prompt}:\n{context}")
# Debug: Print response to understand its structure
st.write("Debugging response structure:", response)
# Extract the generated text from the response
if isinstance(response, list) and len(response) > 0:
if 'generated_text' in response[0]:
full_response = response[0]['generated_text']
else:
full_response = str(response[0]) # onvert to string for safety
else:
full_response = "Error: Unexpected response format."
message_placeholder.markdown(full_response + "▌")
message_placeholder.markdown(full_response)
st.session_state.messages.append({"role": "assistant", "content": full_response})
if st.button("End Chat"):
st.session_state.messages.append({"role": "assistant", "content": "Thank you for using the BookFinder application. Have a great day!"})
st.write("Thank you for using the BookFinder application. Have a great day!")
st.stop() # Stop the script to prevent further input
elif page == "Contact Us":
st.markdown("***")
st.header("Contact Me")
st.write("Please fill out the form below to get in touch with me.")
# Input fields for user's name, email, and message
name = st.text_input("Your Name")
email = st.text_input("Your Email")
message = st.text_area("Message", height=150)
# Submit button
if st.button("Submit"):
if name.strip() == "" or email.strip() == "" or message.strip() == "":
st.warning("Please fill out all the fields.")
else:
send_email_to = 'kumawatharsh2004@gmail.com'
st.success("Your message has been sent successfully!")