見出し画像

大規模言語モデルの学習 − RAGを用いたシステムの場合 −

こんにちは、ファイマテクノロジーの佐藤です。

今日は、私たちが提供しているChatGPTを活用したソリューションの一つ、RAG(Retrieval Augmented Generation)を用いた受託開発や研究支援サービスについてお話しします。

RAGを活用することで、インターネット上の情報や社内文書に基づいて質問に答えるシステムを構築できます。これにより、一般的なChatGPTのシステムで発生しがちなハルシネーション(不正確な回答)が起きにくくなり、ChatGPTが学習していない社内や専門分野の質問にも答えられるという大きな利点があります。

RAGシステムの精度は、質問内容に関連する情報をどれだけ正確に見つけ出せるかにかかっています。そこで今回は、RAGを用いたシステムで質問に関連する情報をより高精度に見つけるための、大規模言語モデルの学習方法をご紹介します。

専門的な文書の埋め込みが正確に生成されないことが多いため、専門性の高い文書からデータセットを作り、埋め込みモデルをファインチューニングすることでこの課題を解決しようと試みました。

人手による学習データの準備には膨大な工数がかかりますが、専門性の高い文書からChatGPTを用いて教師データを自動生成することで、このプロセスを効率化しました。これにより、「社内文書はあるが、学習データがない」という方々にも役立つ情報を提供できると考えています。

モデルの学習や開発環境には、AWSのAmazon SageMaker Studioを利用しました。SageMaker Studioの使い方については、別の機会にご紹介したいと思います。

それでは、RAGと大規模言語モデルの活用方法について詳しく見ていきましょう。

学習用データセット作成

今回は専門性の高い文書の代わりに、webスクレイピングでデータを収集しました。学習には一定のデータがあった方が良いので、wikipediaの長いページを参照して、2022年のテレビ番組情報からスクレイピングしてデータを作成しました。

具体的には2022年のテレビ番組情報からスクレイピングした文のうち、20文字よりも長いものだけを集めたテキストファイル(2022_wiki.txt) を作成しました。次に、2022_wiki.txtをもとに質問文と回答の根拠となる文を格納した2022_generated_questions.jsonlをgpt-4oを用いて生成しました。以下gpt-4oへのプロンプトで、一度の入力で50個の質問を生成させ、合計約1000個の質問を生成しました。

system_prompt = f"あなたは以下の情報に対する専門家です:\n\n{manual_section}\n\n" user_prompt = (f"入力された情報に基づき {num_questions} 個の質問を生成してください。回答の根拠となる文をそのまま抜き出し\n" "1. 質問:質問文\n" "根拠:回答の根拠となる文\n" "のフォーマットで生成してください。")

文埋め込みモデル学習

AWSのAmazon SageMakerを用いてモデルの学習を行いました。

日本語SimCSEの学習

今回は日本語の良い文埋め込みを作りたいということで日本語SimCSEを使用します。同サイトからgit cloneしたコードを以下のように実行すれば環境を構築し、学習が実行されます。また学習にはこちらのBERTを利用しています。

# 環境構築 pip install poetry poetry install # 学習の実行 poetry run python src/train_sup.py \ --model_name cl-tohoku/bert-base-japanese-v3 \ --dataset_name jsnli \ --batch_size 512 \ --lr 5e-05 \ --gradient_checkpointing \ --save_model \ --save_model_name cl-nagoya/sup-simcse-ja-base \ --device "cuda:0"

作成したデータセットを用いた学習

これで環境は整ったので、作成したデータセットを用いて日本語SimCSEを学習していきます。学習方法としては質問と回答の根拠となる文の埋め込みを作成して、ベクトル間のコサイン類似度をとってクロスエントロピー損失を計算します。損失に基づいて勾配を計算してモデルのパラメータを更新します。詳細はtrain_QA.pyを確認いただけたらと思います。コマンドラインとしては以下を実行すれば学習が行われます。

poetry run python src/train_QA.py \ --model_name cl-tohoku/bert-base-japanese-v3 \ --batch_size 512 \ --lr 5e-05 \ --gradient_checkpointing \ --save_model \ --save_model_name cl-nagoya/sup-simcse-ja-base-QA \ --device "cuda:0"

検索能力の評価

このように学習したモデルを評価しましょう。学習前のcl-tohoku/bert-base-japanese-v3とNLIデータセットを学習したsup-simcse-ja-base-nli、生成したデータを学習したsup-simcse-ja-base-QAの性能を比較します。評価方法としては、文埋め込みモデルで2022_wiki.txtからfaissファイルを作成してデータベースとし、2022_generated_questions.jsonlの質問文に対する回答を検索します。検索した結果、類似度の高かったもの10個を取り出し、その中に根拠となる文が含まれているかの精度を評価します。結果は以下のとおりです。学習前のモデルよりも精度が高くNLIデータを学習したものよりも良い性能のモデルになっていることが確認できました。

精度 (%)
cl-tohoku/bert-base-japanese-v3→ 39.79 (%)
sup-simcse-ja-base-nli→ 66.09 (%)
今回生成したデータを学習(sup-simcse-ja-base-QA) →75.32 (%)

まとめ

今回の実装では、webスクレイピングでデータをもとにデータセットを作成し、作成したデータセットをもとにAWS上で日本語SimCSEをファインチューニングしました。大規模言語モデルは世界中で日々研究が行われており、ファイマテクノロジーでは、論文のリサーチにより最新の技術動向を調査し、お客様のニーズに合わせて最適な提案をしています。ChatGPT活用をご検討中の方は、ぜひファイマテクノロジーにご相談ください。

お問い合わせはこちら👇

公式Twitter

公式Facebook
https://www.facebook.com/feynmatechnology/

公式HP:https://feynma.com/

この記事が参加している募集

#企業のnote

with note pro

13,012件

#AIとやってみた

29,030件