見出し画像

「大規模言語モデルはグロービス学び放題の問題をどれくらい解けるのか」というテーマで色々検証してみた


はじめに

グロービスのデジタルプラットフォーム部門データサイエンスチームの機械学習エンジニアの田邊です。

グロービスではChatGPTのAPIが公開されて以降、関連領域の動向に注目しながら、そのクオリティの高い回答生成能力に加えて、プロンプトの指示に従ってくれる能力の高さや教育事業に関する知識の多さといった点に可能性を見出し、サービスへの活用を積極的に進めています。

直近の具体例を挙げると、グロービス学び放題というサービスにおける、ユーザーのコース振り返りコメントに対する自動フィードバック機能、自由記述問題の解答に対する自動フィードバック機能、そしてAIと学ぶシリーズのコンテンツ公開といったところが挙げられます。

これらのChatGPTを活用した機能は、現段階でもある程度コンテンツに沿った価値を提供してくれているのではないかと体感的には感じられますが、実際ChatGPTはどのくらいグロービス学び放題のコンテンツのことを理解できているのでしょうか。

その辺りを定量的に確かめられないかと思い、今回グロービス学び放題のコンテンツの一部である、「理解度チェックテスト」を題材に検証をしてみることにしました。

グロービス学び放題の理解度チェックテスト

グロービス学び放題の理解度チェックテストは、コース単位で用意されており、そのコースで学べる重要なポイントをきちんと理解できているかをチェックするものです。

自分のキャリア・アンカーを理解すると良いことは何ですか。適切なものを一つ選びなさい

1 自分のキャリア・アンカーは、仕事における得意分野の証明となり、上司に伝えておくと、キャリア・アンカーに基づいた仕事をアサインしてもらえる
2 自分のキャリア・アンカーがあまり良くないものだった場合、その事実を知るとともに、よりよいキャリア・アンカーになるように努力できる
3 キャリア選択をはじめ様々な意思決定において、キャリア・アンカーを判断軸にでき、納得感あるキャリア構築ができる
4 自分のキャリア・アンカーは、それに紐づいて目指すべき職業が決まっているため、就職先とする業界・企業選びの指針になる

そこまで複雑な問題はなく、基本レベルの知識を問うものがメインですが、コースの内容をしっかり把握していないと意外と解けないようなレベル感の問題も多く、言語モデルのドメイン知識を確認するものとして適切な難易度になっているのではないかと考え、今回の検証の題材として扱うことにしました。

どんな検証をしたか

検証内容

とりあえずはOpenAI製のChatGPTやGPT4の性能を見ることが第一の目的ですが、最近では日本語特化のものやオープンになっている大規模言語モデルも増えつつある状況でもあり、OpenAIが提供する大規模言語モデルだけに依存するのではなく、他の言語モデルの活用(ファインチューニングなど)の可能性も検討していっても良いのではないかと考え、その第一歩として以下のモデルも検証してみることにしました。

  • Japanese StableLM

  • ELYZA-japanese-Llama-2-7b

  • PaLM2

以上のモデルを対象に、今回は大きく以下の3種類の検証を行いました。

  • 検証1 : 理解度チェックテストをとりあえず全部解かせるとどうなるか。

  • 検証2 : ファインチューニングの効果はどれくらいあるか。
    (Japanse StableLM, ELYZA-japanese-Llama-2-7b, ChatGPT)

  • 検証3 : ファインチューニングとfew-shot promptingを比べるとどうか。

検証環境

ChatGPT(gpt-3.5-turbo)、GPT4、PaLM2はAPIリクエストによって回答を取得できるので、全てローカルに環境を構築して検証を行いました。

Japanese StableLM、ELYZA-japanese-Llama-2-7bについてはクラウド上のGPUインスタンス(A100 1枚)の環境を立てて、ファインチューニングや推論を実施しました。

データの準備

理解度チェックテストは選択肢式のものがメインになりますが、答えが一つのみのパターンと複数あるパターンのものがあります。
今回は検証を簡単にするため、答えが一つだけの問題に絞って理解度チェックテストのデータセットを以下の形式で用意しました。

理解度チェックテストデータの準備
  • question: 問題文のテキスト

  • options: 選択肢のテキストのリスト

  • answer_index: 答えの番号

  • answer_text: 答えのテキスト

