athena-cofee

A system to support (semi-)automated assessment of textual exercises

https://github.com/ls1intum/athena-cofee

Science Score: 75.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 20 DOI reference(s) in README
  • Academic publication links
    Links to: sciencedirect.com, acm.org
  • Academic email domains
  • Institutional organization owner
    Organization ls1intum has institutional domain (ase.cit.tum.de)
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (13.3%) to scientific vocabulary

Keywords

artemis athena text-exercises
Last synced: 6 months ago · JSON representation ·

Repository

A system to support (semi-)automated assessment of textual exercises

Basic Info
Statistics
  • Stars: 21
  • Watchers: 15
  • Forks: 2
  • Open Issues: 43
  • Releases: 0
Topics
artemis athena text-exercises
Created almost 6 years ago · Last pushed over 1 year ago
Metadata Files
Readme License Citation

README.md

Athena: A system to support (semi-)automated assessment of textual exercises

This system implements an approach for (semi-)automated assessment of textual exercises and can be integrated into learning management systems (LMS). A reference integration exists for the LMS Artemis.

Athena implements the approach described in our article Machine learning based feedback on textual student answers in large courses:

Machine learning based feedback on textual student answers in large courses.
Jan Philip Bernius, Stephan Krusche, and Bernd Bruegge.
Computers and Education: Artificial Intelligence, Volume 3. June 2022. DOI: 10.1016/j.caeai.2022.100081

Architecture

The Athena system is built using a microservice architecture, as depicted in Figure 1. Four components comprise the Athena system:

UML Component Diagram UML Component Diagram

Figure 1: Athena Microservice Architectuer depicted using a UML Component diagram.

  1. Load Balancer: Provides Service in the form of a HTTP REST API to submit an Athena job. This component will manage the work distribution to other components.
  2. Segmentation: Component for segmenting Student Answers based on Topic Modeling.
  3. Language Embedding: Component for computing Language Embeddings using ELMo and uploading training material for ELMo.
  4. Clustering: Component for clustering of ELMo Vectors using HDBSCAN.

The load balancer orchestrates jobs and calls all components using their HTTP APIs. After the job is completed, it calls back to LMS to submit the results.

Basic Usage

Running with Docker

Using the docker-compose.yml file included in the root directory of the repository is the easiest way to start Athena.

The execution of

docker-compose up -d

will automatically build and start the Load-balancer, Segmentation, the Embedding and the Clustering component (The -d parameter will run containers in the background, omit it to directly see outputs).

The first time you start Athena, it will take a while to download all required images and build the components.

For testing and development purposes, a single component can be re-built using e.g.

docker-compose build segmentation

or be started separately (in foreground mdoe) using e.g.

docker-compose up segmentation

Stopping Athena can be achieved by stopping the running containers using

docker-compose down

For further information have a look at the Compose file reference and the Compose command-line reference.

Running the Services Using make

Prepare all local dependencies and start the services by running

make -j6 # j6 is optional, but speeds up the process

in the root directory. This will call make in all subdirectories, which initializes virtual environments, installs dependencies and downloads required models. After that the services will be started automatically.

There is one special target in the Makefile that will start traefik and the MongoDB database in a docker container to redirect to the services running on your local machine.

You can always just directly use make and it will automatically detect changed dependencies.

Running the Services Using PyCharm

If you are using PyCharm, you can configure the project as follows:

  1. Open the project in PyCharm

  2. Ensure that you have the EnvFile plugin installed so that the environment file loading can take place from the run configuration.

  3. Run the setup preparations by running make setup in a terminal or by using the run configuration Prepare local setup

  4. Now, you can add the different microservices as submodules of the PyCharm project. To do so, go to File -> Open and open the following directories. When asked, choose to open them using the "Attach" method (in the dialog that also provides options for "This window" / "New window"). - clustering - embedding - load-balancer - segmentation - tracking

  5. Configure the virtual environment Python interpreters for the different modules: For each of the modules in the list above, go to File -> Settings -> Project: Athena -> Project Interpreter and select the virtual environment in the .venv directory of the respective module.

  6. Now, you can start the different services by running the corresponding run configurations. This has the added advantage that you can debug the services directly from PyCharm by running the configuration in debug mode. You can also start all services by running the All Services-configuration.

Notes on Running the Services Without Docker

Running the services directly has multiple advantages:

  • You can use the Debug-Mode of your IDE to debug the services
  • You can restart the services individually without restarting the whole system
  • The services will restart themselves if you change the code (the uvicorn-reloader is enabled by default)

Using makefiles or PyCharm will use the environment variables from .local.env.

You can remove all the setup files by running make clean.

Basic API Overview

By default, a traefik-container will manage API-Endpoints and expose them on port 80 (default HTTP-port). The following API-routes are available after start:

Traefik provides a dashboard to monitor the status of underlying components. This dashboard is available on http://localhost:9081/dashboard by default.

Test Instructions

  1. Set up a local instance of Artemis. Configure Athena exactly like in the setup instructions. Make sure that the Artemis server_name in the local configuration is set to http://localhost:8080 so that Athena knows to call back this endpoint. Also, double-check that the athene profile is enabled.

  2. There are 2 paths to continue now. In the root directory:

    1. Run docker-compose up --build.
    2. Run make setup -j6 and then make start.
  3. Go to http://localhost:8080, create a course, then create a text exercise.

  4. Use at least 10 test accounts to participate in the exercise. Otherwise, Athena will not start.

  5. Edit the exercise settings and set the due date to be the next full minute that has not yet passed.

  6. Wait a bit, then log messages should appear in the different microservices in Athena.

  7. To verify that Artemis gets called back by Athena, it might be helpful to set a breakpoint in AtheneService.java (in Artemis) in the processResult method.

Configuration

For configuration of the Athena system you can make use of the .env-file in the repository. All variables in there are used in the docker-compose.yml to bring up the Athena system.

Contributing

We welcome contributions in any form! Assistance with documentation and tests is always welcome. Please submit a pull request.

Citing

To reference the automatic assessment approach developed in this system please cite our article in Computers and Education: Artificial Intelligence:

Machine learning based feedback on textual student answers in large courses.
Jan Philip Bernius, Stephan Krusche, and Bernd Bruegge.
Computers and Education: Artificial Intelligence, Volume 3. June 2022. DOI: 10.1016/j.caeai.2022.100081

bibtex @Article{BerniusKB22, author = {Bernius, Jan Philip and Krusche, Stephan and Bruegge, Bernd}, title = {Machine learning based feedback on textual student answers in large courses}, journal = {Computers and Education: Artificial Intelligence}, volume = {3}, publisher = {Elsevier {BV}}, year = {2022}, doi = {10.1016/j.caeai.2022.100081}, }

Publications

Owner

  • Name: TUM Applied Software Engineering
  • Login: ls1intum
  • Kind: organization
  • Location: Munich, Germany

Technical University of Munich - School of Computation, Information and Technology

Citation (CITATION.cff)

cff-version: 1.2.0
title: Athena
message: >-
  If you want to reference Athena in your work, please cite
  this article.
type: software
authors:
  - given-names: Jan Philip
    family-names: Bernius
    email: janphilip.bernius@tum.de
    affiliation: Technical University of Munich
    orcid: 'https://orcid.org/0000-0001-8278-4598'
repository-code: 'https://github.com/ls1intum/Athena'
abstract: >-
  The Athena system generates and suggests computer-aided
  feedback for textual exercises based on machine learning.
  Athena utilizes a segment-based grading concept, which
  links feedback to text segments. Athena automates grading
  based on topic modeling and an assessment knowledge
  repository acquired during previous assessments. A
  language model builds an intermediate representation of
  the text segments. Hierarchical clustering identifies
  groups of similar text segments to reduce the grading
  overhead.
keywords:
  - Software engineering
  - Education
  - Interactive learning
  - Automatic assessment
  - Grading
  - Assessment support system
  - Learning
  - Feedback
license: MIT
preferred-citation:
  type: article
  authors:
  - given-names: Jan Philip
    family-names: Bernius
    email: janphilip.bernius@tum.de
    affiliation: Technical University of Munich
    orcid: 'https://orcid.org/0000-0001-8278-4598'
  - given-names: Stephan
    family-names: Krusche
    email: krusche@in.tum.de
    affiliation: Technical University of Munich
    orcid: 'https://orcid.org/0000-0002-4552-644X'
  - given-names: Bernd
    family-names: Bruegge
    email: bernd.bruegge@tum.de
    affiliation: Technical University of Munich
    orcid: 'https://orcid.org/0000-0001-8331-0490'
  doi: "10.1016/j.caeai.2022.100081"
  journal: "Computers and Education: Artificial Intelligence"
  title: "Machine learning based feedback on textual student answers in large courses"
  volume: 3
  year: 2022

GitHub Events

Total
  • Issues event: 5
  • Watch event: 1
Last Year
  • Issues event: 5
  • Watch event: 1

Issues and Pull Requests

Last synced: 11 months ago

All Time
  • Total issues: 41
  • Total pull requests: 178
  • Average time to close issues: N/A
  • Average time to close pull requests: 4 months
  • Total issue authors: 1
  • Total pull request authors: 12
  • Average comments per issue: 0.0
  • Average comments per pull request: 0.78
  • Merged pull requests: 102
  • Bot issues: 41
  • Bot pull requests: 114
Past Year
  • Issues: 41
  • Pull requests: 2
  • Average time to close issues: N/A
  • Average time to close pull requests: N/A
  • Issue authors: 1
  • Pull request authors: 1
  • Average comments per issue: 0.0
  • Average comments per pull request: 0.0
  • Merged pull requests: 0
  • Bot issues: 41
  • Bot pull requests: 2
Top Authors
Issue Authors
  • mend-bolt-for-github[bot] (30)
