GPT-3.5-Turboをfine-tuningすることで、RAGを使った社内QAボットの処理を4倍以上高速化してみた

GPT-3.5-Turboをfine-tuningすることで、RAGを使った社内QAボットの処理を4倍以上高速化してみた

Clock Icon2023.10.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

TL;DR

社内情報に関する質問応対システムにおいて、回答生成にかかる時間を短縮することを目的に、処理にかかっている時間を分析し、時間を短縮する方法を考えて実験しました。

現在のシステムの処理にかかっている時間を分析した結果、ドキュメント抽出処理を行っているLLMをfine-tuningすることで、回答生成に不要な情報が抽出されなくなり、応答時間の削減が見込まれるという仮説が得られました。

検証実験を行った結果、fine-tuningをしたことによって重要な情報を抽出でき、チャットボットの回答生成が早くなる見込みが得られました。

はじめに

新規事業部インターンの菊地です。

新規事業部では、現在、社内情報に関する質問に回答する質問応対システムの構築に取り組んでいます。このシステムは社内のドキュメントを読み込んで質問に回答してくれるシステムで、Classmethodの社員であれば誰でも使用することができるようになっています。

このシステムは社内で試用中で、ユーザレビューの結果、生成された回答の約70%に対してがユーザが「満足した」と評価しました ( 私も実際に使っているのですが、概ね期待する回答が得られています) 。

しかし、質問をしてから回答が生成されるまでの時間は平均30秒〜1分程度もかかっています。この時間は体感としては遅く、ユーザに不快感を与えかねません。

そこで、今回はこのシステムの応答速度を削減することを試みます。本記事では、システムの処理内容について分析した結果、どのような手法を用いれば、応答時間を改善できると考えられたのかについて説明します。

前提の説明

システムの構成

質問応対システムでは Retrieval Augmented Generation ( 以下、RAG ) の仕組みを利用しています。RAGとは、社内情報のようなLLMの学習時に含まれていない内容に関する質問に回答させるための枠組みのことです。RAGでは、ユーザからの質問に回答するために必要そうな内容が書かれたドキュメントを検索し、その文章をLLMへの入力(プロンプト)に付け加えて渡すことで、ユーザが欲しい情報に関して回答させることができます。RAGの詳細については、こちらの記事をご覧ください。

RAGを使った社内情報を回答できる生成AIボットで業務効率化してみた | DevelopersIO

次に、システムの処理内容を説明します。回答生成は以下に示すように3つの段階に分けて行われます。

  1. Retrieve

    ユーザから入力された質問をもとにデータベースをエンタープライズ検索し、該当するドキュメントをn件取得する

  2. Read

    取得されたn個の各ドキュメントから、質問に関係がありそうな情報を抽出する。情報の抽出にはgpt-3.5-turboを使用

  3. Compose

    抽出された情報と質問をもとに回答を生成する。回答生成にはgpt-4を使用

処理時間の内訳 ( Latency )

システムは上記の3つの処理を段階的に行っています。平均処理時間は次のようになります。

全体: 32.6 [s]

  • Retrieve: 1.22[s]
  • Read: 12.68[s]
  • Compose: 18.65[s]

この結果からReadとComposeが処理時間の大部分を占めていることが見て取れます。これらの処理にかかる時間を短縮することで応答速度の向上が期待されます。今回はまず、Read処理時間を短縮することを試みます。

Readの処理時間と抽出情報のトークン数との関係

以下の記事によれば、OpenAIのChatCompletion APIの処理時間は出力トークン数と比例関係にあると言われています。

この結果から、Read処理の抽出する情報 (=出力トークン数) を減らすことができれば、結果的にシステムの応答速度を向上させることができるのではないか、と考えました。

OpenAIのChatCompletion APIの処理時間は出力トークン数に比例してそうだった | DevelopersIO

事前分析

サンプルを見てみる

Read処理では、各ドキュメントの文章と質問を加えたプロンプトを入力として、対応するドキュメントから情報を抽出した結果がリストとして出力されます。Read処理で抽出される情報は実際にどのようになっているのか確認してみました。

以下が質問と抽出された情報の例です。抽出された情報を見ると、質問に関係のない情報が抽出されている場合がありました。

そこで、次節のような仮説を立てました。

質問

Slackでアンケートを取る方法があると聞いてます。方法を教えてください。

あるドキュメントに対応するRead処理のプロンプト

ユーザからの質問と、その回答として利用できるかわかっていないドキュメントがあります。
ドキュメントからユーザの質問に対する回答となる情報を取り出してください。
ドキュメントはデータベースに保存されており、そのファイルパスが与えられます。

## 制約
- 質問に対する回答となる情報のみ出力してください
- 少しでも関係ない情報は出力しないでください
- 回答となる情報は箇条書きで出力してください。
- 出力はJSON形式で、Stringのリストで出力してください
- 質問に対する回答となる情報がない場合は空のリスト"[]"を出力してください。
- ファイルパスが質問に関係ない場合は、空のリスト"[]"を出力してください。
- ファイルパスが質問に関係あっても、内容が質問に関係ない場合は、空のリスト"[]"を出力してください。

## ユーザからの質問
Slackでアンケートを取る方法があると聞いてます。方法を教えてください。

## ドキュメントのファイルパス
社内公式情報/【FAQ】社内システムよくある問い合せ/Slack/Slackでアンケートを取る方法があると聞いてます。方法を教えてください。.pdf

## ドキュメントの内容
Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。

1

Slackでアンケートを取る⽅法が
あると聞いてます。⽅法を教えて
ください。

タグ

Slack アンケート

最終更新⽇時

【回答】

以下 ⼿順書ご参照ください。

はじめに

Slack には⾊々な拡張機能があり、アンケートを取る⽅法はいろいろとあると思い
ますが、このページは Polly を⽤いた⽅法を紹介します。

準備

利⽤するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが
参加しているかどうかはメンバーリストから確認できます。
参加させる場合は以下を⼊⼒し招待します。

/invite @Polly

招待に成功すると、以下のように表⽰されます。

使い⽅
アンケートを作成
Pollyに質問⽂と選択肢を伝えるだけです。

@2023年2⽉25⽇ 20:36

抽出された情報

[
  [
    "以下手順書ご参照ください。",
    "はじめに",
    "Slack には色々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますが、このページは Polly を用いた方法を紹介します。",
    "準備",
    "利用するにはアプリ「Polly」を チャネルに招待 する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。",
    "参加させる場合は以下を入力し招待します。",
    "/invite @Polly",
    "招待に成功すると、以下のように表示されます。",
    "使い方",
    "アンケートを作成",
    "Pollyに質問文と選択肢を伝えるだけです。"
  ],
  [
    "Slackでアンケートを取る⽅法があると聞いてます。⽅法を教えてください。"
  ],
  [
    "Slackで投票アンケートが作成できるPollyの使い方についての紹介です。",
    "https://lab.sonicmoov.com/tool/slack-polly/",
    "Slackには様々な拡張機能があり、アンケートを取る方法はいろいろとあると思いますがPollyを用いた方法を紹介します。",
    "利用するにはアプリ「Polly」をチャネルに招待する必要があります。既にPollyが参加しているかどうかはメンバーリストから確認できます。"
  ],
  [
    "Slackの活用をしたい方、アプリやWebhookなどテクニカルな内容、リンクなどを記載しています。",
    "通常の利用方法はSlack利用ガイドラインをご覧ください。",
    "便利なアプリ、ツールについて #05-internal-feedback チャンネルで教えてください!",
    "多くの人の同意を得られたものは追記していきます。",
    "Slack Enterprise Gridについて",
    "クラスメソッドではSlackは1つのワークスペースではなく、Slack Enterprise Gridとして複数のワークスペースをまとめて一元管理しています。",
    "詳細は以下の資料をご覧ください。",
    "ワークスペースの構成についてはSlackの構成とワークスペース間連携もあわせてご覧ください。",
    "Slack Enterprise Gridの関係資料",
    "Slackのアプリインストール/アンインストールについて",
    "アプリはできるだけ公式から入手しましょう",
    "インストールする前に!そのアプリ、セキュリティは大丈夫?",
    "Slackアプリの挙動を確認したい場合、Sandboxワークスペースを活用してください",
    "アプリの作成方法などお役立ちリンク",
    "外部との連携 Slack コネクトとゲスト",
    "便利ツール/ノウハウ・Tips"
  ],
  [
    "Slackでアンケートを取る方法については、ドキュメントには関連する情報がありません。"
  ],
  [
    "Slack利⽤ガイドライン",
    "はじめに",
    "ℹここにはSlackを社内利⽤するうえで必要な「守るべきルール(Must)」と「こうした⽅が良い(Shoud)」、「申請⽅法」をまとめています。",
    "「こうすると便利」「テクニカル情報」「Tips」は Slack 活⽤・テクニカル編 をご覧ください。",
    "もしあなたがSlackを使ったことがあり「こうするといいよ!」というアドバイスがあれば",
    "#05-internal-feedback チャンネルで教えてください!",
    "多くの⼈の同意を得られたものはこちらのページや、活⽤・テクニカル編に追記していきます。",
    "Slack上のコミュニケーションについて",
    "クラスメソッドグループ内でチャットを利⽤する際に、各⾃⼼がけていただきたい",
    "ことです。",
    "定期的にアナウンスも⾏っていますので、皆さんご認識と実践をお願いします。",
    "Slack上のコミュニケーションについて",
    "ルール/ガイドライン",
    "Slackアプリ/外部連携/テクニカル/便利ツール/ノウハウ"
  ],
  [
    "Slackの運⽤ノウハウ、Tipsなどをまとめています。使いやすいものを参考にしてみてください。",
    "通常の利⽤⽅法は Slack利⽤ガイドライン をご覧ください。",
    "便利な使い⽅、ノウハウについて #05-internal-feedback チャンネルで教えてください!",
    "タスク管理について",
    "ブックマーク(後で)",
    "Backlog・・・作業依頼",
    "Notion・・・チーム全体への周知事項",
    "Slackアプリを⽤いたもの",
    "便利な機能、オススメ設定(Tips)",
    "キーボードショートカット",
    "エンターで改⾏するには",
    "チャンネルに複数メンバーをまとめて招待したい",
    "部⾨横断やマイクロチームのチャンネルはどうするのがいい?",
    "よく使う絵⽂字",
    "分報(times)を使ってみよう",
    "出退勤ステータス",
    "KoT出勤∕退勤時にSlackにもメッセージを書く",
    "プロジェクト⽤の設定"
  ],
  [],
  [
    "{\n \"質問\": \"Slackでアンケートを取る方法があると聞いてます。方法を教えてください。\",\n \"ファイルパス\": \"社内公式情報/社内システム、貸与機器の使い方/Slack 活用・テクニカル編/外部と連携 Slack コネクトとゲスト.pdf\"\n}"
  ],
  [
    "Slackでアンケートを取る方法は、Slackの構成とワークスペース間連携に関する情報ではありません。"
  ]
]

Google Cloud Enterprise SearchとRetrieveReadCompose方式RAGを利用して社内公式情報を全部質問できるようにしてみた | DevelopersIO

仮説: LLMのfine-tuningによる抽出トークン数の削減

LLMが回答生成に寄与しない情報については抽出しないようにできれば、出力トークン数を減らすことができ、Read処理時間の削減につながると考えられます。そこで、Read処理で使用しているgpt-3.5-turboをfine-tuningすることでこれを実現できると考え、検証してみました。

検証

目的

検証実験を通して、次の2つを評価します。

  1. Read処理において、gpt-3.5-turboをfine-tuningすることで、gpt-3.5-turboより抽出される情報が削減されるのか?
  2. Read処理において、fine-tuningしたモデルを使うことで実際の処理時間が削減されるのか?