データセットのサイズとしては合計1361件となり、日本語だけでなくグロービス学び放題の海外版サービスである GLOBIS Unlimitedの英語コンテンツのテストも含まれています。

検証1. 理解度チェックテストをとりあえず全部解かせてみる

まずはとりあえずそのまま解かせてみます。
そのまま解かせるといっても、正解不正解を簡単に判定できるように回答してもらう必要があるので、以下のようなルールを設けます。

ルール

  1. 言語モデルには少なくとも選択肢の番号を生成文の頭に回答させるようにプロンプトに指示を加え、回答した番号で正解不正解を判定する

  2. テキストが正しくても、番号のみor番号付きで始まるテキストで回答していないものは不正解とする。

  3. その他、回答の条件に沿っていないものは全て不正解とする。

ChatGPT, GPT4

ChatGPTとGPT4には以下のようなプロンプトを指定して、回答を生成させました。

  • system prompt

あなたは優秀なビジネスパーソンです。
以下の指示に従ってください。
- クイズに答える場合は、答えの番号のみを回答してください。
- 例えば、1番の答えを選択する場合は、1とだけ答えてください。
  • user prompt

質問:{問題文}


1 {選択肢1}
2 {選択肢2}
:     :
N {選択肢N}

与えられた選択肢の中で質問に対する答えとして正しいものを一つ選び、その番号を答えなさい。
答え:

APIリクエストの実行は以下のような関数を用いて行います。

def query(
    input_prompt,
    model="gpt-3.5-turbo",
):

    system_role_content = """
    あなたは優秀なビジネスパーソンです。
    以下の指示に従ってください。
    - クイズに答える場合は、答えの番号のみを回答してください。
    - 例えば、1番の答えを選択する場合は、1とだけ答えてください。
    """
    
    messages = [{"role": "system", "content": system_role_content}]
    messages.append({"role": "user", "content": input_prompt})


    completion = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        max_tokens=1,
    )

    reply = completion["choices"][0]["message"]["content"]

    return reply

PaLM2

Googleが提供する大規模言語モデルで、2023/08/21時点で日本語対応版の一般提供が開始されたとのことでしたので、こちらも試してみることにしました。
Google AI PaLM 2 – Google AI
プロンプトはChatGPTやGPT4と同様のものを使用します。

回答の生成は以下のドキュメントに従って行います。
https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/text-bison?project=gdp-gldp-prod

Google Cloud SDKを使う環境が構築できていれば、以下のように簡単に回答生成のリクエストを実行する処理を書くことができます。

from vertexai.preview.language_models import TextGenerationModel

def interview(input_text, temperature: float = .0):

    parameters = {
        "temperature": temperature,
        "max_output_tokens": 1,   
        "top_p": 1.0                 
    }

    model = TextGenerationModel.from_pretrained("text-bison@001")
    response = model.predict(
        input_text,
        **parameters,
    )
    
    return response.text

Japanese StableLM

Stability.ai社が公開している日本語特化の大規模言語モデルです。
Japanese StableLMに関しては、Instructモデル(japanese-stablelm-instruct-alpha-7b )を使用しました。
プロンプトやパラメータについては、モデルページに載っている例を参考に用意しました。

  • プロンプト

以下は、タスクを説明する指示と、質問の組み合わせです。要求を適切に満たす応答を書きなさい。
指示: あなたは優秀なビジネスパーソンです。以下の指示に従って質問に答えてください。
    - 答えの番号のみを回答してください。
    - 例えば、1番の答えを選択する場合は、1とだけ答えてください。
    
質問:{問題文}


1: {選択肢1}
2: {選択肢2}
:     :
N: {選択肢N}
応答:
  • パラメータ
    デフォルト値だと指示した回答形式に従って回答を生成してくれないケースが目立ったため、なるべく一貫性をもった回答を生成するようtemperatureの値を小さく調整し検証を行いました。

input_ids = tokenizer.encode(
    prompt, 
    add_special_tokens=False, 
    return_tensors="pt"
)

output_ids = model.generate(
    input_ids.to(device=model.device),
    max_new_tokens=1,
    temperature=0.01,
    do_sample=True,
)

ELYZA-japanese-Llama-2-7b

ELYZA社が公開している日本語特化の大規模言語モデルです。
モデルはELYZA-japanese-Llama-2-7b-fast を使用しました。
プロンプトやパラメータについては、モデルページに載っている例に沿って、以下のような形で用意しました。

  • プロンプト

