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!')