OATutor began development at the end 2019. Throughout the past three years, A/B testing capabilities, data listeners, LTI support for systems such as Canvas, new problem capabilities such as variabilization, and various other features have been added. OpenStax’s three Algebra textbooks (Elementary, Intermediate, and College) have had questions from every section curated into the system and help added by the OATutor content team, with work underway to support Introductory Statistics (all under CC BY 4.0). The system has been piloted at a community college in seven classes over six terms (on the quarter system). In this section, we will introduce how OATutor’s preliminary model was grounded on ITS design principles, before outlining the system and its various features.
3.2 Content Structure
Inspired by Intelligent Tutoring Systems, OATutor uses a hierarchical structure for its content pool to generalize the expressiveness of existing popular tutoring systems in the literature (e.g., ASSISTments, Cog Tutor). The base unit of content is referred to as a problem which contains a title, a body, and a collection of subparts of the problem referred to as steps. An example is shown in Fig.
1 instructing the student to find the surface area of a cylinder.
The step is the finest granular level, and the level at which students enter their answer. This structure inherently encourages content authors to provide varying levels of grain size of instruction. Each step contains a title, body, and an answer field which can be either a textbox (set to exact answer or algebra answer) or a multiple-choice selection. Steps are typically structured as independent subparts of the problem that can be solved in any order. To provide additional help, each step contains a collection of help items called a tutoring pathway. The step shown in Fig.
1 instructs the student to calculate the surface area of the cylinder. However, the student has a conceptual error with the order of operations and ignores the parentheses, which the system marks as an incorrect answer. The student can retry the problem again on their own or click on the raised hand icon to begin the step’s tutoring pathway.
In Fig.
2, a step is decomposed into a mixture of hints and scaffolding. This serves to communicate the underlying goal structure within a problem step and walk the student through the problem solving process. Hints are unlocked and shown one at a time to reduce cognitive load. The hint unlocking order structure is configurable, with hint dependencies specified in the tutoring pathway content files. If a student’s answer is incorrect, they can reattempt the problem or choose to open any number of help items. Students can leave the help items to (re)attempt the original step at any point. All questions have a bottom-out hint which displays the correct answer to help the student move on to the next question if the previous hints were insufficient. Bottom-out hints can be turned on or off in a global configuration file. In Fig.
2, the student is shown to have finished two hints and a scaffold. Upon solving the scaffold, the student realizes their error in the order of operations, skips the remaining hints, and correctly solves the step from Fig.
1.
The content pool exists as a modular folder within the OATutor repository, with problems and their tutoring represented in JSON format (Figures
3 and
4). Content authors do not need familiarity with JSON and instead can author using a Google Spreadsheet. An automated conversion script is included and responsible for converting content in these spreadsheets to the JSON format required by OATutor’s content pool.
Content is tagged with skills at the step level. For OpenStax content, the learning objective of the problem within the lesson was used. In order to support easy definition and redefinition of skill mappings for researchers to experiment with, OATutor places these tags in a centralized configuration file called the skill model, shown in Fig.
5. This avoids the need to edit the fields of every individual step in the content pool. The skill model represents a matrix of all the steps and the skills they are associated with. The skill model matrix was stored in a javascript file in an earlier iteration of the system, but was later changed to a JSON file to better support a researcher participant who had explored re-tagging all OATutor content with skills from the US Common Core and desired a more structured skill association file format to output to.
Courses are the top level of content organization in the OATutor interface (Fig.
6), which contain lessons (Fig.
7). Instead of lessons explicitly containing problems, each lesson defines a list of skills, also called learning objectives, in the tutor. Problems are then adaptively chosen based on their association with the skills of the lesson according to the skill mapping, or KC model configuration (Fig.
5). The course, lessons, and learning objectives structure is designed to follow the structure of a typical textbook, intended to be integrated into the syllabus of a formal course. Fig.
8 shows how courses and lessons are defined using JSON in the system. Lessons can be configured to recycle problems in the event that a student has exhausted all problems associated with the skills of a lesson, but has not yet reached the mastery threshold. Variabilization increases the value of recycled problems (see section
3.4), changing the numbers within a problem each time it is shown. Additional lesson toggles of
giveStuFeedback (correctness feedback),
giveStuHints (allowing hints to be requested),
doMasteryUpdate (using mastery learning as a stopping criterion), and
showStuMastery (showing students their mastery estimate) are available and turned on by default. Researchers and teachers may like to set these to false when creating lessons that serve as tests.
3.3 Mastery-based Adaptive Problem Selection
Bayesian Knowledge Tracing (BKT) [
12] is used to model student mastery of skills. BKT models student knowledge using a Hidden Markov Model in which observations are the correctness of a student’s answer for a problem. Each skill has four model parameters which are stored in a file called bktParams:
\(p_{\text{mastery}}^{(t)}\),
pguess,
pslip,
ptransit.
\(p_{\text{mastery}}^{(t)}\) represents the probability of the student having mastered the skill at time
t,
pguess represents the probability of the student solving a problem without having mastered the skill, and
pslip represents the probability of the student making a mistake applying a skill they have mastered.
ptransit is used to compute the probability a student will master a skill at each answer opportunity. OATutor uses the Bayesian update shown in Equation
1 depending on the correctness of the student answer, where mastery at
t is the model’s prior belief before observing a response at time
t and
t|
ans is the updated posterior after ovserving a student’s response:
Each problem is manually tagged by content authors with a skill (ex. evaluating_algebraic_expressions). Each lesson contains skills and a specified target mastery threshold for each skill. After a student finishes a problem, the system chooses a new problem that the student has not mastered yet using a configurable heuristic function. The default heuristic function iterates through all problems and chooses the one with the lowest average \(p_{\text{mastery}}^{(t)}\), averaged among all the skills the problem is tagged with.
Learning continues until all lesson skills have been mastered, at which point the system informs the student that they have mastered all skills. Progress is stored locally within the student’s browser as a cookie, avoiding the need for a backend. Although this means that OATutor lacks cross-device progress tracking, the lessons are designed to be completed in a 30 minute session, mitigating this need. If the student exhausts the entire problem pool without mastering the skills, completed problems can be recycled.
3.4 Variabilization and Answer Checking
Problem variabilization is a feature that reduces the burden on content creators by allowing content to be instantiated with different numbers, creating more versions of content. Content authors specify all variables in the problem and the possible sets of values the variable can take on, as seen in the example in Fig.
3. A random integer is chosen as the index for all of the variable possible value arrays (the modulo operator ensures there are no index out of bounds errors for varying length value arrays). OATutor uses predefined groupings of variables to improve the student experience, since different combinations of numbers can significantly change the difficulty of a problem. An example of this would be that certain randomly chosen numbers will not divide evenly into whole numbers for fraction problems. Answers will often need to be stated in terms of variables given earlier in the problem. Variabilization can be defined at the problem, step, or hint/scaffold scope, similar to the variable scope of a computer program. Variable values at lower granular levels take precedence in the case of a duplicated variable name.
OATutor also supports localization in the form of global variable sets, which allow templated words to be replaced in all problems to accommodate different contexts. For example, if a problem contains the word “elevator” as the default, it may be desirable to use the word “lift” for a UK audience. Localization offers to reduce language confusing without undue content duplication, improving the quality of students’ interaction with the platform.
The platform was first designed for math courses, so the system needed to allow content creators to typeset math expressions and also allow students to input math expressions. OATutor’s frontend was created using React, enabling us to reuse common UI components from open-source React libraries such as MaterialUI, saving programmer development hours. LaTeX rendering libraries were integrated to support rendering mathematical expressions. Custom markdown syntax was formulated to denote LaTeX and inline images. For problems with textbox input fields, student answers are automatically converted to LaTeX in real time. This allows students to input their answers in a more natural way that requires no knowledge of LaTeX.
Algebra type answer-field checking is performed using Khan Academy’s open-source computer algebra system (KAS) which can verify if two expressions are algebraically equivalent. This gives students greater flexibility in entering their answers into the system, avoiding the need for the system to specify input ordering or answer formats.
3.6 Accessibility Standards
In an effort to make our system accessible to all users who wish to learn or conduct research with our platform, we have ensured that every page complies with the Web Content Accessibility Guidelines 2.0
7 (level AA) and the federal Revised Section 508 Standards
8. To do this, the website is composed of modular components that were built to be accessible. As demonstrated in Fig.
10, our code has Accessible Rich Internet Applications (ARIA) attributes embedded in the application. Additionally, we tag our graphical components with alternative texts so that screen readers can easily identify figures in problems or buttons in our interface (Fig.
10). OATutor’s accessibility compliance with the Revised Section 508 standards is documented using the Voluntary Product Accessibility Template (VPAT). Using the Section 508 version of the template, our publicly available document
9 lays out the required components OATutor has for educational institutes that receive US federal funding to adopt the system.
Going beyond the codified accessibility standards, our system incorporates many of the modern best practices for complex input transformations, dynamic content notifications, and error handling. Since users are able to enter mathematical symbols, operands, and matrices, the system makes use of the Math-quill library and a custom equation interpreter to generate English text for screen readers to consume. In the event that a user using a screen reader submits an answer to be checked, they will also receive real-time feedback via a "role=alert" notification popup. To ensure that component malfunctions do not affect the overall user experience, every component is wrapped with at least one error boundary. In addition to logging an exception event, the error boundary allows us to customize a fallback view for the system.
3.7 Ease of Adoption
OATutor was designed with simplicity in mind. It takes two clicks to set up an entire learning system, run a pre-made AB test, and deploy the system as a github-pages website on GitHub.io
10. By offloading data storage needs to the users’ browsers and making our models browser-friendly, OATutor does not need any servers beyond basic static file hosting. Nevertheless, OATutor is built with several features that could be enabled if the orchestrating user points the configuration file to their own or cloud hosted database.
3.7.1 Data logging.
By default, a student’s progress through lessons is stored in their browser using IndexedDB or WebSQL (whichever is available). However, a database is still useful for the purpose of storing data logs and other feedback entries for later analysis. As such, an administrator can opt into using Firebase’s Firestore which is a NoSQL cloud database to reduce the time and complexity of researchers setting up an instance of OATutor.
Data logs are created as students submit answers to problem steps and scaffolds and unlock hints. Every student interaction with the platform is logged as its own entry to enable researchers and teachers to reconstruct the user’s interaction history. This allows for hint usage analytics and efficacy of A/B testing to be evaluated. The data logs are stored in NoSQL JSON, accessible through the Firebase web interface and can be easily exported to a CSV. All fields are present in all event type logs, as researchers had challenges exporting to CSV when NoSQL JSON formatted MOOC data contained different fields for different events [
38].
Tables
3 and
4 show the fields of two example data log entries. The
helpFinished field stores the number of hints that the user has unlocked at the current time as an array. An array value of 1 represents that the hint was unlocked, a value of 0.5 represents a scaffold that was unlocked but not yet solved, and a value of 0 represents a locked help item. The condition field refers to the random condition a user would be assigned from A/B testing (e.g., Fig.
9). Also included in each log entry, but not shown in the Tables for brevity, are the lesson and book title names the problem was selected from. The
oat_user_ID is a non-identifiable random ID that is produced by the front end and is persistent across sessions with the same browser.
Users can also submit feedback reports on problems through the system UI for any tutor or content errors that may impede their progress. Although most errors are caught when vetted by content editors or through automated checks, students do find and report errors they encounter.
3.7.2 Data for BKT.
The format of OATutor’s data makes it convenient to train knowledge tracing models, such as with pyBKT, an open-source Python library of BKT models [
5]. The log data format can be easily used to fit parameters in just a few lines. In Fig.
11, data from OATutor is loaded as a CSV. Using pyBKT, a model is initialized. A BKT model is trained on all the unique skills in the dataset, and the learning parameters (prior, learns, guesses, slips, and forgets) are fit for each skill. The learned values of each parameter per skill are shown in Table
5.
3.7.3 LMS Interoperability.
OATutor supports the Learning Tools Interoperability (LTI) standard to integrate the tutor with classroom Learning Management Systems (LMS) such as Canvas. This allows teachers to view student mastery of skills within the tutor from their LMS gradebook. To support LTI, we created a middleware server implemented with Node.js to handle LTI authentication. Teachers simply specify the middleware as an external app when creating assignments, then link to a lesson on OATutor through a graphical selection screen. Students can then click on the assignment link when logged in to their LMS account to be redirected to the respective lesson on the platform. This removes the necessity for students to create a separate account on the platform and also simplifies the platform, avoiding storage and management of user credentials.
When OATutor is accessed by students via LTI, the same logging format applies; however, the additional fields of unique course_id and unique lms_user_id are populated, both of which are anonymized but persistent across devices and sessions as per the LTI protocol. The field course_name is also populated, which reflects the name of the course set by the teacher in the LMS.
Scores are passed back to the LMS as students finish problems. These scores are available for teachers to view in the gradebook of the LMS, which shows a detailed breakdown of the student’s mastery probability for each skill within the lesson. Each skill score is calculated by dividing the student’s mastery by the mastery threshold, capped at 100%. The overall score is calculated as the average of all skill component scores. An example grade report is shown in Fig.
12. This also shows a detailed log of actions in the lesson associated with the student to support the teacher in diagnosing a student’s engagement level and quality of understanding, by viewing the history of answers they have given and their pace of interactions with the system.
3.7.4 Usage Statistics.
Since the first deployment, the system has received over 70,000 problem submissions, of which 5,000 were from pilot courses - identified by the presence of a lms_user_id in the logs. Through these pilot courses at a local community college, we found 150 unique students using the system and 10 who had completed an entire course (predicted via their mastery). Thanks to our early adopters and educators, we have also been able to review nearly 2,000 pieces of feedback and subsequently made significant changes to the tutor and its content.