<s>[INST] <<SYS>>
あなたは優秀なビジネスパーソンです。
以下の指示に従ってください。
- クイズに答える場合は、答えの番号のみを回答してください。
- 例えば、1番の答えを選択する場合は、1とだけ答えてください。
    
<</SYS>>

質問:{問題文}


1: {選択肢1}
2: {選択肢2}
:     :
N: {選択肢N}

答え:  [/INST]
  • パラメータ
    ELYZAモデルの方はパラメータはデフォルト値のままでも、ある程度指示した回答形式に従って回答を生成してくれたので調整なしで検証を行いました。

input_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

output_ids = model.generate(
    input_ids.to(model.device),
    max_new_tokens=1,
    pad_token_id=tokenizer.pad_token_id,
    eos_token_id=tokenizer.eos_token_id,
)

結果

全理解度チェックテストのデータに対する各モデルの正答率の結果は下記のようになりました。

モデルごとの理解度チェックテストの正答率(小数点以下は切り捨てて表示しています)
  • ChatGPTについては、正答率は75%とそれなりに高い正答率ではあったものの、計算が絡むような問題を間違えていたりしていたので、そういったところが少しボトルネックになっていそうな雰囲気がありました。
    また、ビジネス専門用語の意味を問うような問題で、普通に聞いたら正しく答えられるのに、テスト形式だと間違えているような例もいくつか見受けられました。
    以上を踏まえると、ChatGPTに関してはやはりどのように知識を引き出すかの工夫が重要と言えそうです。

  • GPT4の結果は91%とChatGPTを上回る高い正答率となりました。知識だけでなく、入力文の解釈力、指示に従う性能という点でも、やはり高い能力を持ち合わせていると言えそうです。
    しかし、まだ正解率には少し伸び代があるので、グロービスのコンテンツにより特化させるような工夫の余地は残っているのではないかと言えます。

  • PaLM2に関しては最近日本語対応版がリリースされたということもあり、その性能はまだ未知数なところもありましたが、正答率82%とGPT4には及ばずともChatGPTを上回る好成績となりました。

  • 日本語大規模言語モデル(Japanese StableLM、ELYZA-japanese-Llama-2-7b)はプロンプトの書き方やtemperatureなど推論時のパラメータ調整にまだ工夫の余地があるのかもしれませんが、正答率は低い結果となりました。 しかしパラメータサイズがそもそもChatGPTやGPT4に比べると小さいモデルであることを踏まえると順当な結果とも言えるかもしれません。
    回答の傾向としては、「1」と回答しているケースが多くあったという点が見られました。 問題に答えるといった指示を十分理解できておらず、入力プロンプトの選択肢をそのまま繰り返して生成しているだけとなってしまっているケースが多いのではないかと考えられます。

検証2. ファインチューニングの効果はどれくらいあるのか

検証1では日本語大規模言語モデルの正答率は振るわなかったものの、これらのモデルに対してはファインチューニングを行うことができるので、それによってどこまで改善するかを次に検証してみました。

また、ちょうどOpenAIからChatGPTのファインチューニング機能の公開も発表されたので、その効果についても合わせて確かめてみました。
GPT-3.5 Turbo fine-tuning and API updates

学習データとテストデータの準備

理解度チェックテストのデータを学習用(1261件)とテスト用(100件)にランダムに分け、学習用のデータを用いてファインチューニングを行い、正答率がどれくらい変化するか検証しました。

日本語大規模言語モデルのファインチューニング

学習用データ
ファインチューニングにおいては、以下のような形で、問題文と選択肢をそのまま渡して、回答を番号付きで生成させられるよう正解データを用意してみました。

{問題文}
1: {選択肢1}
2: {選択肢2}
:     :
N: {選択肢N}

答え: {正解の選択肢番号}: {正解の選択肢文}

モデル
検証1で用いたモデルと同じものに対し、LoRAファインチューニングを行いました。
LoRAファインチューニング
LoRA(Low-rank Adaptaion)と呼ばれるファインチューニングの手法で、事前学習済みモデルのパラメータを全て固定したまま、各transformerレイヤの重み行列に対して低ランク行列の積に分解したパラメータ行列を注入することを考え、それらを学習対象とすることで、全パラメータをチューニングするよりもはるかに学習させるパラメータの数を減らすことができます。
この方法によって、限られた計算リソースでも大規模言語モデルのファインチューニングを実施することができます。

