File size: 4,866 Bytes
ed363f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import openai
import logging
import re

client = openai.OpenAI(
    base_url="https://api.groq.com/openai/v1",
    api_key=os.getenv("GROQ_API_KEY")
)

# Function to generate a question
def generate_ques(theme):
    ques_prompt = (
        f"Generate a unique, factually accurate quiz question on the theme of {theme}.\n"
        f"Ensure that:\n"
        f"1. The question is factually accurate, unique, and not similar to previous questions.\n"
        f"2. All options are clearly labeled as A, B, C, and D.\n"
        f"3. The correct answer is accurate and clearly marked.\n"
        f"4. Assign a difficulty level (Easy, Medium, or Hard) to the question.\n"
        f"   Evaluate the difficulty using the following weighted criteria (total score out of 10):\n"
        f"   - Concept Complexity (30%)\n"
        f"   - Application Level (25%)\n"
        f"   - Ambiguity (15%)\n"
        f"   - Time Requirement (15%)\n"
        f"   - Prerequisite Knowledge (15%)\n"
        f"Format the response exactly as follows:\n"
        f"Question: [Your question here]\n"
        f"A) [Option A]\n"
        f"B) [Option B]\n"
        f"C) [Option C]\n"
        f"D) [Option D]\n"
        f"Correct answer: [Correct option letter]\n"
        f"Difficulty level: [Easy/Medium/Hard]\n"
        f"total weighted score: [Total score out of 10]\n\n"
        f"Do not include any explanations or comments outside of this format."
    )

    response = client.chat.completions.create(
        model="llama-3.3-70b-versatile",
        messages=[
            {"role": "system", "content": "You are a helpful assistant who generates quizzes."},
            {"role": "user", "content": ques_prompt}
        ],
        temperature=0.5,
        max_tokens=1024,
        top_p=1
    )
    
    return response.choices[0].message.content.strip()

# Function to verify a generated question
def verify_question(full_question_text):
    try:
        # Extract entire quiz block and correct answer
        correct_answer_match = re.search(r"Correct answer:\s*([A-D])", full_question_text)
        difficulty_match = re.search(r"Difficulty level:\s*(Easy|Medium|Hard)", full_question_text)

        if not correct_answer_match:
            return "invalid", "Missing correct answer or required structure.", "N/A"

        correct_option = correct_answer_match.group(1).strip()
        difficulty = difficulty_match.group(1).strip() if difficulty_match else "N/A"

        # Pass the entire question to the model
        verification_prompt = (
            f"Verify the following quiz question for:\n"
            f"- Factual accuracy of the question must be correct .\n"
            f"- There should be no spelling or grammatical errors.\n"
            f"-The question should be unique.\n"
            f"- There should be no ambiguity in the question.\n"
            f"- Proper formatting (includes labels: Question, A-D options, Correct answer)\n"
            f"- Reject if:\n"
            f"  - The format is incorrect or incomplete\n"
            f" - The correct answer is factually wrong\n"
            f"- There is a spelling or grammatical mistake\n"
            f"- The question is not unique\n"
            f"- The question is ambiguous\n"
            f"\n{full_question_text}\n"
            f"\nRespond only in this format:\n"
            f"Validation: [valid/invalid]\n"
            f"Feedback: [Feedback message or N/A]\n"
            f"Difficulty: [Easy/Medium/Hard]"
        )

        response = openai.ChatCompletion.create(
            model="llama-3.3-70b-versatile",
            messages=[
                {"role": "system", "content": "You are a quiz verification assistant."},
                {"role": "user", "content": verification_prompt}
            ],
            temperature=0.3,
            max_tokens=512,
            top_p=1
        )

        result = response['choices'][0]['message']['content'].strip()
        lines = result.splitlines()
        validation = lines[0].split(":", 1)[1].strip().lower()
        feedback = lines[1].split(":", 1)[1].strip()
        difficulty_returned = lines[2].split(":", 1)[1].strip()

        return validation, feedback, difficulty_returned

    except Exception as e:
        logging.error(f"Error in verification: {e}")
        return "error", "Exception occurred", "N/A"

# Driver code
if __name__ == "__main__":
    theme = "science"  # Change this theme as needed
    generated_question = generate_ques(theme)
    print("\nGenerated Question:\n", generated_question)

    validation, feedback, difficulty = verify_question(generated_question)
    print("\nVerification Result:")
    print("Validation:", validation)
    print("Feedback:", feedback)
    print("Difficulty:", difficulty)