llmquiz / app.py
mohammed3536's picture
Update app.py
341d0da verified
raw
history blame contribute delete
No virus
4.39 kB
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()