ファインチューニングの実装についてはCourseraのコースGenerative AI with Large Language Modelsのハンズオンなどを参考にさせていただきながら行ないました。

以下、LoRAファインチューニングで用いたコードのイメージになります。

from datasets import Dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import TrainingArguments, Trainer
from transformers import DataCollatorForLanguageModeling

from peft import LoraConfig, get_peft_model, TaskType # LoRAファインチューニング用のライブラリ

model_name = "<モデル名を指定>"
output_dir = "<ファインチューニング後のモデルパラメータなどの保存先>"

# DataFrameからデータセットを作成
ds_train = Dataset.from_pandas(df_train)

# トークナイザとモデルをロード
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")

def preprocess(examples):
		# データセットの前処理を行う関数
    ...

# データセットに対して前処理を実施
tokenized_dataset = ds_train.map(lambda examples: preprocess(examples), batched=True)

# LoRAファインチューニングのパラメータ
lora_config = LoraConfig(
    r=32, # Rank
    lora_alpha=64,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    fan_in_fan_out=False,
    task_type=TaskType.CAUSAL_LM
)

# ファインチューニングのパラメータをモデルに適用
peft_model = get_peft_model(model, lora_config)

# Data Collatorを用意(学習を効率良く行うためのもの)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

# 学習のパラメータなどを指定
training_args = TrainingArguments(
    output_dir=output_dir,
    auto_find_batch_size=True,
    learning_rate=5e-4,
    fp16=False,
    bf16=True,
    num_train_epochs=5,
    save_strategy="steps",
    save_steps=500,
    weight_decay=0.01,
    logging_steps=500,
    report_to="none"
)

# 学習を行うためのTrainerにモデルなどを渡す
trainer = Trainer(
    model=peft_model,
    args=training_args,
    data_collator = data_collator,
    train_dataset = tokenized_dataset
)

# 学習実行
trainer.train()

ChatGPTのファインチューニング

詳細は下記OpenAIのドキュメントなどを参照いただければと思いますが、こちらでも簡単に手順だけまとめておきます。
GPT-3.5 Turbo fine-tuning and API updates

  • データセットの用意
    以下のような.jsonlファイルを用意します。

{"messages": [{"role": "system", "content": "あなたは優秀なビジネスパーソンです。\n    以下の指示に従ってください。\n    - クイズに答える場合は、答えの番号のみを回答してください。\n    - 例えば、1番の答えを選択する場合は、1とだけ答えてください\n    "}, {"role": "user", "content": "質問:<質問文>\r\n\n1 {選択肢1}\n2 {選択肢2}\n3 {選択肢3}\n4 {選択肢4}\n\n与えられた選択肢の中で質問に対する答えとして正しいものを一つ選び、その番号を答えなさい。\n答え: "}, {"role": "assistant", "content": "3"}]}
{"messages": [{"role": "system", "content": "あなたは優秀なビジネスパーソンです。\n    以下の指示に従ってください。\n    - クイズに答える場合は、答えの番号のみを回答してください。\n    - 例えば、1番の答えを選択する場合は、1とだけ答えてください\n    "}, {"role": "user", "content": "質問:<質問文>\r\n\n1 {選択肢1}\n2 {選択肢2}\n3 {選択肢3}\n4 {選択肢4}\n\n与えられた選択肢の中で質問に対する答えとして正しいものを一つ選び、その番号を答えなさい。\n答え: "}, {"role": "assistant", "content": "1"}]}
					:
  • データセットファイルのアップロード

curl https://api.openai.com/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@path_to_your_file" 

アップロードに成功したらファイルのidの情報などが返ってきます。

<File file id=<FILE_ID> at 0x14f286750> JSON: {
  "bytes": 1323188,
  "created_at": 1692748053,
  "filename": "file",
  "id": "<FILE_ID>",
  "object": "file",
  "purpose": "fine-tune",
  "status": "uploaded",
  "status_details": null
}
  • ファインチューニングジョブを実行
    上でアップロードしたファイルのidをtraining_fileの値として指定します。

curl https://api.openai.com/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d "{\"training_file\":\"$TRAINING_FILE_ID\", \"model\": \"gpt-3.5-turbo-0613\"}"

