見出し画像

LLMを活用したドキュメントベースのChatbotへのアプローチ

こんにちは。EXPLAZAのエンジニア、shitian.niと申します。
8月末のLLM Application Meetup vol.2での登壇内容、ドキュメントベースのチャットボットのアプローチについて、こちらで改めて紹介いたします。

LLMを活用したドキュメントベースのチャットボット

弊社では、他社さま向けに、労務関連のPDFを活用したチャットボットの開発を行っています。データ保護等の観点から、直接OpenAIを活用せず、Azure OpenAI Serviceを採用しています。

Azure Cognitive Searchを利用し、ユーザークエリに関連するテキストを労務関連の多数のPDFから抽出し、そのテキストをAzureChatOpenAIのPromptに入れる仕組みを採用しました。

テスト用の問答集での確認をした結果、一部の質問に対して”申し訳ありませんが、該当する文章が見つかりませんでした”との回答が返ってきました。
その原因を探ると、Azure Cognitive Searchによる抽出テキストにクエリと関連する内容が含まれていなかったため、PromptをAzure OpenAIに渡しても、LLMが適切に回答できなかったようです。この問題の解決のためにファインチューニングの方法を検討しました。

テキストに関する問答集の自動生成

ファインチューニングには、一つのパターンにつき数百件の学習データが必要です。
大量のPDFファイルと多様なユーザー質問のパターンを考慮すると、ファインチューニングに必要なデータ生成は、時間的、コスト的に非現実的でした。そのため、Prompt Engineeringに絞って、Azure Cognitive Searchの代わりとなるテキスト抽出手法も検討することとなりました。

LangChainが提供しているテキスト抽出ライブラリ

LangChainは多くの使いやすいテキスト抽出ライブラリを提供しています。どのライブラリを採用するかは、慎重に選ばなければなりません。

Vector Search と Vector DBの比較

Vector SearchとVector DBは存在しますが、ユーザーケースに応じて最適なものを選択することが推奨されています。

どのテキスト抽出アルゴリズムを選ぶかを決める前に、全体のシステム構成図を確認してみましょう。

検索付きドキュメントQAボット

TextSplitterを利用して、PDFファイル内の多量のテキストを細分化します。
この細分化により、さまざまな箇所に存在するクエリ関連テキストを抽出し、GPTのPromptに適用することが可能となります。
関係のない文書をPromptから極力除外するために、多くのテキストチャンクから選択的にテキストを抽出し、再ランキングしてソートし、GPT Promptに渡します。
ベクトル検索を使用したテキスト抽出には、再ランキングの効果は限定的ですが、キーワード検索に基づく抽出では再ランキングが有効です。

テキスト抽出手法の比較ツール

テキスト抽出の比較ツールを考案しました。
既存のPDF集と試験用のクエリ問答集があるとします。

試験用のクエリ問答集の作成方法は2種類あります。
人間がPDFを目視し、質問と回答の組み合わせを手動で作る方法があります。もしくは、ファインチューニングの話の中で出たGPTによる問答自動生成の方法もあります。
今回は前者の手動で作られたクエリ問答集を活用しています。

既存のPDF集と試験用のクエリ問答集を基に、ユーザーが希望するアルゴリズムでPDF集からドキュメントを抽出します。

その抽出結果を基に、アルゴリズムごとにCSVファイルを生成し、Google Spreadsheetなどで可視化することができます。

さらに、GPT Promptにこの結果を入力して回答を生成し、正答との比較を行います。トークンの相関や所要時間に基づき、アルゴリズムごとにスコアを付け、スコア順にCSVファイルをソートします。

一つのアルゴリズムを選択する場合は、ランキングの上位のアルゴリズムがおすすめです。

複数のアルゴリズムの結果を統合してPromptを使用する場合は、可視化されたCSVファイルを参照して、スコアと抽出ドキュメントの違いを総合的に評価して選択するのが良いでしょう。抽出結果が大きく異なるアルゴリズムを統合することで、よりバランスの良い結果が得られる可能性があります。

今回のプロジェクトでのアルゴリズム比較結果

今回のプロジェクトにおけるテキスト抽出手法の比較結果として、Faissはトップになりました。比較に使われたデータセットは手動で作成された問答計10組でした。

PDFをText Splitterで細分化し、データセットのクエリ毎にLangchain Retriever、LLMを経て答えを生成し、目視でデータセットの既定正解と比較しました。

Promptには、"参照ドキュメントファイル名も教えてください"を入れています。生成答えの参照ファイル名と既定正解に記載された参照ファイル名の比較も正解判断に利用しました。

テキスト抽出結果のDocument.page_contentもprintしました。答えが間違った場合、テキスト抽出ツールの責任か、LLMの責任か判断できるようになりました。

キーワード検索の手法の正解率はかなり低かったです。少しでもトークンの表現が違ったら、クエリとPDFテキストのマッチングができなくなります。今回のタスクには向いていないことが分かりました。

まとめ

労務関連のPDFを活用したチャットボットを作成する際のアプローチと、AzureやLangChainなどのソリューションの比較、ファインチューニングに関する問題など、多くの課題がありましたが、試行錯誤の結果、より良いチャットボットを作成することができました。今後も引き続き研究・開発を進め、ユーザーにとって有益な情報提供を行ってまいります。

この記事が気に入ったらサポートをしてみませんか?