話題の記事

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

2023.09.22

はじめに

新規事業部 山本です。

ChatGPT(OpenAI API)をはじめとしたAIの言語モデル(Large Language Model:以下、LLM)を使用して、チャットボットを構築するケースが増えています。通常、LLMが学習したときのデータに含まれている内容以外に関する質問には回答ができません。そのため、例えば社内システムに関するチャットボットを作成しようとしても、素のLLMでは質問に対してわからないという回答や異なる知識に基づいた回答が(当然ながら)得られてしまいます。

この問題を解決する方法として、Retrieval Augmented Generation(以下、RAG)という手法がよく使用されます。RAGでは、ユーザからの質問に回答するために必要そうな内容が書かれた文章を検索し、その文章をLLMへの入力(プロンプト)に付け加えて渡すことで、ユーザが欲しい情報に関して回答させることができます。

以前の記事では、新たにRAGの方式を考え、Google CloudのVertex AI Search(Enterprise Search)を使ってシステムを構築し、ドキュメントをもとにした詳細な回答を生成できることを確認しました。

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

本記事では、このシステムを社内で3週間試用してみた結果について記載します。

前提の説明

クラスメソッド株式会社では、ドキュメントサービスのNotion利用しています。バックオフィス関係(総務・労務・人事・情シスなど)の情報のうち、全社的に関係する手続きや規則に関する情報がまとめられているページ(「社内公式情報」)があります。以下のような特徴があります。

  • 「社内公式情報」は部署や内容ごとにまとめられており、階層的になっている
  • Notionの機能を使用して、全体をエクスポートできる

社員がバックオフィス業務に関連する質問がある場合、自分でNotionの記事を調べたり、わからない場合はSlackのチャンネルで聞くことができるようになっています。ただ、Notionの検索はキーワード検索のようになっていて、なかなか欲しい情報にたどり着きにくいという問題や、チャンネルでの質問も多く、対応に時間がかかっているといった問題があります。

今回の取り組みの目的は、自分で簡単に調べることができたり、できる限り自動で回答して対応にかかる時間を減らすことです。

システム

構成

処理の流れは以下の通りです。

準備

  1. Notionにあるドキュメントをエクスポートします
  2. Google CloudのCloud Storageにアップロードします
  3. Cloud StorageからGen App BuilderのEnterprise Searchにインポートします

インポート後のドキュメント件数は、1682件でした

使用時

  1. ユーザーがSlackで質問を投稿します
  2. Slack Appを経由して、Google CloudのCloud Runにリクエストが送信されます
  3. Cloud RunでPythonスクリプトが実行されます(以下は前回の記事と同じ処理です)
    1. Enterprise Searchに質問テキストをクエリとしたリクエストが送信します。質問に関連する情報を含むドキュメントを検索した結果が返されます(Retrieve)
    2. 各ドキュメントごとに質問に関連する情報を取り出すようにプロンプトを作成し、OpenAIのChatCompletion API(gpt-3.5-turbo)にリクエストを送信します。各ドキュメントから抽出された情報が返されます(Read)
    3. ドキュメントの情報と質問をまとめたプロンプトを作成し、OpenAIのChatCompletion API(gpt-4)にリクエストを送信します。質問に対する回答が返されます(Compose)
  4. 生成された回答を、Slackを通じてユーザーに返信します

ユーザの体験

  • Slackのアプリを追加し、「メッセージ」を選択して、チャット画面に移動します
  • 質問したい内容を入力し送信します

  • スレッドに返信する形で、送信後すぐに応答が返ってきます

  • 少し(10秒程度)待つと回答のストリーミングが始まります

  • 数十秒程度で質問に対する完全な回答になり、補足情報のメッセージも返されます

  • 詳細を確認したい場合は、参照情報のリンクをクリックすることで、Notionのページ(元ドキュメント)に移動することができます

  • 最後のメッセージ中のボタンを押すことで、その回答が良かったかどうかをフィードバックできます
    • 「いいえ」を押した場合は、どの点が良くなかったかをコメント(テキスト)で送信することができます

結果