ファインチューニングジョブが完了したらメールが届いていて、そこからモデルの名前(ft:gpt-3.5-turbo:org_id)を確認できます。
Playgroundのページの一覧にも反映されているので、そこからも確認可能です。

  • ファインチューニングしたモデルを使用する
    通常のAPIリクエスト実行時のモデルを指定する部分で、ファイチューニング後のモデル名を指定すればOKです。

import openai

model = "<ファインチューニング後のモデル名>"
messages = [
	{"role": "system", "content": system_role_content},
	{"role": "user", "content": input_prompt}
]
completion = openai.ChatCompletion.create(
                model=model,
                messages=messages
            )

結果

  • Japanese StableLM

テストデータに対する、Japanese StableLMのファインチューニング前後の正答率の比較
  • ELYZA-japanese-Llama-2-7b

テストデータに対する、ELYZA-japanese-Llama-2-7b-fast-instructのファインチューニング前後の正答率の比較
  • ChatGPT

テストデータに対する、ChatGPTのファインチューニング前後の正答率の比較

Japanses StableLM、ELYZA-japanese-Llama-2-7b、ChatGPTいずれのケースも正答率の改善が見られました。特にELYZA-japanese-Llama-2-7bは正答率26%→52%と、かなり大幅に上がる結果となりました。

一つの見方としては、理解度チェックテストの出題形式やパターンを学習して、何をすれば良いかをモデルがより正確に理解できるようになり、回答に必要な知識をよりうまく反映させることができるようになった結果なのではないかということが考えられます。

このことから、ファインチューニングによって、特定のやり取りを行うユースケース(ここでは理解度チェックテストに回答するというユースケース)に、より沿った回答ができるようになることが確認できたとも捉えられそうです。

また、今回は理解度チェックテストの中からランダムに学習データとして1261件ほどサンプリングして用いましたが、ファインチューニングに最適なデータの質やサイズになっているかという点において改善の余地がある可能性もあります。
とりあえずこれくらいの規模のデータがあればファインチューニングの効果が期待できるという一つの目安の確認にはなりましたが、学習用データの質を向上させ、量も増やすことができれば精度の改善もより見込めるのではという期待を持つこともできるかと思います。

検証3. ファインチューニングとfew-shot promptingを比べるとどうか

検証2.ではファインチューニングによって、「ユースケースに沿った回答を生成する能力が上がる」ということに繋がる可能性を感じることができました。
一方で、few-shot promptingと呼ばれる、回答の精度や質を向上させるために入力プロンプトに回答例を含ませるプロンプトエンジニアリングのアプローチによっても、同じような効果を期待することができます。

理解度チェックテストのデータでfew-shot promptingを行う場合は以下のようなイメージになります。

例題:{例題の質問文}

1 {例題の選択肢1}
2 {例題の選択肢2}
:     :
N {例題の選択肢N}

与えられた選択肢の中で質問に対する答えとして正しいものを一つ選び、その番号を答えなさい。
答え: {例題の答えの番号}

質問:{質問文}

1 {選択肢1}
2 {選択肢2}
:     :
N {選択肢N}

与えられた選択肢の中で質問に対する答えとして正しいものを一つ選び、その番号を答えなさい。
答え:

few-shot prompting

few-shot promptingによる回答例の含ませ方は色々な方法が考えられますが、今回は以下の4パターンでfew-shot promptingを行い、テストデータの正答率がどう変わるかを確かめてみました。

  1. 固定した1個の例題をプロンプトに含ませる
    学習データにあるものから1つ問題と回答を選び、テストデータのすべての入力プロンプトに例題として含ませます。

  2. ランダムに1個の例題を選び、プロンプトに含ませる
    テストデータの入力プロンプトごとに、学習データからランダムに1個問題と回答を取得して、例題として含ませます。

  3. ランダムに2個の例題を選び、プロンプトに含ませる
    テストデータの入力プロンプトごとに、学習データからランダムに2個問題と回答を取得して、例題として含ませます。

  4. 内容の似た問題を例題として1個選び、プロンプトに含ませる
    テストデータの入力プロンプトの内容と似た問題を学習データから取得し、例題として含ませることも試しました。

    詳細は割愛しますが、ここでは内容の似た問題の抽出をLlamaIndexのGPTVectorStoreIndexのRetriever機能を使って以下のように簡易的に実装しました。気になる方はLlamaIndexのドキュメントなどもチェックしてみてください。

