ローカルLLM用IgakuQAのアレンジ
本記事では、IgakuQA(Kasai et al., 2023)をカスタマイズし、ローカルLLMに対応したコードを作成・公開した件について説明をします。
早速リポジトリを確認したい方は以下リンクをご確認ください。
IgakuQAとは
IgakuQAとは以下リポジトリで公開されているLLM用の医師国家試験ベンチマークです。
論文(https://arxiv.org/abs/2303.18027) からもわかるように、当該実装はGPT-4とChatGPTという商用LLMの性能を評価する実験となっています。実装はOpenAI API経由で出力を得る形となっています。
リポジトリの実装を少し見ていきましょう。
data/
まず国家試験のデータセットはdata/以下に2018〜2022年分が保管されています。各ファイルは{112~116}-{A~F}.jsonl
という形式になっており、また、各ファイルについて{無印, _metadata, _translate}の3種類が存在します。無印が通常の日本語での評価用, _translateが英語での評価用, _metadataが各設問に対し禁忌選択肢や人間の正答率などが記録されたファイルとなっています。
選択肢は[”a”, “b”, “c”, “d”, “e”]から1つもしくは複数を選ぶ5択問題となっています。
注意:配点について
IgakuQAには医師国家試験に倣い配点が"points"という列で格納されています.
例えばIgakuQAの論文やPFN社の事例(https://huggingface.co/pfnet/Preferred-MedLLM-Qwen-72B)では満点が500点となっていると推察されます。
一方でJMedLoRA(https://arxiv.org/abs/2310.10083)等ではAccuracy, すなわち正答率(%)で評価しています。
性能の高さを示す指標としては大勢に大きな影響はありませんが、この違いには留意が必要です。
今回, 後ほど解説するIgakuQA-Customでは, 一致した数をカウントし正答率を算出する実装となっています。
baseline_results/
論文中の数字のもととなる出力結果がこのフォルダに格納されています。ChatGPTのみが日英両方で評価されており、GPT-3とGPT-4は日本語のみにとどまっています。また、研究の時期の関係から、GPT-4より後のモデルは評価されていません。
表1:112(2018年度)の例
112-A_chatgpt.jsonl | ChatGPT |
112-A_gpt3.jsonl | GPT-3 |
112-A_gpt4.jsonl | GPT-4 |
112-A_student-majority.jsonl | 受験者の平均 |
112-A_translate_chatgpt-en.jsonl | ChatGPT(英語評価) |
scripts/
実行のためのコードが置かれています。
実際に実行するコードはscripts/baseline_main.py
です。
その内部の流れとしては、
- configで指定したモデル名に応じて、scripts/generation/ 以下のどのコードが読まれるかが決定します。デフォルト(configが空)ではgpt-3.5-turboが指定されることになります。
- プロンプトを作成する際に,
scripts/prompts/
以下のjsonlが読まれます。3つの例が格納されており, create_input関数によって「医師国家試験を解きます。」という指示と共に, 3-shot 推論を実施します。
評価はgold-fileに正解データのファイル, pred-fileに推論で出力されたファイルをパスで指定し, 以下のコマンドで実行します。
python evaluate_main.py --gold-file ../data/2018/112-A.jsonl --pred-file ../baseline_results/2018/112-A_chatgpt.jsonl
IgakuQA-Customについて
今回私たちはローカルLLMがどの程度医師国家試験を解けるのかを評価すべく、IgakuQAのスクリプトを少しアレンジしました。リポジトリのリンクは以下です。
IgakuQAに対して主に以下3点の修正を加えました。
- ローカルLLMへの対応
- 出力の整形
- 全体的なパイプラインの自動化
主な変更点
1. ローカルLLMへの対応
scripts/generation
以下にown.py
を新たに作成しました。具体的には, run_own関数の内部でvllmを利用し, huggingfaceで公開されているLLMなどを利用できるようにしました。どのモデルを利用するかは実行ファイルの環境変数によって指定します。
2. 出力の整形
baseline_results/modify.py
で余分な記号やスペースなど諸々を綺麗にします。ローカルLLMはGPTに比べると完璧さに欠けます。特に、Instruction-following能力が足りないモデルでは, 7Bクラスであっても, 出力が選択肢記号のみにならないケースが散見されます。このようなケースを甘めに見て正解とするために, 出力の冒頭に正しい選択肢が含まれていればその部分のみを抽出してLLMの回答とします。(そうしないと, 一致判定がstringとして見た時の合同判定なので, 正答率が0%となってしまいます。)特に多い出力としては、
b \n\n\n**解説:**\n\n ...
のように解説を付与してしまうケースや、続けて関係のない問題の問題文と解答を出力してしまう場合などがあります。基本的には一つ目の改行前までを抽出してあげると良い感じになります。
modify.py
は大方の余計な出力には対応していますが、記載の後処理のみでは対応できないようなエラーが出現した場合は独自に加筆修正する必要があります。また、既存のJSONLファイルを上書き出力するような実装となっている点もご利用される場合は留意ください。
3. 全体的なパイプラインの自動化
bash scripts/run_all_evaluate.sh
で以下を実行できるようにしました. 当該ファイルの中身は以下の4ステップです.
- 推論を実行し,
11*-*_own.jsonl
に結果を保存. - 移動
- (optional)
baseline_results/modify.py
を実行し整形. -
scripts/evaluate_main.py
を用い, exact match(3-shot)で正解率を算出.
使い方
最後に本リポジトリのコードを利用される方向けに、使い方を解説します。
まずは環境構築が必要です。簡便にするため、私たちが利用していたSingularityのdevファイルを公開しています。以下コマンドにより環境が完成します。
singularity build --fakeroot basic.sif basic.def
singularity shell --nv basic.sif
続けて実行方法です。以下のコマンドを叩いてください。
bash scripts/run_all_evaluate.sh
以上で、baseline_results/ 以下に出力結果がJSONLファイルとして、標準出力に年度ごとの正答数や正解率が表示されます。
評価結果の追加
ローカルLLMについては、以下を評価対象としました。随時追加するかもしれませんが。
- TinySwallow-1.5B-Instruct
- sarashina2.2-3b-instruct-v0.1
- Llama-3-Swallow-8B-Instruct-v0.1
- Llama-3.1-Swallow-8B-Instruct-v0.3
- Meditron3-Qwen2.5-7B
- Gemma2-9B-it
- Qwen2.5-7B-Instruct
- Qwen2.5-32B-Instruct
- Qwen2.5-72B-Instruct
また、前述のように元論文ではGPT-4までしか評価されていませんでしたが、今回GPT-4oにIgakuQAを解かせた結果も併せてbaseline_results/ 以下に格納しました。
GPT-4oの医師国家試験における性能評価実験は意外にもほとんど存在しません。
例えば以下記事では第119回医師国家試験のみに対して精度を評価しています。
詳細については以下の論文もご覧ください。
Coming soon...
おわりに
EQUESでは引き続き、「最先端の機械学習技術をあやつり社会の発展を加速する」をミッションに研究開発と社会実装に取り組んでいきます。一緒に事業を創出する仲間を募集しています。詳しくは以下をご覧ください。
EQUESでは現在経産省・NEDO「GENIAC」の採択事業者として薬学分野・製薬業務に特化したLLMの開発に挑戦しました。この領域にご関心のある方のご連絡をお待ちしています。詳しくは以下もご覧ください。
Discussion