File size: 5,271 Bytes
faa1a3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15e614f
faa1a3c
 
 
 
 
 
 
 
 
 
15e614f
faa1a3c
 
 
 
 
15e614f
faa1a3c
 
 
 
 
 
15e614f
faa1a3c
 
15e614f
 
 
faa1a3c
 
 
 
 
 
15e614f
faa1a3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15e614f
faa1a3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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!')