import os
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader

# 学習データの問題文(input_prompt)のテキストデータをファイルに出力
train_data_dir = "PATH_TO_TRAIN_DATA_DIRECTORY"
for _, row in train.iterrows():
    with open(os.path.join(train_data_dir, "{}.txt".format(row["id"])), "w") as f:
        f.write(row["input_prompt"])

# 出力したファイルをDocumentとしてロードする
documents = SimpleDirectoryReader(train_data_dir).load_data()

# Documentの一覧からベクトルインデックスを構築する
quiz_prompt_index = GPTVectorStoreIndex.from_documents(documents)

# Retrieverとして使えるようにして、テストデータの問題文を渡すと、関連度の高い学習データの問題文を取得できるようにする。
quiz_prompt_retriever = quiz_prompt_index.as_retriever(similarity_top_k=1)

test_prompt = "<テストデータの問題文(入力プロンプト)>"
result = quiz_prompt_retriever.retrieve(sample_prompt)
few_shot_sample = result[0].node.text

結果

テストデータ(100件)に対する正答率の結果は、ファインチューニングの結果も合わせて比較すると以下のようになりました。

テストデータに対する、アプローチごとのモデルの正答率の比較

いくつかfew-shot promptingを試しましたが、いずれも正答率改善には繋がらなかった結果となりました。

ただ問題例を闇雲に示すだけではあまり意味がないみたいで、むしろ余計な情報が加わることによって精度が下がっているような気もします。この結果からは、何も考えずにfew-shot promptingするのは適切ではないと言えそうです。

また、似たような問題を例題に含ませてみても改善は見られず、few-shot promptingにおいて適切な例を示すための調整を自動で行うことの難しさも感じました。

一概には言えませんが、ここでの結果だけ見ると、ファインチューニングの方が適切な回答を返すようにモデルを調整するという点では高い効果が期待できそうな雰囲気があります。

まとめ

今回「ChatGPTはどれくらいグロービス学び放題のコンテンツで扱っている内容の知識を持っているのだろう?」という疑問から、愚直にChatGPTや他の大規模言語モデルの性能を確かめるところに加え、ファインチューニングやfew-shot promptingもいくつか試すところまでやってみましたが、以下のような示唆が得られたと感じています。

  • ChatGPTをそのまま使うだけではなく、ドメインの情報をうまく引き出す工夫や、情報を付加する工夫を施すことが独自の価値につながる重要なポイントと思われる。

  • GPT4やPaLM2はやはり高い言語理解能力を持ち合わせていることが確認できたが、タスクやドメインに特化させるための調整の余地はまだ残っていそう。

  • ChatGPTや日本語大規模言語モデルのファインチューニングの結果からは、ファインチューニングはドメイン固有タスクにより特化させるための有力な選択肢になりうることが確認できた。

  • 特に日本語大規模言語モデルに関して、ファインチューニングによる正答率改善の効果が大きく見られたことから、タスクによっては適用する機会も今後十分ありうるのではないかという可能性を感じることができた。

  • few-shot promptingについては、今回のケースでは効果は見られなかったが、適用するタスクによっては有効な手段となり得るので、ファインチューニングとの併用だったり、「few-shot promptingでクイックに試す ⇒ 効果が十分でなければファインチューニングを試す」のようなアプローチの仕方を今後取っていくのもありなのではないか。

また、今回は時間とリソースの都合上、日本語大規模言語モデルについては2種類のみをピックアップして試しましたが、他にもいくつか公開されているものもあるので、引き続き動向をキャッチアップしていき、活用の機会がありそうでしたら積極的に実験して試していきたいと思いました。

最後に

グロービスではChatGPTの登場以降、ユーザーの学びを支援するためのAI活用というテーマで色々な機能開発や検証などが積極的に進められており、データサイエンスチームとしてもその文脈において、今回ご紹介した内容の他にも様々な取り組みを行なっています。

この記事をきっかけに少しでもグロービスのデータサイエンスチームの活動に興味を持たれた方がいらっしゃったらお気軽にご連絡ください。

最後までお読みいただきありがとうございました。


この記事が気に入ったらサポートをしてみませんか?