mohammednouman's picture
Update app.py
15e614f verified
import io
import os
import streamlit as st
from dotenv import load_dotenv
from PyPDF2 import PdfReader
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.llms import OpenAI
import openai
import random
# Load environment variables
load_dotenv()
openai_api_key = os.getenv('OPENAI_API_KEY')
openai.api_key = openai_api_key
# Initialize Streamlit session states
if 'vectorDB' not in st.session_state:
st.session_state.vectorDB = None
# Function to extract text from a PDF file
def get_pdf_text(pdf):
text = ""
pdf_reader = PdfReader(pdf)
for page in pdf_reader.pages:
text += page.extract_text()
return text
def get_text_chunks(text: str):
# This function will split the text into smaller chunks
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=100,
length_function=len,
is_separator_regex=False,
)
chunks = text_splitter.split_text(text)
return chunks
def get_vectorstore(text_chunks):
# This function will create a vector database as well as create and store the embedding of the text chunks into the VectorDB
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
return vectorstore
def search_vectorstore(vectorDB, query):
# This function searches for specific data or content in the vector database
# Specify the search type
search_type = 'similarity'
search_results = vectorDB.search(query, search_type=search_type)
return search_results
def generate_quiz_questions(search_results, num_questions):
# Generate quiz questions with options using GPT-3.5-turbo-16k based on the search results
st.header(f"Quiz Generator: {quiz_name}")
st.subheader(f"Topic: {quiz_topic}")
# Process PDF and create vector database
if st.button('Generate Quiz'):
st.session_state['vectorDB'] = (pdf_content)
# Placeholder for quiz questions
quiz_questions = []
# Generate questions using GPT-3.5-turbo-16k with the correct endpoint
for i in range(num_questions):
prompt = f"As a highly intelligent and powerful quiz generator, your task is to Generate a different multiple-choice question and correct answer in a comprehensive and accurate format for the same related to:\n- {random.choice(search_results)} and the response generated by you should be comprehensive and relevant to the topic specified, you should not generate the same content multiple times in a single response, generate the explaination for each correct answer"
# Prepare messages
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt},
]
# Generate questions using GPT-3.5-turbo-16k with the correct endpoint
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k",
messages=messages,
max_tokens=200,
n=num_questions,
stop=None,
temperature=0.7,
)
# Extract the generated question from the response
question = response['choices'][0]['message']['content'].strip()
correct_answer = f"Correct Answer: {random.choice(search_results)}"
# Generate options (3 incorrect + 1 correct)
correct_option = f"Correct: {random.choice(search_results)}"
incorrect_options = [f"Incorrect: {random.choice(search_results)}" for _ in range(3)]
options = incorrect_options + [correct_option]
# Shuffle the options to randomize the order
random.shuffle(options)
# Append question and options to the quiz_questions list
quiz_questions.append((question, options, correct_answer))
# Display quiz questions with options
st.write('Quiz Questions:')
for i, (question, options, correct_answer) in enumerate(quiz_questions, 1):
st.write(f"{i}. {question}")
correct_option = [opt for opt in options if opt.startswith('Correct')][0]
if __name__ == '__main__':
st.set_page_config(page_title="CB Quiz Generator", page_icon="📝")
st.title('🤖CB Quiz Generator🧠')
# User inputs
quiz_name = st.text_input('Enter Quiz Name:')
quiz_topic = st.text_input('Enter Quiz Topic:')
num_questions = st.number_input('Enter Number of Questions:', min_value=1, value=5, step=1)
pdf_content = st.file_uploader("Upload PDF Content for Questions:", type='pdf')
# Generate quiz if all inputs are provided
if quiz_name and quiz_topic and num_questions and pdf_content:
# Process PDF and create vector database
vectorDB = get_vectorstore(get_text_chunks(get_pdf_text(pdf_content)))
# Searching for a specific query in the vector database
if quiz_topic:
search_results = search_vectorstore(vectorDB, quiz_topic)
# Generate quiz questions with options using GPT-3.5-turbo-16k based on the search results
generate_quiz_questions(search_results, num_questions)
else:
st.error('Please provide a topic to search for!')