9/4に社内にSlackの共有チャンネルでお知らせし、社員のみなさんに試用をしていただきました。9/22までの3週間で使われた結果について説明します。

ユーザからのフィードバック

上記のボタンでフィードバックされた結果について説明します。それぞれのラベルの意味は以下のとおりです。(縦軸は件数です)

  • 1:「はい」=解決できた(青)
  • 0:「いいえ」=解決できなかった(赤)

全部で400件以上使用されました。この内、フィードバックされた回答の内訳は以下のとおりです。

  • 1:167件(73.9%)
  • 0: 59件(26.1%)

フィードバックがなかった質問と回答を見たところ、妥当な回答が生成できていたと思われる割合は、フィードバックがあったものとおおよそ変わりませんでした(なので、全体でも70%以上の質問を、自動回答で解決できたと推測しています)

すべての質問に自動で回答できたわけではありませんが、自分で情報を探す手間や質問に対応する時間が削減できました。70%という値はまだ改善の余地がありますが、今回はプロトタイプとして実装したもので、後述のようにまだまだ改善できる点はあるので、十分なレベルと言えそうです。

「解決できた」回答のサンプル例

「解決できた」というフィードバックがあった、回答(と質問)には以下のようなものがありました。(実際には、この後のメッセージで、引用したNotionのページのリンクが表示されます)

介護サービスの利用費補助について教えてください
―――――――――――――――――――――――――――――――――――――――――
 
介護サービスの利用費補助は、配偶者、親、子、配偶者の親、同居かつ扶養している祖父母、兄弟姉妹、孫が対象となります。この制度は、就業するために介護サービスを利用する場合に適用されます。また、ケアマネージャーが作成した「ケアプラン」に含まれている介護保険サービスが対象となります。
 
利用するためには、介護サービスの利用開始日の2週間前までに、「育児・介護サービス利用費用助成申請書」と「利用目的通知書兼同意書」を提出する必要があります[0]。

育児休業と出生時育児休業(産後パパ育休)はどう違うのですか?
―――――――――――――――――――――――――――――――――――――――――
 
育児休業と出生時育児休業(産後パパ育休)は、取得のタイミングや期間などに違いがあります。
 
出生時育児休業(産後パパ育休)は、子の出生後8週間以内に4週間まで取得可能で、分割して2回取得することが可能です。また、連続する20営業日までは、特別休暇(有給)として取得することが可能です。ただし、分割して取得する場合は、初回の期間のみ特別休暇の取得が可能です[0]。
 
一方、育児休業は、出産予定日(予定日より早く生まれた場合は出産日)から子が1歳になる日の前日までの任意の期間取得可能で、こちらも分割して2回取得することが可能です。男性社員による育児休業期間のうち、お子様一人あたり連続する20営業日までは、特別休暇(有給)として取得することが可能です[2]。
 
なお、どちらの休業も取得する場合は、「育児休業申出書」の提出が必要となります[0][2]。

客先雛形NDAの約款を法務チェックしたいのですが、どのようにすればよいか教えてもらえますか?
―――――――――――――――――――――――――――――――――――――――――
 
NDA(秘密保持契約書)の法務チェックについては、まず契約書を法務部に提出してください。法務部では、提出された契約書の内容を確認し、必要な修正や変更点を指摘します。その後、法務部からのフィードバックをもとに契約書を修正し、再度法務部に提出します。このプロセスは、相手方の修正箇所が2〜3箇所であれば、回答日の目安は3〜6営業日後となります[0]。また、契約書の承認・締結フローについては、NDAも対象に入ります[6]。以上の手順を踏むことで、NDAの法務チェックを行うことができます。

結婚した時の申請ってどうやったらいいですか
―――――――――――――――――――――――――――――――――――――――――
 
結婚した場合の申請手順は以下の通りです。
 
1. 婚姻届の受理証明書または戸籍謄本の写し(婚姻の事実・日付および配偶者の氏名・生年月日がわかるもの)を用意します。
2. SmartHRにログインし、プロフィール画面を開きます。
3. 右上の「・・・」>「編集する」をクリックします。
4. 「その他添付書類」>「婚姻確認書類」に、婚姻届の受理証明書または戸籍謄本の写しを添付します。
5. 「配偶者の同居・別居の別」を選択します。
6. 以上で届出は完了です。労務チームで内容をチェック後、後日「結婚祝金」の振込を行います。
 
また、配偶者を扶養に入れる場合は、別途申請が必要です。その際は「扶養追加(ご家族を扶養に入れるとき)」のフローに沿って申請を行ってください[0]。
 
さらに、結婚により5日間の特別休暇(結婚休暇)を取得できます。取得期限は結婚した日より2年以内となります[5]。

出張の電車代の精算方法を教えて
―――――――――――――――――――――――――――――――――――――――――
 
出張の電車代の精算方法は以下の通りです。
 
1. 領収書を取得します。領収書が取得できない場合は自己負担となりますのでご注意ください[9]。
2. 精算のルールやMFクラウド経費の操作手順等については、下記スライドに記載されていますので、必ずご確認の上申請を行ってください[1]。
3. 精算は1か月分をまとめて経費「申請」をします[7]。
4. 申請データは上長と経理によって承認されます[7]。
5. 精算振込は対象期間締め月の翌月20日に行われます[7]。
 
なお、「自宅⇔最寄りオフィス」以外の移動は全て「電車代」などとなります[2][3]。また、出張先から地方オフィスに出社した場合も「電車代」に該当します[2][3]。

自分の携帯にMDMを入れる方法を教えてください。
―――――――――――――――――――――――――――――――――――――――――
 
自分の携帯にMDMを設定する手順は以下の通りです。
 
1. まず、バッテリーの残量に注意し、セットアップ中に電源が切れないようにしてください。電源に接続した状態での作業を推奨します[0]。
2. 次に、仕事用のアプリをインストールしてください。通常のAppStore、GooglePlayからインストールしたものでは社内システムにはアクセスできません[1][2]。
3. GoogleWorkspaceにログインできることを確認してください。必ず仕事用領域のブラウザ、アプリを利用してください[1][2]。
4. プライバシーポリシー、仕事用プロファイル作成の同意確認が表示されます。「同意」して「続行」してください[5]。
5. 仕事用アプリ、データはここからアクセスしてください[4]。
 
なお、具体的な設定手順やアプリのインストール方法は、デバイスの種類(AndroidやiOS)や使用しているMDMソリューションにより異なるため、詳細は該当する手順書を参照してください。

分析

以下の点がうまく回答できていると言えそうです。

  • 様々な業務の質問(総務・法務・労務・経理・情シス)に回答することができた
  • 情報がいくつかのドキュメントにまたがっていても、内容をまとめて回答された
  • 順序番号が振られていて、手順としてわかりやすく回答された(元のドキュメントでは、番号などが割り振られてなく、続けて文章が書かれていて、人が読み解くのが難しいケースが多かった)
  • 補足情報なども追加で回答することができた(結婚した場合の申請手順への質問で、結婚休暇にも言及がされている)

「解決できなかった」回答の分析

「解決できなかった」というフィードバックがあった、回答(と質問)を見てみると、以下のような種類がありました。

情報がなく回答できなかったケース

クラスメソッドコリアの在籍は何人ですか?
―――――――――――――――――――――――――――――――――――――――――
 
申し訳ありませんが、提供されたドキュメントの中にはクラスメソッドコリアの在籍人数に関する情報は含まれておりません。そのため、その質問には答えることができません。

Notionの「社内公式情報」ページを検索しても、該当する内容が見当たりませんでした。

古い情報を回答してしまったケース

コロナに感染しました。利用できる休暇制度はありますか?
―――――――――――――――――――――――――――――――――――――――――
 
新型コロナウイルス(COVID-19)に感染した場合、特別有給休暇として必要な日数を取得することが可能です。ただし、事前に部門長に相談することが必要です。また、症状が一切無い場合には在宅勤務も可能となっています[0]。

9月時点では情報が変わっており、間違っている内容で回答してしまいました。今回使用したドキュメントは、7月時点にNotionからエクスポートしたものだったことが原因です。

情報があるが、読み込めていなかったケース

レターパックは、赤と青のどちらを使ったらいいですか?
―――――――――――――――――――――――――――――――――――――――――
 
ユーザーの質問に対する具体的な回答を提供するためには、レターパックの赤と青の違いに関する情報が必要です。しかし、提供されたドキュメントのファイルパスや内容が明示されていないため、具体的な回答を提供することができません。質問の内容や目的により、レターパックの赤と青のどちらを使用するべきかは異なる可能性があります。例えば、配送先が遠方であるか、配送速度が重要であるか、配送物の大きさや重さなどにより適切なレターパックの色が変わる可能性があります。

クラスメソッドの最高情報責任者と最高情報セキュリティ責任者は誰ですか?
―――――――――――――――――――――――――――――――――――――――――
 
クラスメソッドの最高情報責任者は〇〇〇〇さん、最高情報セキュリティ責任者は〇〇〇〇さんです[0][4]。ただし、これらの情報は矛盾しています。最新の情報をご確認いただくことをおすすめします。

1つ目はドキュメント中の画像で説明されているが回答できていなかったケースで、2つ目はドキュメント中の表に書かれているが回答できなかったケースでした。(〇〇には社員名が入っていましたが、マスクしています)

一般的な内容を答えてしまったケース

現在扶養している子供を税法上の扶養だけ妻の扶養に変更したいです。どういった手続きをしたら良いですか?
―――――――――――――――――――――――――――――――――――――――――
 
申し訳ありませんが、ドキュメントの内容が提供されていないため、具体的な回答を生成することができません。健康診断を受ける際の一般的なアドバイスとしては、前日に十分な睡眠をとり、当日は空腹状態で診断を受けることが推奨されます。また、必要な書類や身分証明書を忘れずに持参することも重要です。具体的な手続きや注意事項は、受診する医療機関により異なるため、事前に確認しておくことをおすすめします。

根本的な原因は「情報がなく回答できなかったケース」と同じですが、ドキュメントに基づいた回答をするようにプロンプトで指示しているにもかかわらず、一般的な回答をしている事自体は、別のミスも重なっています。

質問の情報が足りていない

社員証を忘れました。どうすればいいですか?
―――――――――――――――――――――――――――――――――――――――――
 
社員証を忘れた場合、ゲストカードの一時貸出しを利用することができます。利用する際は必ず総務まで連絡してください。また、出社前に調整が必要な場合も事前に総務まで連絡するようにしてください[0][1]。

ユーザからのフィードバックで、特定のオフィス(日比谷オフィス)の方法が知りたいとコメントされていました。質問にユーザが所属しているオフィスに関する情報がないため、回答できないケースでした。

質問で会社特有の単語を使われている

マネフォのURLを教えて
―――――――――――――――――――――――――――――――――――――――――
 
申し訳ありませんが、提供されたドキュメントの中にはマネフォのURLに関する情報は含まれておりません。他の情報源を参照するか、該当する部署に直接お問い合わせいただくことをお勧めします。

HOを繋いだ際、たまにフリーズするのですが、どうしたら良いですか?
―――――――――――――――――――――――――――――――――――――――――
 
申し訳ありませんが、提供されたドキュメントの中には、HOがフリーズする問題に対する解決策や対処法についての情報は含まれていません。そのため、具体的な対処法を提供することはできません。問題が続く場合は、IT部門やシステム管理者に問い合わせてみてください。

「マネフォ」は会社で使用している経理システム「Monery Forward」のことを、HOはおそらく「ハングアウト」のことを、それぞれ指しているようですが、検索の段階で該当する文章が取り出されなかったケースでした。

ドキュメントで会社特有の単語を使われている

2023年の会社が休みの日はいつですか?
―――――――――――――――――――――――――――――――――――――――――
 
質問に対する回答がドキュメントの中には存在しません。会社の休日に関する情報は、別のドキュメントや社内カレンダーなどで確認してください。

クラスメソッドは2023年が会社設立20年であるため、20期と呼ばれる期間です。「社内公式情報」には「20期カレンダー」と書かれたドキュメントはありましたが、2023年と書かれたものはなく、検索で取り出されませんでした。

ユーザがボットの使い方を勘違いしているケース

「内製化支援」というワードを含む提案書はありますか?
―――――――――――――――――――――――――――――――――――――――――
 
「内製化支援」というワードを含む提案書は存在しません[8]。

今回、インポートの対象としたドキュメントは、バックオフィス業務関連のみを対象としました。その旨を社員の方へのお知らせにも記載していましたが、対象外である普段の業務の情報についての質問がいくつかされていました。

ユーザからの声

使用した方々から、「回答の精度が良い」「Notion内を検索して調べる手間が減った」「想定している以上の情報も付け加えてくれて便利だった」という意見をいただきました。

総務グループでは、現在業務効率化のために、Notion内のドキュメント整備に取り組んでいます。このボットの仕組みを利用して並行して進められそうという話をいただき、そのためのNotionのドキュメントの構成を検討するなど、社内の別の業務効率化と組み合わせた活動が進んで行きそうです。

情シス担当の方からも、ユーザからのフィードバック内容を、情シス内で公式ドキュメントに反映していきたいという声や、業務負荷が高いセキュリティチェックシートに関する一次回答にも利用したいという声がありました。

考察・改善点・今後に向けて

以下に挙げる点が改善に効果がありそうです。社内業務の効率化という観点で見ると、システムそのもの(プログラム・検索・回答生成)の改善も大事ですが、周辺の部分(ユーザ・ドキュメント)も考慮に入れるべきだと思います。

① ドキュメントの内容を拡充する

ユーザが疑問に思うことをカバーしたドキュメントがないと、そもそも回答することができません。対応できる質問の幅を広げるためには、ドキュメントの数や情報量を増やす必要があります。また、誤解を招いたり、わかりにくい表現は修正していくと精度が上がりそうです。

④とも被りますが、画像の読み込みができないエンタープライズ検索を使用する場合は、画像に対して文字での説明を付与することも必要です。

② ドキュメントを自動的にエクスポートして更新する

情報が最新になるように保つために、ドキュメントが更新されたら、自動的にインデックスに反映される仕組みを作る必要があります。反映するタイミングは、ドキュメントが更新された後すぐが一番望ましいですが、今回のようなユースケース(社内情報のQA)では、毎日更新するくらいの頻度でも十分かと思われます。

③ エクスポートデータの形式を変更する

今回はNotionからPDF形式でエクスポートしましたが、インデックスにインポートする際に、改行が入ってしまったり、ページの途中で内容が分割されてしまうことがみられました。

NotionではMarkdown形式のテキストファイルでエクスポートすることも可能です。マークダウン形式でインデックスを別途作成して試してみたところ、以下のようにPDF形式では回答できなかった質問に回答できるようになりました。今後こちらに置き換えたいと思っています。

クラスメソッドの最高情報責任者と最高情報セキュリティ責任者は誰ですか?
―――――――――――――――――――――――――――――――――――――――――
 
クラスメソッドの最高情報責任者(CIO)は〇〇〇〇さんで、最高情報セキュリティ責任者(CISO)は〇〇〇〇さんです[1][7]。

(〇〇には社員名が入っていましたが、マスクしています。今回はNotion内のドキュメントから正しく引用されていました)

※ 拡張子が”.md”だとEnterprise Search(Vertex AI Search)にインポートできない(非対応)ため、”.txt”にリネームしてからインポートしました。

④ インポートの解析対象を広げる

Enterprise Search(Vertex AI Search)の「非構造化データの読み込み」では、現在画像の内容は読み込まれません。画像内にかかれた情報も拾えるようにするためには、画像を解析してテキストで置き換える、といった処理が必要そうです。(また、①に記載した通り、画像を説明するテキストを予め付け加えておく方法もあります)

⑤ 社内用語に対応する

