Spaces:
Sleeping
Sleeping
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!')
|