RAG(検索強化生成)を用いた大規模言語モデル(LLM)によるQ&Aチャットボットは、実装が容易でありながら驚くべき成果をもたらす可能性を秘めています。しかし、より多くのデータと多岐にわたる質問に対応する中で、多くの課題が浮上することも少なくありません。最近取り組んだプロジェクトでも、そのような困難に直面しましたが、それを乗り越える解決策を見つけ出しました。
プロジェクト概要
このプロジェクトでは、28年間に渡る世界の時事に関する週刊ニュースレターから構成されるデータセットを扱いました。パラグラフや章といった明確な区切りがない形式で、1500以上のPDFファイル、約10.5Mトークンの日本語テキストで構成されています。特定の範囲に限定された質問に対しては、基本的なRAGの実装でもスムーズに回答できました。しかし、「2020年以降に起きた主要な出来事は何か?」といった広範な質問に対しては、非構造的で大量のデータから適切な情報を抽出することが難しく、的確な回答を提供できませんでした。
解決策の概要

✔クラスタリングと要約の階層化: データを文章が途切れないようにしつつ一定のトークンサイズに分け、年月とトピック別にクラスタリングし、各クラスタを要約。これを段階的に繰り返すことで、詳細なレベルから幅広いレベルまでの質問に対応できる情報を効率的に取得できるようになりました。この手法はParth Sarthi氏らのRAPTORアプローチからヒントを得ています。
✔メタデータとベクトルデータの追加: 各チャンクにドキュメントから抽出した発行年月日や号数などのメタデータを付与し、さらに埋め込みベクトルを追加。これにより、メタデータフィルタリングやベクトル検索を活用して検索の精度と効率が向上しました。
✔質問の拡張と分解: LLMを使ってユーザーの質問を拡張・分解し、必要に応じて複数の具体的かつ的確な検索条件を生成。メタデータフィルタリングの条件も含みます。これにより、複雑な質問にも対応可能となりました。
✔ハイブリッド検索(Hybrid Search)の導入: BM25とベクトル検索を組み合わせたハイブリッド検索を導入。BM25はテキストの頻度に基づく検索を提供し、ベクトル検索は意味的な類似性を捉えるため、これらを組み合わせることで精度の高い検索結果を得ることができました。
✔適切さの評価と選別: LLMによって検索結果の適切さを5段階評価し、評価が高いものだけを使用することで、高品質な回答を保証しました。
終わりに
👉それぞれの詳細や、開発に用いたローカルLLM、LLMによる構造化出力のためのInstructorライブラリ、オープンソースのLLMエンジニアリング・ツールLangfuseなどの関連情報について、今後も定期的にポストしていきます。興味のある方は、ぜひフォローしてください。また、特定の部分についてさらに知りたい場合や質問がある場合は、コメントで教えてください。皆さんのアドバイスやフィードバックも大歓迎です!