企業内ChatGPT活用「RAGの精度を上げるポイント」

はじめに

AIの技術が進化する中で、企業内でのAI活用もますます重要になってきています。その中でも、ChatGPTのような生成AIを使ったシステムは、特に注目を集めています。前回のブログでは、あらかじめFAQ(よくある質問)を作成しておく必要がなく、ドキュメントから必要な情報を取り出して回答を生成する「RAG(Retrieval-Augmented Generation)」という技術に焦点を当てその概要を説明しました。
生成AIには、しばしば「ハルシネーション」と呼ばれる、実際には存在しない情報を回答として生成してしまう課題があります。RAGは、このような誤った回答を抑え、ユーザーの質問に対してより正確な答えを提供することを目指しています。しかし、RAGを使っても完全にハルシネーションを防げるわけではありません。
今回は、RAGを使ってドキュメントに基づいた答えを精度よく出すために考慮するべきポイントを説明します。

RAGの仕組み詳細

RAGの仕組みについては前回の記事でも概要を説明しましたが、精度を上げるためのポイントを説明するにあたり、処理の流れをもう少し詳しく説明しておきたいと思います。
処理の流れを詳しく示すと下図のようになります。

STEP1のデータ登録では、まず登録したドキュメントからテキストを抽出する「テキスト抽出」の処理を行います。PDFやWordのファイルにはテキストや図形・画像などいろいろな要素が含まれており、テキストもフォントや装飾などが施されていますが、ファイル構造を解析してプレーンテキストとして抽出を行います。
次に、抽出されたテキストを「テキスト分割」処理でいくつかに分割します。この分割されたテキストをチャンク(chunk)と呼びます。テキストを分割することで、ユーザーの質問に関連の高いドキュメントの部分を抽出しやすくなりますし、生成AIには入力できるテキスト量に上限があるため、テキストを小分けにすることでその上限にかかりにくくなります。また、多くのテキストを入力すると生成AIの費用も従量課金となるため、より可能性の高いテキストだけを選んで入力した方が実用的な運用が可能となります。
テキスト分割が終わると、次にEmbeddingという生成AI関連の技術でそれぞれのチャンクを文章ベクトルに変換する「ベクトル化」の処理を行い、得られた文章ベクトルをドキュメントDBに格納します。文章ベクトルというのは、ドキュメントを区切って作ったテキストの持っている「意味」を数値化するものになります。文章ベクトルの特性は、単語や表記が違い字面では異なる文章でも、その意味が近いものは数値として近い値になるという点です。数値と言っても単一の数字ではなく概ね次元1000以上の数値のベクトルとなりますが、意味が近いものはベクトル上では近い値(正確にはベクトルの距離)になると理解していただければ大丈夫です。

STEP2はユーザーの質問への回答を行うステップとなりますが、この時は先ず、ユーザーの質問文をSTEP1の「ベクトル化」と同じ方法で文章ベクトルに変換します。このベクトルを使って、次の「類似テキストを検索」ドキュメントDBからベクトルの値が近いテキスト、すなわち意味が近いテキストを検索します。こうすることで質問に対する回答を含む可能性が高いドキュメント内の文章が検索できることになります。

「プロンプト作成」の処理で、それら検索されたドキュメントのテキストを纏めて背景情報とし、質問文とともにプロンプトを作成します。そのプロンプトを使って生成AIで回答文の作成を行います。このようにして質問に対してドキュメントの内容をもととした回答ができることとなります。

RAGの精度を上げるためのポイント

さて、ここまで仕組みを説明してきましたが、RAGに正しく効果的な答えを出してもらうには、前節の「類似テキストを検索」の部分で、如何に質問に関連の高いテキストを精度よく検索できるかであるかが重要なポイントであることがお分かりになったのではないでしょうか。
質問に関連の高いテキストが検索できなければ、いくら生成AIの性能が良かったとしても背景情報が無い状態となりますので、生成AIが持っている一般的な情報をもとにした回答しか出せず、企業独自の情報を元にした正確な回答は出せません。
質問に関連の高いテキストを精度よく検索できるようにするには、単純に大量のドキュメントを登録すれば良いというわけではなく、考慮すべきポイントがあります。RAGの精度を上げるために重要なポイントを3つ説明します。

1. 意味のあるテキストを抽出する

質問に対する検索の精度を上げるためには、「テキスト抽出」の処理においてドキュメントから意味のあるテキストを抽出することが大切です。たとえば、ドキュメントの目次や索引などは、質問に対する具体的な回答にはならず、逆に検索の際のノイズになりがちです。これらの回答に紐づかないテキストを除外し本文から有用なテキストだけを取り出すことが必要です。

2. 適切なチャンクに分割しインデックス化する

次に、ドキュメントから得られたテキストを適切なサイズに分割することが重要です。例えば、ある事柄についての説明文が説明の途中で切れてしまうと、質問に対する検索でその回答のもととなる説明文の一部しか背景情報として利用できなくなり、正しい回答を導くことが難しくなります。したがって、内容の意味が纏まっている単位でテキストを区切ることが必要です。

3. 関連性の高いテキストを検索する

最後に、質問に関連が高いテキストを検索する手法が重要になります。うまく検索できないと、回答に必要な情報を含むテキストを探し出せない、また余分な情報が含まれて誤回答をしてしまう原因となります。これを防ぐために、適切な検索アルゴリズムの選択や検索クエリの調整が重要です。

これら3つのポイントがRAGの処理フローのどこにあたるかを下図に示します。

これらの精度向上ポイントを実現するための具体的な手法は、色々なものが考え出されて提案されています。代表的なものを以下の表にまとめました。次回以降のブログではこれらの具体的な手法を順次、個別に取り上げて説明をしたいと思います。

まとめ

RAGを効果的に活用するためには、適切な情報抽出、チャンク分割、そして精度の高い検索が重要です。これらをしっかりと行うことで、ユーザーの質問に対して正確で関連性の高い回答を提供することができます。
このブログが、RAGの理解と活用に役立てば幸いです。今後もAI技術の進化に注目しながら、新しい活用法を学んでいきましょう。