Skip to content

igakilab/javaans

Repository files navigation

自動作問システム

本システムは,OpenAI 社が開発した ChatGPT API を用いて,Java 言語を対象としたプログラミング演習問題の自動生成(自動作問)を行うシステムである.以降では,本システムのセットアップ手順および使用方法を示す.

動作要件

  • Python 3.11 以上

準備

  1. 本システムのセットアップおよび使用に必要な以下のツールをインストールする.
  1. OpenAI 社の API キー発行ページにアクセスしてアカウントを作成し,API キーを取得する.

インストール

  1. 以下のコマンドを実行し,本システムをインストールする.
pip install -U git+https://github.com/igakilab/javaans.git
  1. 以下のコマンドを正常に実行可能か確認する.
javagen -h

プロジェクトの作成

  1. プロジェクト名を指定してプロジェクトを作成する.作成後,プロジェクト名のディレクトリに移動する.
javagen init <プロジェクト名>
cd <プロジェクト名>
  1. .envファイルのYOUR_OPENAI_API_KEYの部分を,取得した API キーに置き換える.

  2. 必要に応じて設定ファイルを編集する.各種設定ファイルの詳細はこちらに記載している.

実行

以下に実行例を示す.

# 授業回はlecXXの形式で指定する(第10回であればlec10)
# 問題番号は1から始まる整数で指定する
# 以下のコマンドを実行すると,data.csvの情報をもとに第10回の1番目の問題が生成される
$ javagen generate lec10 1
課題10- 1の解答を生成中... 完了
Token check: OK
Compile check: OK

課題10- 1の問題を生成中... 完了
WorkA1Test.mainTest1() passed. (0.033s)

# 解答例コードのみを生成する場合は,-aオプションを付与する
$ javagen generate -a lec10 1
課題10- 1の解答を生成中... 完了
Token check: OK
Compile check: OK

# 仕様・実行例のみを生成する場合は,-qオプションを付与する(解答例コードの生成後のみ使用可)
$ javagen generate -q lec10 1
課題10- 1の問題を生成中... 完了
WorkA1Test.mainTest1() passed. (0.033s)

$

問題の生成後は以下のディレクトリが生成される.

lecXX           # 授業回ディレクトリ
├─generated     # 生成された問題を格納するディレクトリ
│  ├─answer     # 解答例コード
│  ├─question   # 仕様・実行例
│  └─test       # テストコード
└─log           # ログファイルを格納するディレクトリ
   ├─answer     # 解答例コード生成時のログ
   ├─question   # 仕様・実行例生成時のログ
   └─xml        # テスト実行時のログ

難易度に関するオプション

難易度は規模(解答例コードの総行数)の大小と抽象度(問題文の抽象度)の高低によって構成される.作問時に難易度に関するオプションを指定することで,指定された難易度に応じたサンプル問題が読み込まれ,生成される問題の難易度が調整される.デフォルトでは規模小,抽象度低のサンプル問題が用いられる.難易度を変更する場合や難易度を考慮しない場合は,作問時に以下のオプションを指定する.

  • --longオプション
    • 規模の大きい(解答例コードの行数が長い)サンプル問題を用いる
  • --abstractオプション
    • 問題文の抽象度が高いサンプル問題を用いる
  • --no-difficultyオプション
    • 難易度に関するパラメータを持たないサンプル問題を用いる
# 規模小,抽象度高のサンプル問題を用いて問題を生成する場合
$ javagen generate --abstract lec10 1
課題10- 1の解答を生成中... 完了
Token check: OK
Compile check: OK

課題10- 1の問題を生成中... 完了
WorkA1Test.mainTest1() passed. (0.033s)

# 規模大,抽象度高のサンプル問題を用いて問題を生成する場合
$ javagen generate --long --abstract lec10 1
課題10- 1の解答を生成中... 完了
Token check: OK
Compile check: OK

課題10- 1の問題を生成中... 完了
WorkA1Test.mainTest1() passed. (0.033s)

# 難易度に関するパラメータを持たないサンプル問題を用いて問題を生成する場合
$ javagen generate --no-difficulty lec10 1
課題10- 1の解答を生成中... 完了
Token check: OK
Compile check: OK

課題10- 1の問題を生成中... 完了
WorkA1Test.mainTest1() passed. (0.033s)

$

特定のサンプル問題を用いる場合

特定のサンプル問題を用いて問題を生成する場合,以下のディレクトリ構成に従ってサンプル問題を配置する.構成例については本リポジトリのlec00/を参照されたい.

lecXX           # サンプル問題の授業回ディレクトリ
├─data          # サンプル問題を格納するディレクトリ
│  ├─answer     # 解答例コード
│  ├─example    # 実行例
│  └─spec       # 仕様

サンプル問題を指定する場合は-s <WorkXY>の形式で指定する.WorkXYについて,X は授業回を 16 進数大文字で表したもので,Y は問題番号を 16 進数小文字で表したものである.以下にサンプル問題として第 2 回の 5 番目の問題(Work25)を用いる場合の実行例を示す.

$ javagen generate -s Work25 lec10 1
課題10- 1の解答を生成中... 完了
Token check: OK
Compile check: OK

課題10- 1の問題を生成中... 完了
WorkA1Test.mainTest1() passed. (0.033s)

$

その他のオプション

  • --modelオプション
    • 使用する ChatGPT API のモデルを指定する
    • --model <モデル名>の形式で指定する
    • デフォルトはgpt-4o
    • 利用可能なモデルについてはこちら/v1/chat/completionsを参照

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages