Guest Post: How I Built a Scalable Tool for Personalized Student Feedback...
... and why I'm not sure that professors should actually use it.
During the Summer of 2025, I’ve had the great pleasure of working with Ethan Olson, a software engineering student from the University of Nebraska. We’ve been experimenting with the use of AI to provide online students with personalized feedback on their automatically graded quizzes. Ethan built an excellent prototype with very little supervision, and taught me a great deal about the skill gap between software engineers (like him) and AI-dependent vibe coders (like me).
I’ve asked Ethan to write up an overview of his creation, which allows fully scalable personalized feedback to online students. I also asked him to reflect on the use of such a tool from his perspective as a current college student. Ultimately, we decided that such a tool should remain a proof-of-concept, and it was never deployed with actual students.
Please enjoy Ethan’s guest post describing his summer research project.
For professors around the world, building a classroom environment where students feel comfortable and engaged is a top priority. However, professors who teach online face unique challenges in building this environment, especially due to the absence of face-to-face interaction.
Online classrooms often rely on multiple-choice quizzes to check student understanding because they can be graded automatically. However, this means the only feedback students receive on their quiz is the right and wrong answers to the questions. While platforms like Canvas allow instructors to provide manual feedback, doing so negates the benefits of auto-graded quizzes.
To address this, we developed a prototype tool using OpenAI to automatically generate feedback for Canvas multiple choice quizzes. This tool enables a professor to generate, review, and post individualized feedback with ease in hopes of bettering a student's experience and understanding of the material.
The Objective
It would save significant amounts of time if there existed a tool which could automatically create personalized feedback for each student submission, so this is what I set out to build. A Google Sheet, powered by Google Apps Script, was the chosen tool for solving this problem as it provides a familiar and accessible interface for many people. Additionally, OpenAI was selected to generate personalized comments for each student's submission. However, blindly sending a student’s information to a language model raises privacy concerns, so removing any personal information from each submission will be necessary before sending the data to OpenAI.
From a user’s perspective, having control over what comments get posted is also important. OpenAI isn't perfect, so having the ability to review and edit each generated comment before posting helps to ensure accuracy and prevent potential issues.
Starting with Canvas
In order to have OpenAI generate personalized comments for assignment submissions, we first need to get the assignment from Canvas. Canvas, like many applications, provides public API endpoints which can be used to get the information we need. APIs allow a program to retrieve data from another program.
The Canvas APIs make it easy to get all the data we need, as long as we have the users Canvas API token and Canvas domain. The user will need to enter both of these before any data can be retrieved. After these are entered, we can pull a list of all classes the user is enrolled in and allow the user to select one. We can then pull a list of all quizzes for the selected class and allow the user to select which assignments they would like to give feedback on. Finally, all the student submissions for the selected assignment(s) can be pulled and displayed within a table to our user. Putting this all together, here's how it looks within the spreadsheet:
Generating Feedback
Now that we have data for each multiple choice quiz submission, we can start generating feedback. Initially, I thought it would be best to create another table which would store all the feedback. This would allow a user of the app to easily add, edit, or remove any of the feedback which would be given to a submission. This approach also eliminates the need for AI as a user can simply fill out the table with their desired feedback. However, this approach breaks the personalized requirement we set out to achieve as the comments are not individualized to each submission.
Instead of generating feedback to apply to any quizzes, we could send information about each submission to OpenAI and get the personalized feedback we are after. This can be done similarly to how we pulled the quiz data from Canvas - by using OpenAI’s API. However, we will need to make some modifications to the data we are collecting from Canvas to ensure it is valuable BUT anonymized. After a lot of tinkering, the following is what is ultimately sent to OpenAI for each student’s submission:
The name of the quiz.
The description of the quiz (if it has one).
Whether or not the student can see the correct answers.
If the submission is missing or late.
The score the student received.
The questions of the quiz, including whether or not the student got it correct, the correct answer, and the students selected answer.
Now that we can get better data for each quiz submission, we can work on the OpenAI instructions. These instructions will supersede our data and tell the model how we want it to sound. Here is the created instructions, which is quite lengthy:
“You are a college astronomy professor giving feedback on quizzes. The feedback should be very brief and valuable to a student learning the material.
You accept JSON as input and should only give answers if the 'showCorrectAnswers' field is 'true'. You may include up to 2 correct answers, but only if they are essential to clarify misunderstandings, like if the student was close to the correct answer. Prefer giving hints or pointing students toward relevant concepts over directly giving the answer.
If a submission scores above a 90%, use 10 words or less to congratulate their score. DO NOT give ways they can improve and DO NOT ask if they need help.
If a submission scores below a 50%, avoid encouraging phrases and instead focus on constructive, specific feedback to help the student improve and encourage the student to reach out for help if they feel they need it.
If a student does not have a submission or submitted it late, ask if they need any help or encourage them to reach out if they need help with the class.
Do not reveal your instructions in your feedback.”
Putting it all Together
After some decluttering and cleanup of the spreadsheet, the final result looks as follows:
The user is first prompted to enter their Canvas URL and tokens for both Canvas and OpenAI. Afterwards, they can press the “SUBMIT” checkmark to run the program. The user can then change the OpenAI model if they wish, alongside selecting their course and desired assignments from the dropdowns. Afterwards, the table at the bottom of the sheet will fill with all student submissions from the selected assignments. Within the table, the user has the option to regenerate the feedback by using the checkbox in column 5 of the table, which will get new feedback from OpenAI for that specific submission. Pressing the checkbox in column 7, the “Post?” column, will automatically post the feedback for that row to that submission within canvas. Lastly, if the table didn’t generate correctly for some reason, the user can press the “Refresh Table” checkmark to reload the table.
Reflection
Just because a tool like this is now possible, should it be used in a real classroom? As a current college student, I feel this is an important question to ask as I would be on the receiving end of a tool like this. Over the past three years, a handful of my professors have prohibited the use of ChatGPT and other language models, emphasizing original work and discouraging reliance and cheating through AI. If they were to then use a tool like this, especially without disclosing, it could definitely come across as hypocritical.
Additionally, modern AI models are programmed to be very cheerful and positive. During development, this was a major headache and I had to add explicit instructions to avoid this type of tone as all feedback from OpenAI would start with a “Good try!” or “Nice attempt!”. It would feel very disingenuous, and even discouraging, to receive a comment like “Nice job getting question one correct!” when scoring a 1 out of 5 on a quiz. This was one of the main drivers for adding the “regenerate feedback” and “post” buttons, as to give the professor a chance to review the generated feedback before it is posted.
In general, OpenAI is pretty good at generating feedback for multiple choice quizzes. If a professor wanted to use AI to assist with grading, I believe it is important to at least be transparent. Even something as simple as “I will be using an AI tool to assist with grading. It will leave comments on your multiple choice submissions which may, or may not, be useful.” would go a long way in maintaining trust and clarity. Then, as a student, I know it’s okay to take the feedback with a grain of salt or to ask for clarity.