会社特有の単語に対応するためには、少し工夫が必要そうです。具体的な解決方法はまだ思いついていませんが、以下が利用できそうです。

  • クエリをLLMに考えさせる

    質問文中の社内用語を一般的な用語に置き換えるさせるために、Enterprise Searchで検索する前に、質問文からクエリとなるテキストをLLMに生成させる方法です。以前の記事で、解説したり実際に使用しているので、詳細はこちらをご覧ください。

    https://dev.classmethod.jp/articles/revise-retrieval-augmented-generation/

    https://dev.classmethod.jp/articles/implement-sales-documents-search-bot/

  • 辞書・用語・説明集を作る

    上記の例でいうと「20期」に対応するために、「クラスメソッド株式会社は2004年7月7日設立で、2004年が1期目」であるといった説明を加えれば、LLMが対応して回答できそうです。

    ただ全てを網羅した用語集を、作成したり更新していくことは現実的でなく、また、プロンプトに付加できるテキスト量も制限があるため、もう少し検討が必要そうです。例えばfine-tuningなどで、これらの知識を予め学習させてモデルを作成する方法も利用できそうです。

難しい課題であるため、今後検討していきたい内容です。

⑥ プロンプトを改良する・モデルを改良する

前回の記事で記載したとおり、引き続きReadやComposeで使用しているプロンプトは改良の余地があります。特に、質問したユーザの情報(所属オフィス、所属部門、チーム名)や、現在日時を入れることで、そのユーザやその時に合わせて自動で対応できる幅が広がりそうです。

また、モデルをより高速なものや精度が高いもの、コストが低いものがあれば、それに置き換えたいところです。特に今回はモデルのタスクが決まっているため、gpt-3.5-turboをfine-tuningすればgpt-4レベルに精度が引き上げられることが期待できます。Read部分は、gpt-3.5-turboのまま、精度が良くなり、Compose部分は、gpt-4をgpt-3.5-turboに置き換えることで、コストが下がり処理時間も短くなると予想されます。全体的な精度の向上や処理時間の短縮に、ひいては体験向上につながり、また、fine-tuningしたモデルは使いまわしができそうなので、チャレンジしたいところです。

⑦ ドキュメントに基づかない一般的な回答を検出し、ユーザに伝える

LLMの仕組み上、一般的な情報で回答してしまうこと自体を防ぐのは難しそうです。プロンプトを工夫することも考えられますが、漏らさず対処することは難しいことが予想されます。代わりに、一般的な回答であることを検出して、その旨を補足メッセージでユーザに伝えることが良さそうです。

今回のComposeのプロンプトでは引用したドキュメントの番号を付けるように指示しました。実際に回答されたメッセージを見てみると、ドキュメントをもとにした回答では、”[0]”のような引用が付与され、一般的な回答をしているケースでは、”[0]”のような引用がありませんでした。(「ドキュメントに情報がない」という回答しているケースもありました)

なので、これを判定して、ボットが検索したドキュメントに情報が含まれていない場合、追加のメッセージで「検索したドキュメントに情報がなく、一般的な内容を述べている可能性がある」とユーザーに伝え、利用したドキュメントのリストを表示して、どこを検索したかユーザがわかるように改良しました。

こうした引用させるプロンプトの方法や、後処理を併用する方法は、今後も活用できそうです。

⑧ ユーザへの伝え方を工夫する

業務効率化の観点では、使ってもらうユーザへの取り組みも必要だと思います。以下の2点が候補としてありえそうです。

  • 事前準備(オンボーディング・告知方法)

    説明会を開いて、情報の範囲や質問のテキストの書き方について説明やアドバイスをする機会を設け、想定通りの利用を促したいところです。また、利用を促すために、定期的にドキュメントのアップデートをしてそれを告知することで、ユーザに継続的に利用してもらうループづくりも検討に入れたいところです。

  • インタフェースでの説明の見せ方

    今回利用した、SlackアプリのDMでやり取りする場合、説明を表示できるタブ(「ホーム」、下図1枚目)と、実際にメッセージをやり取りするタブ(「メッセージ」、下図2枚目)が分かれており、実際に利用するときに説明が見えなくなってしまい、ユーザが見落としてしまいます。定期的に説明メッセージを送信する方法も考えられますが、ユーザからするとうるさく感じられてしまいそうです(結果、ミュートされて見られなくなってしまう)。このあたりは利用するインタフェースに応じて、表示方法を検討する必要がありそうです。

⑨ フィードバックの使い道

今回は評価のために使用しましたが、他にも改善のための使い道があります。

  • Enterprise Searchを始めとするエンタープライズ検索は「ユーザからのフィードバックを送信することで、以降の検索結果を改善する機能」を持っていることが多いです。ユーザからのフィードバックを連携することで、ユーザが使っていくにつれて検索精度が改善されることが期待できます。
  • 参考にならなかった回答を生成する際に使用されたドキュメントは、内容がおかしい可能性が高いです。データを溜めて分析し、修正するべきドキュメントの修正候補を取り出すことができそうです。

「社内公式情報」だけでなく、他の業務情報のドキュメントのQAもできるようにしたいと思っています。インデックスを同じものに含めるか別にするか、また、インタフェースも同じチャット画面から両方聞ける形にするか分ける形にするか、は考えどころです。

今回は使用しませんでしたが、エンタープライズ検索として、AWSのKendraやAzureのCoginitive Searchを使用しても同様の回答が得られることはすでに確認しています。さらに、それぞれのサービスごとの機能・性能や料金などをより詳細に把握し、要件や状況に合わせてどのサービスが良いか選択できるようにしたいです。

前回の記事で述べたように、処理時間が30秒~1分以上かかるケースがあるようです。利用する側からすると長く感じてしまうレベルなので、短縮する方法を探りたいです。

まとめ

社内情報のドキュメントに関するQ&Aができるシステムを、RAGの方式を使ってプロトタイプを作成しました。インタフェースとしてSlackを通してやり取りできるようにし、内部にはGoogle CloudのEnterprise SearchとOpenAI APIを使って実装しました。社内で3週間試用し、フィードバックを分析した結果、70%以上の質問が解決できたと回答され、業務効率化に有効であることがわかりました。また、今後の課題も発見できました。

謝辞

プロジェクトの進め方について、テナーさんにアドバイスにいただきました。いつもありがとうございます!

Google CloudへのデプロイやSlackとの連携部分は、五十嵐さんが作成した内容です。無茶振りに応えていただき、ありがとうございました!

Appendix

エラー対応

試用中、以下の点がエラーの原因になったため、修正しました。

OpenAI APIのタイムアウトへの対応

当初、OpenAIのChatCompletion APIを実行する際のtimeoutのパラメータを60秒にしていましたが、タイムアウトすることが時々発生しました。ReadやComposeのプロンプトに書かれているテキストの量が多かったため、トークン数が多いことが原因だったようです。また、リクエストが重なったことが原因で、処理が遅くなった可能性も考えられます。

この問題は、timeoutのパラメータを120秒に設定し、エラーが起きた際にはretryするように処理を修正することで解決しました。

Enterprise Searchが変更されたことへの対応

Enterprise Searchのsearchのレスポンス中にextractive_segmentsが含まれないケースが発生しエラーになりました。Preview機能であることもあり、変更があったようです。

この問題は、レスポンス中にextractive_segmentsが含まれているときはそれを使用し、含まれないときはextractive_answersを使うように処理を修正して解決しました。

※ 追記:再度extractive_segmentsが含まれるようになったようです。

コスト・費用

今回の3週間動かした費用は以下のとおりです(おおよその概算です。1クエリあたりの料金が前回の記事のものと同じであると仮定しています。Notion・Slackの料金は含んでなく、Google Cloud・OpenAI APIの利用費です)。

  • 固定課金(クエリ数に関わらずかかる料金)
    • Enterprise Search インデックス容量(1.6GB・3週間≒3/4ヶ月):$6 = 870円
  • 従量課金(クエリ数に応じてかかる料金)
    • 17.98円 * 415件 = 7,387円
  • 合計
    • 8,257円

この値から推定すると、今回の使用ペースでは1ヶ月あたり1万円程度になりそうです。

詳細は前回の記事(料金部分)をご覧ください。