Pull Request Authors
  • dependabot[bot] (72)
  • Adem-Khachnaoui (10)
  • pal03377 (10)
  • linusmichel (6)
  • CanArisan (4)
  • bigultekin (3)
  • jpbernius (2)
  • JonasPetry (2)
  • argertboja (2)
  • cremertim (1)
  • mend-bolt-for-github[bot] (1)
  • clemenszuck (1)
  • maximiliansoelch (1)
  • Minh13 (1)
Top Labels
Issue Labels
Mend: dependency security vulnerability (30)
Pull Request Labels
dependencies (73) enhancement (7) documentation (2) bug (1)

Dependencies

benchmark/requirements.txt pypi
  • enum34 ==1.1.6
  • ipaddr ==2.2.0
  • ipaddress ==1.0.17
  • nltk ==3.6.5
  • pyocclient ==0.4
  • requests ==2.20.0
  • urllib3 ==1.26.5
  • virtualenv ==15.1.0
  • websocket-client ==0.44.0
clustering/pipdeptree_requirements.txt pypi
  • DateTime ==4.3
  • docutils ==0.15.2
  • fastapi ==0.61.1
  • hdbscan ==0.8.26
  • matplotlib ==3.1.1
  • pandas ==1.0.3
  • pymongo ==3.10.1
  • requests ==2.24.0
  • uvicorn ==0.11.8
clustering/requirements.txt pypi
  • DateTime *
  • docutils ==0.15.2
  • fastapi ==0.65.2
  • hdbscan ==0.8.26
  • joblib ==0.14.1
  • matplotlib ==3.1.1
  • numpy ==1.20.2
  • pandas ==1.2.4
  • pymongo ==3.10.1
  • requests ==2.24.0
  • scikit-learn ==0.22.2.post1
  • scipy ==1.4.1
  • uvicorn ==0.11.8
embedding/pipdeptree_requirements.txt pypi
  • allennlp ==0.9.0
  • fastapi ==0.61.1
  • pymongo ==3.10.1
  • pyocclient ==0.4
  • uvicorn ==0.11.8
embedding/requirements.txt pypi
  • allennlp ==0.9.0
  • docutils ==0.15.2
  • fastapi ==0.65.2
  • joblib ==0.14.1
  • numpy ==1.18.3
  • pymongo ==3.10.1
  • pyocclient ==0.4
  • requests ==2.24.0
  • scikit-learn ==0.22.2.post1
  • scipy ==1.4.1
  • uvicorn ==0.11.8
load-balancer/pipdeptree_requirements.txt pypi
  • PyYAML ==5.4
  • docutils ==0.15.2
  • fastapi ==0.61.1
  • gunicorn ==20.0.4
  • numpy ==1.18.3
  • pipdeptree ==1.0.0
  • requests ==2.24.0
  • uvicorn ==0.11.8
load-balancer/requirements.txt pypi
  • PyYAML ==5.4
  • docutils ==0.15.2
  • fastapi ==0.65.2
  • gunicorn ==20.0.4
  • numpy ==1.18.3
  • protobuf ==3.15.8
  • requests ==2.24.0
  • uvicorn ==0.11.8
segmentation/pipdeptree_requirements.txt pypi
  • fastapi ==0.65.2
  • nltk ==3.6.5
  • pipdeptree ==1.0.0
  • requests ==2.24.0
  • scikit-learn ==0.22.2.post1
  • setuptools ==50.3.0
  • uvicorn ==0.11.8
segmentation/requirements.txt pypi
  • fastapi ==0.65.2
  • nltk ==3.6.5
  • requests ==2.24.0
  • scikit-learn ==0.22.2.post1
  • uvicorn ==0.11.8
tracking/requirements.txt pypi
  • PyJWT ==1.7.1
  • fastapi ==0.65.2
  • jaro-winkler ==2.0.0
  • numpy ==1.19.1
  • pandas ==1.1.0
  • pymongo ==3.10.1
  • scikit-learn ==0.23.2
  • scipy ==1.5.2
  • uvicorn ==0.11.7
.github/workflows/client.yml actions
  • actions/checkout v2 composite
  • actions/setup-java v2 composite
  • arduino/setup-protoc v1 composite
.github/workflows/dockerimage.yml actions
  • actions/checkout v1 composite
  • arduino/setup-protoc v1 composite
  • azure/docker-login v1 composite
clustering/Dockerfile docker
  • python 3.7.7 build
docker-compose.yml docker
  • athene-clustering latest
  • athene-embedding latest
  • athene-load-balancer latest
  • athene-segmentation latest
  • athene-tracking latest
  • mongo latest
  • traefik v2.2.1
embedding/Dockerfile docker
  • python 3.7.7 build
load-balancer/Dockerfile docker
  • python 3.7.7 build
segmentation/Dockerfile docker
  • python 3.7.7 build
tracking/Dockerfile docker
  • tiangolo/uvicorn-gunicorn-fastapi python3.7 build