分析手順

仮説検証のために以下の手順で評価を行いました。

学習用データの準備

  1. 質問応対システムで質問された358件の質問を用意
  2. 用意した各質問に対して、Retrieve処理を使用し、関連ドキュメント10件を抽出
  3. 質問とドキュメントデータを使い、gpt-4を使用してRead処理をさせた

( 補足 ) 3では、gpt-3.5-turboより高性能なgpt-4にRead処理をさせました。この理由はgpt3.5-turboよりもgpt-4の方が、関連度が高い情報のみが出力されやすいと仮定しているためです。

このデータでgpt-3.5-turboをfine-tuningすることでgpt-4のように必要な情報のみを取り出すように振る舞うことを期待しています。

fine-tuning

  1. 学習用データを用いてgpt-3.5-turboをfine-tuning

評価

  1. 評価用に100件の質問を用意し、質問に関連するドキュメントを1件抽出
  2. 抽出した各ドキュメントに対して、fine-tuningしたモデルを使ってRead処理を実行
  3. 同様にgpt-3.5-turboでもRead処理を実行
  4. fine-tuningしたモデルとgpt-3.5-turboのRead処理で抽出されたトークン数を比較

実験設定

  • fine-tuningのepoch数: 10
  • fine-tuningの学習用ドキュメント数: 358
  • fine-tuningの評価用ドキュメント数: 100
  • fine-tuningをしたモデル: gpt-3.5-turbo

結果

1. 情報が削減されたのか?

まず、fine-tuningをしたことで出力トークン数が削減されたのかを確認します。抽出した情報の平均出力トークン数を以下に示します。結果を見るとfine-tuningしたことで、平均出力トークン数は約40%削減しました。

平均出力トークン数
fine-tuning 117.5
gpt-3.5-turbo 194.8

次に、fine-tuningモデルの出力トークン数からgpt-3.5-turboの出力トークン数を引いた値のヒストグラムを示します。この検証では、fine-tuningすることで、余分な情報抽出を削減することを期待しているので、このヒストグラムのoutput tokensが0以下の頻度が多いことが望ましいです。

ヒストグラムを見ると、出力トークン数が多少増えているケースもありますが、減っているケースの方が多く、図の右端を見ると大幅に減少しているケースも見られます。したがって、概ね期待通り出力トークン数が減少したことがわかります。次節以降で、それぞれのケースでどういう情報が出力されているのか見ていきます。

図の左側 (output tokens ≤ -600)

fine-tuningモデルの方が、gpt-3.5-turboが抽出した情報よりも大幅に少なかったケース

このケースに該当するデータは下のデータになります。見てみると、gpt-3.5-turboでは情報を抽出しているのに対して、fine-tuningモデルでは情報を抽出しないようになっています。抽出した情報と質問と照らし合わせて考えると、fine-tuningしたことで、無関係な質問に対しては何も抽出しないように学習されたと解釈できます。

question: CX事業本部のブログの承認権限を持っている方を知りたいです
gpt3-turbo: ["日比谷オフィスの最新情報です", "利用できる会議室一覧 [会議室レイアウト](../../%E3%82%AA%E3%83%95%E3%82%A3%E3%82%B9%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%203152b705204e462aaa7c62ee1aab1d52/%E4%BC%9A%E8%AD%B0%E5%AE%A4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%207769de3a38094452a171e905f1342e10/%E4%BC%9A%E8%AD%B0%E5%AE%A4%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%20629980d1cd8042acb5ac5a8e5a2c8762.md) → 日比谷を展開", "会議室設置 Chormeboxの操作について - 画面の操作は無線マウスで行います (リモコン、タッチパネルは設置しません) - 文字入力でキーボードが必要な場合は会議室エリアのxxxx(場所検討中)に貸し出し用があります 接続してお使いください(使用後は必ず元の場所に返却してください) - 使い終わったらモニターを消してください 次の会議の他のお客様の名称が見えないようにご配慮をお願いします", "各エリアの移動式Chormeboxの操作について - 各エリアには移動式のChromeboxも設置しています 小規模の打ち合わせ、ハンズオンなどで必要な場合にご利用ください - ガイドライン - モニターはついていませんのでエリア内のモニター設置個所で接続してご利用ください - 執務室エリアでの利用は周囲の迷惑にならないようスピーカーの音量にご注意ください - 利用が終わったら元の位置に戻してください - 利用可能なものは以下です - FT-26L1 - FT-26H1 - FT-26D1 - FT-26C1(Cafe)はイベント専用のため利用禁止です イベントを開催したい場合は [日比谷オフィスカフェスペースでのイベント開催について(随時更新中)](../../%E7%A4%BE%E5%86%85%E5%B9%B4%E9%96%93%E3%82%AB"]
fituned: [""]
question: 2023年の会社が休みの日はいつですか?
gpt3.5-turbo: ["充電器に接続する前に、充電ポートを乾いた状態にしておくようにしてください。", "本製品は日常的な洗浄はできますが、マイクロホンの穴を水で濡らしたり、水没させるなどはおやめください。", "在庫管理について", "今後もOpenCommが不要な方からのご返却を受け付けていますので、不要な方はご返却ください。", "返却方法について", "日比谷オフィス・札幌オフィス出社の方", "返却先", "日比谷オフィスまたは札幌オフィス", "返却方法", "総務へ直接手渡し※ 拠点総務が毎日出社していない拠点は以下どちらかでご対応ください・ 拠点総務出社日に合わせて出社・返却・ 郵送で返却希望の方同様に返却(レターパックプラスで郵送)", "返却物", "・OpenComm骨伝導イヤホン・マグネット充電ケーブル・ハードシェル収納ケース・ユーザガイド・保証書※ イヤホン本体以外の付属品は、お持ちの方のみ同梱してください※ 化粧箱は破棄してください", "郵送で返却希望の方", "返却先", "日比谷オフィス", "返却方法", "レターパックプラス(購入後に経費精算)参考:

https://www.post.japanpost.jp/service/letterpack/

レターパックの発送方法は?コンビニから発送はできる?
../../%E8%B2%A1%E5%8B%99%E7%B5%8C%E7%90%86%20c242a1ce242b4896b8c1e6625a9c03ae/%E7%AB%8B%E6%9B%BF%E7%B5%8C%E8%B2%BB%E7%B2%BE%E7%AE%97%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%20300e1a9951ad4e989148c46678ffd240.md", "返却物", "・OpenComm骨伝導イヤホン・マグネット充電ケーブル・ハードシェル収納ケース・ユーザガイド・保証書※ イヤホン本体以外の付属品は、お持ちの方のみ同梱してください※ 化粧箱は破棄してください"] fituned: [] gpt4: []
question: 福岡オフィスの住所
gpt3.5-turbo: ["- 利用できる会議室一覧 [会議室レイアウト](https://www.notion.so/7769de3a38094452a171e905f1342e10?pvs=21) → 日比谷を展開",
"- 会議室設置 Chormeboxの操作について - 画面の操作は無線マウスで行います (リモコン、タッチパネルは設置しません) - 文字入力でキーボードが必要な場合は会議室エリアのxxxx(場所検討中)に貸し出し用があります 接続してお使いください(使用後は必ず元の場所に返却してください) - 使い終わったらモニターを消してください 次の会議の他のお客様の名称が見えないようにご配慮をお願いします",
"- 各エリアの移動式Chormeboxの操作について",
"- 各エリアには移動式のChromeboxも設置しています",
"- ガイドライン - モニターはついていませんのでエリア内のモニター設置個所で接続してご利用ください - 執務室エリアでの利用は周囲の迷惑にならないようスピーカーの音量にご注意ください - 利用が終わったら元の位置に戻してください - 利用可能なものは以下です - FT-26L1 - FT-26H1 - FT-26D1 - FT-26C1(Cafe)はイベント専用のため利用禁止です イベントを開催したい場合は [日比谷オフィスカフェスペースでのイベント開催について(随時更新中)](../../%E7%A4%BE%E5%86%85%E5%B9%B4%E9%96%93%E3%82%AB"]
fituned: []
gpt4: ["利用可能な情報がありません"]

図の中央 (-400 ≤ output tokens ≤ 0)

fine-tuningモデルの方が、gpt-3.5-turboが抽出した情報よりも、多少削減されたケース

このケースに該当するデータは下のデータになります。抽出した情報と質問を見てみると、fine-tuningモデルはgpt-3.5-turboよりも出力トークン数が少ないことがわかります。データを観察すると、回答生成に寄与しない部分を削減できていることがわかります。

question: AWSアカウントをクローズするには?
gpt3-turbo 144: ["カテゴリー: 業務", "利用手順・関連ページ: AWS事業本部オペレーション部アカウントチーム管理", "概要: 社内のAWSアカウント発行、削除、変更などを依頼", "- 社内用AWSアカウント作成・削除・対象AWSアカウントへのCM社員向けスイッチロール作成の申請手順です。"]
finetuning 84: ["社内のAWSアカウント発行、削除、変更などを依頼", "社内用AWSアカウント作成・削除・対象AWSアカウントへのCM社員向けスイッチロール作成の申請手順です。"]
gpt4 56: ["社内用AWSアカウント作成・削除・対象AWSアカウントへのCM社員向けスイッチロール作成の申請手順です。"]
question: クラスメソッドコリアの経費精算方法について教えてください
gpt3-turbo 164: ["立替経費スケジュール", "雇入前健康診断の精算は、前月発生した経費でも、入社した月の精算に含めてください", "例えば9月入社の方は、9月分(9月1日~9月30日に発生した経費を10月1日までに申請)に含めます", "問い合わせ先: Slack DM:@財務経理室, 経費精算質問チャンネル:help-mf-keihi"]
finetuning 122: ["原則「立替払いを行った月」での申請となりますが、雇入前健康診断の精算は、前月発生した経費でも、入社した月の精算に含めてください", "問い合わせ先:Slack DM:@財務経理室", "経費精算質問チャンネル:help-mf-keihi"]
gpt4 122: ["原則「立替払いを行った月」での申請となりますが、雇入前健康診断の精算は、前月発生した経費でも、入社した月の精算に含めてください。", "問い合わせ先はSlack DM:@財務経理室、経費精算質問チャンネル:help-mf-keihiです"]
question: インフルエンザの予防接種を受けるにはどうしたらいいですか?
gpt3-turbo 295: ["インフルエンザ予防接種の実施案内を掲載しています。毎年10月~12月上旬実施です。", "クラスメソッドで健康保険に加入している方", "健康保険上の被扶養者の方", "下記ご参照の上、各自で「契約医療機関」にて予約・接種してください。(※)", "必ず利用券を発行の上、接種をお願いいたします。", "利用券の発行申込み・契約医療機関の確認はこちら(※)概ね片道1時間圏内に指定医療機関がない場合は、指定医療機関以外で接種いただけます。(全額会社負担) 近隣に指定医療機関があるにもかかわらず、自己都合で他病院で接種する場合は2,000円(補助分)を除いた金額を会社負担とします。"]
finetuning 278: ["インフルエンザ予防接種の実施案内を掲載しています。毎年10月~12月上旬実施です。", "対象者はクラスメソッドで健康保険に加入している方と健康保険上の被扶養者の方です。", "受診方法は下記ご参照の上、各自で「契約医療機関」にて予約・接種してください。", "必ず利用券を発行の上、接種をお願いいたします。", "概ね片道1時間圏内に指定医療機関がない場合は、指定医療機関以外で接種いただけます。(全額会社負担)", "近隣に指定医療機関があるにもかかわらず、自己都合で他病院で接種する場合は2,000円(補助分)を除いた金額を会社負担とします。"]
gpt4 169: ["毎年10月~12月上旬にインフルエンザ予防接種が実施されます", "対象者はクラスメソッドで健康保険に加入している方と健康保険上の被扶養者の方です", "受診方法は各自で「契約医療機関」にて予約・接種してください", "必ず利用券を発行の上、接種をお願いいたします", "利用券の発行申込み・契約医療機関の確認はこちらから可能です"]

図の右側 (output tokens ≥ 0)

fine-tuningモデルの方が、gpt-3.5-turboが抽出した情報よりも多くなってしまったケース

このケースに該当するデータは下のデータになります。一見すると、fine-tuningしたモデルの方がgpt-3.5-turboよりも出力トークン数が多いため、悪い結果に見えます。しかし、質問と照らし合わせると、gpt-3.5-turboでは回答できなかった質問に対して、finetuningモデルでは正しく回答できているような場合が多く見られます。よって、正しくfine-tuningできたと言えます。

question: プリンタの設定について教えて
gpt3-turbo: []
finetuning: ["転送先 でGoogleドライブを指定できます。", "設定したら、OKをクリックします", "プリンタに移動します。プリンタに原稿をセットし、「スキャン」を押します", "「Document Capture Pro」を押します", "「コンピューターを選択してください」の+ボタンを押します", "自分のマシン名を押します"]
gpt4: ["転送先 でGoogleドライブを指定できます。", "転送先 → Googleドライブ → ログイン → ブラウザでGoogleにログイン → DocumentCaptureがGoogleアカウントへのアクセスをリクエストしています は、許可をクリック", "フォルダーの横のリロードボタンをクリックすると、マイフォルダ内のフォルダを選択できます", "設定したら、OKをクリックします", "プリンタに移動します。プリンタに原稿をセットし、「スキャン」を押します", "原稿の向きに注意してください。", "「Document Capture Pro」を押します", "「コンピューターを選択してください」の+ボタンを押します", "自分のマシン名を押します"]
question: 業務委託契約書のひな形をください
gpt3-turbo: ["業務委託契約書のひな形をください"]
finetuning: ["利用部門が委託先に訪問し、委託先担当者と面談を行い業務委託先チェックシートを記入", "業務委託先チェックシートを委託先担当者にメールにより送信し委託先にて記入", "調査結果と、担当者評価結果を業務委託先チェックシートに記入します。評価結果はプルダウンから該当するものを選択し、必要があれば自由記述欄に記載してください。", "記入した業務委託先チェックシートを下記GoogleDriveに保管してください。", "契約後にクラスメソッドグループ利用委託先一覧に追加した委託先を記載してください。"]
gpt4: ["利用部門が第三者認証、利用規約、約款などから評価を実施", "利用部門が委託先に訪問し、委託先担当者と面談を行い業務委託先チェックシートを記入", "業務委託先チェックシートを委託先担当者にメールにより送信し委託先にて記入", "調査結果と、担当者評価結果を業務委託先チェックシートに記入します。評価結果はプルダウンから該当するものを選択し、必要があれば自由記述欄に記載してください。", "記入した業務委託先チェックシートを下記GoogleDriveに保管してください。", "契約後にクラスメソッドグループ利用委託先一覧に追加した委託先を記載してください。", "クラスメソッドグループ利用委託先一覧(委託先(業者)一覧タブ)(SaaS委託先一覧タブ)を確認し過不足している業務委託先があるか確認してください。", "不足している業務委託先があった場合は、新規業務委託先を確認のうえ、業務委託先チェックシートを用いて委託先評価を実施してください。"]
question: ワクチン接種のための特別休暇は、現在も使用可能でしょうか?
gpt3-turbo: []
finetuning: ["メンション先: @労務チーム", "問い合わせSlack: 「労務チーム」へダイレクトメッセージ", "担当部署: エンプロイーサクセス部 労務チーム"]
gpt4: ["ワクチン接種のための特別休暇に関する問い合わせは労務チームへダイレクトメッセージでお願いします", "担当部署はエンプロイーサクセス部の労務チームです"]
question: 個人所有のスマホでSlackをインストールしたいです
gpt3-turbo: []
finetuning: ["ソフトウェア利用申請ワークフローをご提出ください", "グループ全体で50ライセンスまでとなっているため、付与されない場合もあります", "ライセンスを付与されていない方は @classmethod.jpのメールアドレスで登録されたアカウントの削除をお願いします", "ライセンスを付与されているかどうかは以下のスプレッドシートで記載されています", "過去に退場された方はDocker社に削除を依頼いたします", "以下の日時までにアンインストール、会社メールアドレスの登録解除の対応をお願いします", "後日、会社貸与PCのソフトウェアインベントリーを調査し、個別に確認をさせていただくことがありますので、ご承知おきください"]
gpt4: ["ソフトウェア利用申請ワークフローをご提出ください", "ライセンスを付与されていない方は @classmethod.jpのメールアドレスで登録されたアカウントの削除をお願いします", "ライセンスを付与されているかどうかは以下のスプレッドシートで記載されています", "2023年8月10日(木)中までにアンインストール、会社メールアドレスの登録解除の対応をお願いします。", "後日、会社貸与PCのソフトウェアインベントリーを調査し、個別に確認をさせていただくことがありますので、ご承知おきください。"]

一方でgpt-4に引っ張られて間違った回答を生成してしまっている場合もあります。ただ、この件数は1件だけだったのでそこまで多くはないと感じました。(※ xxxxは個人名が入っていたのでマスクしました。)

question: xxxxのNotion記事を探してください。
gpt3-turbo: []
finetuning: ["フローに関する詳細は下記Notion記事をご参照ください。", "[震災時の安否確認フロー](../../%E9%98%B2%E7%81%BD%E7%AE%A1%E7%90%86%2067b7f9da344146a791744aa1db23bc94/%E9%9C%87%E7%81%BD%E6%99%82%E3%81%AE%E5%AE%89%E5%90%A6%E7%A2%BA%E8%AA%8D%E3%83%95%E3%83%AD%E3%83%BC%20ced18f099e994e09b8d0605b903ea9f2.md)"]
gpt4: ["フローに関する詳細は下記Notion記事をご参照ください。", "[震災時の安否確認フロー](../../%E9%98%B2%E7%81%BD%E7%AE%A1%E7%90%86%2067b7f9da344146a791744aa1db23bc94/%E9%9C%87%E7%81%BD%E6%99%82%E3%81%AE%E5%AE%89%E5%90%A6%E7%A2%BA%E8%AA%8D%E3%83%95%E3%83%AD%E3%83%BC%20ced18f099e994e09b8d0605b903ea9f2.md)"]

1. 結論

gpt-3.5-turboをfine-tuningすることで、回答生成に寄与するような情報を選んで、抽出するようになり、その結果、出力トークン数が少なくなったことが観察されました。

また、fine-tuningモデルの方が出力トークン数が多くなる場合もありました。これはドキュメントがあるのにgpt-3.5-turboが正しく情報を抽出できなかったのが、fine-tuningモデルでは正しく情報を抽出できるようになったことで起こったと考えられます。

以上から概ね情報抽出時の出力トークン数が削減できているため、うまくfine-tuningできたと言えます。

2. 処理時間が削減されたのか?

fine-tuningしたことによって実際の処理時間が削減されたのかについても検証しました。結果から、平均処理時間が約6秒程度早くなったことが観察されました。おおよそ、4.5倍程度高速化されたことが分かります。

また、fine-tuningモデルとgpt-3.5-turboの1トークンあたりの処理時間を比較すると、fine-tuningモデルの方が3倍程度、処理時間が早かったです。

処理速度を短縮したい場合は、fine-tuningモデルを使うのも一つの手かもしれません。

/ 平均処理時間 [秒] 平均出力トークン数 処理時間 / 出力トークン数
fine-tuning 1.68 117.47 0.014
gpt-3.5-turbo 7.53 194.8 0.039

結論

fine-tuningをすることによって、出力トークン数と処理時間を削減することができました。また、そもそもfine-tuningモデルの方が処理速度が早かったという知見も得ることができました。

gpt-4を手本として作成したデータを使って、fine-tuningを行うことで、Read処理時間を削減し、チャットボットシステムの応答速度を向上できることが示唆されました。よって今回は目的通りにfine-tuningできました。

今回は100件のデータで検証を行ったのですが、特徴的な振る舞いについては実験データが少なすぎたため、より多くのデータで検証を行う必要があると感じました。

追加検証

前の章では、fine-tuningモデルとgpt-3.5-turboを比較してきましたが、この章では、fine-tuningモデルとgpt-4の情報抽出時のトークン数について比較した結果について記載します。

以下にヒストグラムを示します。ヒストグラムを観察すると0にピークがあり-200から200の間でデータが広がっていることが見てとれます。このことはfinetuningによってgpt-4と同様の出力をするように学習されたと推測できます。また、-200 ≤ output tokens ≤ 0 の頻度が多い事から、finetuningモデルの方が、gpt-4よりも抽出した情報が少なかったと分かります。finetuningモデルの方が、より質の高い情報抽出を行えていると推測できます。

次節以降でより詳細に分析していきます。

図の左端 (output tokens ≤ -200)

fine-tuningモデルの方が、gpt-4が抽出した情報よりも大幅に少なかったケース

これに該当するデータは7件がありました。下に3件のサンプルを示します。内容を見てみると、gpt-4は質問と無関係な情報を抽出してしまったのに対して、finetuningモデルは何も抽出しなかったようです。このことはgpt-3.5-turboをfine-tuningすることでgpt-4よりも適した振る舞いをする可能性があると解釈することができます。他の4件のサンプルも同様の出力が得られていました。

question: DevIOに初めて投稿する場合の、手順をおしえてください
gpt3-turbo: ["条件付きアクセスエラーについて", "再インストール対応したが接続できない", "Macのマシンデバイス登録の画面が表示された", "デバイス登録画面が表示された場合の確認手順", "Windows Update後などで接続Errorが頻発する", "前日まで接続できていたのに接続できなくなった"]
finetuning: []
gpt4: ["再インストール対応したが接続できない場合は、「AWS Client VPN for Desktop」のアンインストールと再インストールを行う場合、再インストール前に一度マシンの再起動を実施してください。",
"Macのマシンデバイス登録の画面が表示された場合は以下の手順でご確認ください。1. システム環境設定⇨一般を開いて、デフォルトのブラウザをSafariに変更する 2. 「Clasmethod App Storeを開く」を押して、「Intune統合」をReinstallする 3. 「既に登録されています」が出た場合は、「続行」を押下 4. サインイン画面が出ますので、GoogleのログインID(メールアドレス)、パスワードを入力する 5. Safariが立ち上がって、証明書の確認画面が出ますので、「続ける」を押下する 6. デフォルトのブラウザをChromeに戻す",
"Chromeに戻した後も同様のメッセージが出る場合は、システム環境設定のソフトウェアアップデートを確認するMontereyへのアップデートではなく、その下に表示されている「他にもアップデートがあります」の下の「詳しい情報…」をクリックして、表示されるものを「今すぐインストール」で実施してください。",
"Windows Update後などで接続Errorが頻発する場合は、アプリの再インストールをご確認ください。",
"前日まで接続できていたのに接続できなくなった場合は、モニタの開閉など、機器のスリープで自動的にVPNは切断されます。引き続き利用する場合は再接続してください。"]
question: 有給付与時期が知りたい
gpt3-turbo: []
finetuning: []
gpt4: ["プロジェクト管理者がAPIキーを発行", "backlogの管理画面からのAPIキーの発行手順は以下の通りです。", "1. backlogの管理画面にログインします。", "2. [設定] > [API設定] を選択します。", "3. [新規発行] ボタンをクリックします。", "4. 発行するアプリケーション名とURLを入力し、[発行] ボタンをクリックします。", "5. 発行されたAPIキーとシークレットキーを確認します。", "APIキーとシークレットキーはbacklogのアプリケーションを操作するために必要な鍵となりますので、安全に管理してください。", "発行されたAPIキープロジェクトキーを相手方(移動先)に連絡してください。", "最後に相手方ワークスペース管理者がAPI・プロジェクトキーを参照しコマンド入力すれば完了となります。", "プロジェクト移行コマンドは以下の通りとなります。", "project:migrate --apikey=[APIキー] --projectkey=[プロジェクトキー]"]
question: 出張でホテルを予約した場合に、経費精算の上限金額はありますか?
gpt3-turbo: ["予約日の日時変更をしたい場合はどうすればよいですか?", "直営健診センターの予約をしたのですが、予約番号が分からなくなってしまいました。", "医療機関までの電車代は経費精算できますか?", "契約医療機関での受診した際、窓口にて支払い方法を聞かれました。どう答えればいいですか。", "受診時間および会社への移動時間は勤務時間になりますか?", "イーク(丸の内・有楽町・紀尾井町)を利用したいのですが、どのコースを受診すればよいでしょうか。"]
finetuning: []
gpt4: ["医療機関までの電車代は経費精算できますか? A 経費精算可能です。", "契約医療機関での受診した際、窓口にて支払い方法を聞かれました。どう答えればいいですか。 A 契約医療機関によっては、窓口にて支払い方法を確認される場合があります。 その場合は、請求先は「クラスメソッド株式会社宛」とご回答ください。 4.健診メニュー以外の健診コース・オプションを選択された場合は、自己負担になりますので、その分のみ窓口にてお支払いください。 ※医療機関によっては、会社負担分と自己負担分を分けられない場合があります。 その場合は、全額を一旦窓口でお支払いいただき、経費精算にて会社負担分のみ申請ください。 (領収書も分けられない場合は、全額の領収書を添付・提出していただくようお願いします)"]

図中央 (-200 ≤ output tokens ≤ 0 , 0 ≤ output tokens ≤ 200)

fine-tuningモデルの方が、gpt-4が抽出した情報よりも多少削減されたケース

図中央について、 -200 ≤ output tokens ≤ 0の場合と、 0 ≤ output tokens ≤ 200の場合で比較してみました。抽出された情報を観察すると、抽出された情報のトークン数に違いはありますが、大きな違いは観察されませんでした。そのため、このケースに関してはfine-tuningモデルとgpt-4は同様の振る舞いだったと考えられます

-200 ≤ output tokens ≤ 0

question: プリンタの設定について教えて
finetuning (165): ["転送先 でGoogleドライブを指定できます。", "設定したら、OKをクリックします", "プリンタに移動します。プリンタに原稿をセットし、「スキャン」を押します", "「Document Capture Pro」を押します", "「コンピューターを選択してください」の+ボタンを押します", "自分のマシン名を押します"]
gpt4 (334): ["転送先 でGoogleドライブを指定できます。", "転送先 → Googleドライブ → ログイン → ブラウザでGoogleにログイン → DocumentCaptureがGoogleアカウントへのアクセスをリクエストしています は、許可をクリック", "フォルダーの横のリロードボタンをクリックすると、マイフォルダ内のフォルダを選択できます", "設定したら、OKをクリックします", "プリンタに移動します。プリンタに原稿をセットし、「スキャン」を押します", "原稿の向きに注意してください。", "「Document Capture Pro」を押します", "「コンピューターを選択してください」の+ボタンを押します", "自分のマシン名を押します"]
question: プリンタの設定について教えて
finetuning (265): ["PCからの印刷時、 FUJIFILM Apeos C3070 を選択してください。", "利用前に通常回線(4/3以降は0000_CM_STANDARD)に接続し、以下ドライバーのインストールをお願いいたします", "ドライバのインストールは通常回線((0000_CM_STANDARD)※ネクストモード社は0000_NEXTMODE)でお願いします。", "「ネットワーク接続」を選択してください", "ドライバーのアップデートが必要と表示された場合はアップデートを先に実施してください (再起動が必要な場合があります)"]
gpt4 (355): ["PCからの印刷時、 FUJIFILM Apeos C3070 を選択してください。", "利用前に通常回線(4/3以降は0000_CM_STANDARD)に接続し、以下ドライバーのインストールをお願いいたします", "https://www.fujifilm.com/fb/download/apeos/c3070", "ドライバインストール時の注意点について 以下ご確認ください", "注意点 ・ドライバのインストールは通常回線((**0000_CM_STANDARD**)※ネクストモード社は0000_NEXTMODE)でお願いします。 ・「ネットワーク接続」を選択してください ・ドライバーのアップデートが必要と表示された場合はアップデートを先に実施してください (再起動が必要な場合があります)"]
question: 契約書の電子署名のやり方を教えてください
finetuning (71): ["契約書以外の郵送依頼は引き続き営業事務チームに直接DMにてご連絡お願いいたします。", "動作確認についてはテスト環境をご利用ください"]
gpt4 (83): ["契約書以外の郵送依頼は引き続き営業事務チームに直接DMにてご連絡お願いいたします。", "動作確認についてはテスト環境をご利用ください", "利用方法はこちら"]

0 ≤ output tokens ≤ 200

question: Client VPNの接続方法について教えてください。
finetuning (68): ["VPN接続する方法:AWS Client VPN(azure AD SSO)", "ソフトウェア利用:全社共通の有償ソフトウェア"]
gpt4 (42): ["VPN接続する方法:AWS Client VPN(azure AD SSO)"]
question: AWSアカウントをクローズするには?
finetuning (84): ["社内のAWSアカウント発行、削除、変更などを依頼", "社内用AWSアカウント作成・削除・対象AWSアカウントへのCM社員向けスイッチロール作成の申請手順です。"]
gpt4 (56): ["社内用AWSアカウント作成・削除・対象AWSアカウントへのCM社員向けスイッチロール作成の申請手順です。"]
question: インフルエンザの予防接種を受けるにはどうしたらいいですか?
finetuning (278): ["インフルエンザ予防接種の実施案内を掲載しています。毎年10月~12月上旬実施です。", "対象者はクラスメソッドで健康保険に加入している方と健康保険上の被扶養者の方です。", "受診方法は下記ご参照の上、各自で「契約医療機関」にて予約・接種してください。", "必ず利用券を発行の上、接種をお願いいたします。", "概ね片道1時間圏内に指定医療機関がない場合は、指定医療機関以外で接種いただけます。(全額会社負担)", "近隣に指定医療機関があるにもかかわらず、自己都合で他病院で接種する場合は2,000円(補助分)を除いた金額を会社負担とします。"]
gpt4 (169): ["毎年10月~12月上旬にインフルエンザ予防接種が実施されます", "対象者はクラスメソッドで健康保険に加入している方と健康保険上の被扶養者の方です", "受診方法は各自で「契約医療機関」にて予約・接種してください", "必ず利用券を発行の上、接種をお願いいたします", "利用券の発行申込み・契約医療機関の確認はこちらから可能です"]

図の右側 (output tokens ≥ 200)

fine-tuningモデルの方が、gpt-4が抽出した情報よりも多くなってしまったケース

該当するデータの件数が少なく、4件のみでした。抽出された情報として次の3つが挙げられました。もう1件はケース1と同じように、fine-tuningモデルの方が多く情報を抽出したというケースでした。

  1. fine-tuningモデルの方が情報を多く抽出してしまった場合
question: インシデント発生時の対応手順を教えてください
finetuning: ["定期的に様子を見る", "管理表の行は、期限が過ぎたら赤くなるので、赤い行があったら進捗確認を行う", "管理表の項目について", "- 管理表の項目について | 項目名 | 分類 | 説明 | | --- | --- | --- | | 担当者 | 割り振り | サポート班の担当者(セレクトボックス) | | 最終承認 | 進捗管理 | フェーズ2が終わった際のWF承認をしたら✓、していなければ空欄 | | F2案内 | 進捗管理 | フェーズ2の案内をした日の日付、この日付から14日間計測している | | 初期承認 | 進捗管理 | フェーズ1が終わった際のWF承認をしたら✓、していなければ空欄 | | F1案内 | 進捗管理 | フェーズ1の案内をした日の日付、この日付から14日間計測している | | 管理ID&報告書 | インシデント情報 | 管理ID(サポート班が作成)と、障害報告書のURL | | 概要 | インシデント情報 | インシデントの概要、サポート班が各々設定する WFのタイトル部分をそのまま載せると長いため、一言で言い表せる表現を意識してください。"]
gpt4: ["定期的に様子を見る", "管理表の行は、期限が過ぎたら赤くなるので、赤い行があったら進捗確認を行う", "管理表の項目について: 担当者, 最終承認, F2案内, 初期承認, F1案内, 管理ID&報告書, 概要"]
  1. fine-tuningモデルが無関係な情報を抽出してしまった場合
question: 「cm-chatbot-ui」の使い方について、教えてください。
finetuning: ["このページではAWS事業本部 直属(Nextmode出向者含む)向けの各種庶務情報、マシン、アカウント権限等の標準項目を示しています。", "オプションソフトウェアについては入場時に管理部より確認させていただきますので、必要な場合はご指定ください。", "また、社内システムアカウントで個別プロジェクトへの追加は入場後のワークフロー:アカウント申請にて承ります。", "貸与PC スペック(クラスメソッド標準)を参照してください", "Mac用オプションソフトウェア(必要に応じてオプションを追加してください)", "Mac用Office", "社内システムアカウント標準項目", "DIV-CM-ABD(社員)", "DIV-CM-ABD-BP(ビジネスパートナー社員)", "Macマシン貸与:  CM Intune-Mac", "Windowsマシン貸与:CM Intune-Win", "cm-internal(社員)", "cm-awsteam", "jira-developers", "jira-users", "CM社員は入場者全員に作成します。", "BP社員は原則作成しません。アンケートで「要」の場合は作成いたします。"]
gpt4: ["「cm-chatbot-ui」の使い方についての情報はドキュメントには含まれていません。"]
  1. fine-tuningモデルの方がgpt-4よりも賢い振る舞いをした場合
question: 育休取得に必要な手続きを教えてください
finetuning: ["育休取得に必要な手続きは、SmartHRの申請手順に従って行います。", "まず、SmartHRにログイン後、トップページにある「扶養追加の手続き」をクリックします。", "「扶養追加の手続き」の画面を開いたら、被扶養者情報を入力し、「次へ」ボタンを押します。", "トップページに戻り、右上の「氏名」>「プロフィールの確認」の順にクリックします。", "プロフィール画面が開いたら、右上の「・・・」>「編集する」をクリックします。", "「その他添付書類」>「扶養確認書類」に以下の画像を添付してください。", "以上で申請手続きは完了です。", "SmartHRでの申請後、MFクラウドマイナンバーより、提供依頼のメールが届きます。", "以下「1.MFクラウドマイナンバー入力方法」をご確認のうえ、マイナンバーをご提供ください。", "手続き完了後、健康保険証が発行されます。"]
gpt4: []

結論

gpt-3.5-turboをfine-tuningすることでgpt-4よりも出力トークン数を削減できました。

ベースのモデルがgpt-3.5-turboであるにも関わらず、gpt-4よりも概ね、適切な振る舞いするようになりました。この理由はgpt-4は汎用的なタスクに対して利用できるのに対して、fine-tuningモデルは情報抽出タスクに特化させたことにより性能が上がったことが要因として考えられます。このことは、gpt-3.5-turboのようにgpt-4よりも安価かつ高速なモデルをfine-tuningをすることで特定タスクに特化させることで、コストを抑えたり、処理時間を短縮するということに応用させることができそうです。

この後の展望として、Read処理をgpt-3.5-turboをfine-tuningしたモデルに置き換えた時にどの程度、回答の品質が落ちるのかについても検証していきます

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.