llmquiz / app.py
mohammed3536's picture
Update app.py
341d0da verified
import PyPDF2
import nltk
import random
import streamlit as st
from openai import OpenAI
from dotenv import load_dotenv
import os
# Download NLTK data (if not already downloaded)
nltk.download('punkt')
# load the environment variables into the python script
load_dotenv()
# fetching the openai_api_key environment variable
openai_api_key = os.getenv('OPENAI_API_KEY')
def extract_text_from_pdf(pdf_file):
pdf_reader = PyPDF2.PdfReader(pdf_file)
text = ""
for page_num in range(len(pdf_reader.pages)):
text += pdf_reader.pages[page_num].extract_text()
return text
def generate_mcqs_on_topic(text, topic, num_mcqs=5):
# Tokenize the text into sentences
sentences = nltk.sent_tokenize(text)
# Randomly select sentences to create Questions
selected_sentences = random.sample(sentences, min(num_mcqs, len(sentences)))
mcqs = []
for sentence in selected_sentences:
# Use ChatGPT for interactive question generation
chatgpt_question = generate_question_with_chatgpt(sentence, topic)
mcqs.append(chatgpt_question)
print(mcqs)
return mcqs
def extract_options_and_correct_answer(api_response):
if 'choices' in api_response:
choices = api_response['choices']
if isinstance(choices, list) and choices: # Check if 'choices' is a non-empty list
message = choices[0].get('message', {})
content = message.get('content', "Unable to generate a question..")
options = message.get('options', [])
correct_answer = message.get('correct_answer', "Unknown")
return content, options, correct_answer
return "Unexpected API response format.", [], "Unknown"
def generate_question_with_chatgpt(context, topic):
client = OpenAI()
# Initializing the default value
generated_question = {
'content': "Unable to generate a question..",
'options': [], # assuming options is a list
'correct_answer': "Unknown"
}
result = client.chat.completions.create(
model="gpt-3.5-turbo",
max_tokens=1024,
temperature=0.7,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"What is the question on {topic} for the following? {context}"},
]
)
print("API Response:", result) # Print the API response for debugging
# Modify the logic based on the actual structure of the 'result'
if 'choices' in result:
choices = result['choices']
if isinstance(choices, list) and choices:
choice = choices[0]
if 'message' in choice and isinstance(choice['message'], dict):
message = choice['message']
content = message.get('content')
if content:
options = message.get('options', [])
correct_answer = message.get('correct_answer', "Unknown")
generated_question['content'] = content
generated_question['options'] = options if isinstance(options, list) else []
generated_question['correct_answer'] = correct_answer
return generated_question
def main():
# Title of the Application
st.header("🤖CB Quiz Generator🧠", divider='rainbow')
st.subheader("☕CoffeeBeans☕")
# User input
pdf_file = st.file_uploader("Upload PDF Document:", type=["pdf"])
num_mcqs = st.number_input("Enter Number of MCQs to Generate:", min_value=1, step=1, value=5)
topic = st.text_input("Enter the Topic in which the quiz has to be generated")
# Button to trigger QUIZ generation
if st.button("Generate Quiz"):
if pdf_file:
text = extract_text_from_pdf(pdf_file)
mcqs = generate_mcqs_on_topic(text, topic, num_mcqs)
# Display the generated Questions
st.success(f"Generated {num_mcqs} Questions:")
for i, generated_question in enumerate(mcqs, start=1):
st.write(f"\nQuestion {i}: {generated_question['content']}")
st.write(f"Options: {', '.join(generated_question['options'])}")
st.write(f"Correct Answer: {generated_question['correct_answer']}")
else:
st.error("Please upload a PDF document.")
if __name__ == "__main__":
main()