LlamaIndex と OpenAI API で自社サービスの仕様書から 4 択の選択問題を自動作成できるか試してみた
はじめに
こんにちは、アノテーション の中野です。
LlamaIndex を使うと手元に持っている大量のオリジナルのデータに特化した質疑応答や文章の自動作成をおこなうことができます。
LlamaIndex に関する情報は以下を参照ください。
今回は LlamaIndex と OpenAI API を使用して、自社サービスの仕様書から選択問題を自動生成できるか試してみました。
本エントリは、人手をかけて問題を作成する手間を省き、自動化の可能性を探るための実験的なブログです。
新しく入社した新人の方や別部署から異動してきた方へのオンボーディングで、自社サービスの仕様を説明したり本当に理解しているかチェックするのは、なかなか手のかかることなのではないでしょうか。
特に評価者の属人的な評価によって、新人が独り立ちしたかどうかを判断してしまうと、正当な評価基準がぶれてしまうことは一般的によくあることかと思います。
そういった状況で、LamaIndex と OpenAI API のような技術を利用して、自動作成したテストの結果に対する共通の合格基準で判断するのも一つの手ではないかと筆者は考えています。
前提
とはいえ、自社サービスの情報を読み込ませるのは OpenAI 側に学習されてしまって危険ではないのかという、懸念があるのではないでしょうか。
この点は、安心ください。以下のような特徴から、学習されたりすることはありません。
- LlamaIndex はオリジナルデータを元に作成したインデックスをローカルに保存
- OpenAI はユーザがオプトインしない限り、送信したデータが学習に利用されることはない
注意点としては、Web 版の ChatGPT を利用する場合には学習されてしまうため、くれぐれも Web 上に自社情報を記載して問題作成しないようにご注意ください。
このあたりの詳細は以下の DevIO ブログがありますので、よく読んでご利用ください。
やってみた
問題作成用データ
今回は、クラスメソッドのサービスである「クラスメソッドメンバーズサービス仕様書」を使って選択問題を作成してみます。
環境情報
- macOS Ventura 13.2.1 (Intel)
- Python 3.8.12
- pip 23.0.1
- llama-index 0.4.28
インストール
LlamaIndex をインストールしてください。
pip install llama-index
また、コードの実行には、OpenAI の APIKey が必要ですので OpenAI のコンソールから取得して環境変数に設定します。
$ export OPENAI_API_KEY={取得したAPIキー}
自社サービス情報のインデックス作成コード
Web サイトの情報からインデックスを作成するコードです。
tmp/members.txt
にインデックス化したい URL の一覧を記載します。
また、インデックスは index.json
としてローカルに保存されます。
import csv from llama_index import GPTSimpleVectorIndex, SimpleWebPageReader from llama_index.langchain_helpers.chatgpt import ChatGPTLLMPredictor article_urls = [] with open('tmp/members.txt') as f: reader = csv.reader(f) for row in reader: article_urls.append(row[0]) documents = SimpleWebPageReader().load_data(article_urls) index = GPTSimpleVectorIndex(documents, llm_predictor=ChatGPTLLMPredictor()) index.save_to_disk('index.json')
なお、tmp/members.txt
配下には、URL を入力しておきます。
以下のようなファイルを用意しました。
https://members.classmethod.net/members-docs/en/ https://members.classmethod.net/members-docs/en/about.html https://members.classmethod.net/members-docs/en/members/index.html https://members.classmethod.net/members-docs/en/members/index.html#id4 https://members.classmethod.net/members-docs/en/members/index.html#id8 --- 以下省略 ---
以下のようにスクリプトを実行すると、index.json
が作成されます。
$ python llamaindex_tuning.py
選択問題作成コード
from llama_index import GPTSimpleVectorIndex, LLMPredictor from langchain import OpenAI llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, max_tokens=300)) index = GPTSimpleVectorIndex.load_from_disk("index.json") question = "Create a choice question with four options with mixed right and wrong. Tell me which is the correct answer." answer = index.query(question, llm_predictor=llm_predictor) print(answer)
index.json
からロードした情報に対してクエリを発行します。
今回は英語で質問を投げかけています。
以下のような日本語の文章を DeepL に翻訳かけて、英語にしてもらいました。
翻訳前:正解・不正解が混在する4つの選択肢を持つ選択問題を作成して。どれが正解か教えてください 翻訳後:Create a choice question with four options with mixed right and wrong. Tell me which is the correct answer.
スクリプトの実行は以下のように実施します。
実行結果として、選択問題がレスポンスされます。
$ python llamaindex_inference.py
出力結果
例 1:「メンバーズ加入時に作成されたリソースの変更方法」
出力結果は以下です。
Q: What should you do if you want to change the settings of AWS resources created by Members? A. Contact AWS Support directly B. Opt-in on the Members Service Settings screen C. Use ServiceControlPolicy of AWS Organizations D. Add your email address to the “Alternate Contacts” in the Account Setting page of AWS Management Console. Correct Answer: B. Opt-in on the Members Service Settings screen
DeepL で翻訳してもらった結果は以下です。
Q:メンバーが作成したAWSリソースの設定を変更したい場合、どうすればよいですか? A. AWSサポートに直接ご連絡ください B. 会員サービス設定画面でのオプトイン C. AWS組織のServiceControlPolicyを使用する。 D. AWS Management Consoleのアカウント設定画面の「代替連絡先」にメールアドレスを追加してください。 正解です。B. メンバーズサービス設定画面でオプトインする
この情報はどこから引っ張ってきたのか、元の利用データを確認してみました。 以下の関連ページが該当するように見受けられました。
さらに、FAQ のページを確認すると、メンバーズ加入時に作成される AWS リソースのオプトインに関する情報があります。
しかしながら、以下の引用箇所から、厳密には元データの情報と回答がずれているように思えます。
I want to change the settings of AWS resources, which are created by Members (e.g. S3 bucket, CloudTrail) If a resource does not have a CM Managed label, you are free to delete or change its settings. However, for those with an opt-in label, opting in on the Members Service Settings screen may override some settings.
例 2:「AWS Billing Console にある解約ボタンを誤って押した場合の対処」
次の出力結果は以下です。
Q1: What should you do if you pressed the Close Account button on the AWS Billing Console by mistake? A. Contact AWS Support B. Contact Members Portal C. Cancel the AWS account D. Change the Members plan Answer: B. Contact Members Portal
DeepL で翻訳してもらった結果は以下です。
Q1:AWS Billing ConsoleのClose Accountボタンを間違えて押してしまった場合、どうすればよいですか? A. AWSサポートに問い合わせ B. メンバーズポータルで問い合わせ C. AWSのアカウントを解約する D. メンバーズプランを変更する 回答 B. メンバーズポータルで問い合わせ
こちらの回答は、合っているようです。
以下の FAQ ページにある内容から問題は作成されたように見受けられます。
What should I do if I pressed the Close Account button on the AWS Billing Console by mistake? Since the operations related to closing an account are restricted, the account cancellation will not be executed even if you press the button by mistake. If you wish to close an AWS accout, please contact us.
これは、FAQ のような一問一答形式の記事から問題を作成することは容易にできるのではないかということを示唆しているのではないでしょうか。
ただし、元データの文章が複雑ではなかったため作成が容易だったという可能性もあります。
一方で、弊社では、AWS テクニカルサポートノートという QA 形式の技術ブログがありますので、こういったナレッジから選択問題を作成することは比較的簡単にできるのではと考えています。
さいごに
今回は検証レベルでしたが、精度を出したり期待したもの作るのは簡単ではないことがわかりました。
ただし、FAQ等のデータから情報をとってきて、選択問題を作成するのは割と作りやすいのではないでしょうか。
また、うまく出力されない場合も、問題作成する側でしっかりエビデンスを確認して適宜修正してあげることで、ある程度は問題作成時間の工数削減に寄与するのではないかと思います。
一方で、今回うまくいかなった原因は、以下ではないかと筆者は考えています。
(専門家ではないのでこれだけではないと思いますが、その他考えられる原因がありましたら、教えていただけると助かります).
- データの少なさ
- 文章の文脈(プロンプト)が十分に補っていない
- 筆者の質問の仕方が下手
- LlamaIndex の使い方
2023 年 3 月 16 日現在は、GPT-4 がリリースされていますが、GPT-4 API は WhiteList となっており順番待ちとなっています。
以下公式ドキュメントにも、デフォルトでは OpenAI API のモデルは GPT-3 のtext-davinci-003
が使われることが記載されています。
今後、GPT-4 の API が利用できるようになったら、選択問題作成の精度も上がるか検証して比較してみたいです。
By default, we use the OpenAI GPT-3 text-davinci-003 model.
今後の性能アップによって問題作成の自動化が現実的になっていく未来が待ち遠しく感じて筆者はワクワクしています。
参考資料
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。