索引付きの文書棚から開かれた資料へ続くアニメ背景調の書庫
制作ノート

大規模な​社内文書を​扱うRAG

2024年3月4日

大規模文書検索を​支える​評価、​分割、​検索設計の​選択を​読み解く​技術ノート。

RAGLLMOpsGoogle Cloud
出典
Google Cloud講演
事例
Generali Italia
文書
イタリア語の社内資料
評価
検索 + Q&A
検証
6段階

Generali Italiaは、社内文書を扱うアシスタントを「根拠を探す検索系」と「回答を組み立てる生成系」に分け、それぞれを別の指標で評価しました。

この記事は、2024年3月に公開したMedium記事を、42分間のGoogle Cloud講演と照合して再構成したものです。Generali Italiaのチームは、デフォルト設定から始め、段落単位の分割、ハイブリッド検索、再ランキング、文書集合の拡大へと進みました。各変更が検索の再現率と回答精度へどう影響したかを追っています。

以下の製品名と利用可能な機能は、2024年2月時点の講演内容です。その後、Google Cloudのモデル名や検索製品の構成は変わっています。現在の環境で再現する場合は、最新の公式ドキュメントを確認してください。

01 / アーキテクチャ

取り込みと推論を分ける

再現可能なパイプラインで索引を作り、推論系で関連文書を検索して回答を構成します。

初期構成では、実験とパイプラインにVertex AI、文書処理とチェーン制御にLangChain、生成にGeminiとPaLM、ベクトルストアにQdrantを使用しました。元資料がイタリア語であるため、多言語エンベディングモデルを選んでいます。

取り込みと評価

文書はCloud Storageに置き、Vertex AI Pipelinesで取り込み、段落とサブチャンクへの分割、エンベディング、BM25索引の作成を実行します。評価は別パイプラインに分け、上位15文書での再現率とQ&A精度を測定しました。採用したプロンプト、temperatureなどのパラメータは、推論系から参照できる成果物として保存します。

推論

フロントエンドからバックエンドを呼び出し、そこで検索とプロンプト構成を行います。Qdrantはセマンティック検索とメタデータによる絞り込みを担い、Firestoreには会話履歴を保存します。検索したチャンクをコンテキストへ加え、モデルが回答と参照元を返す構成です。

講演では、独自に組んだ検索層の一部をVertex AI Vector Searchへ置き換える案も挙がりました。当時Vertex AI Searchと呼ばれていた製品は、現在Gemini Enterprise Agent PlatformのAgent Searchへ展開されています。現在の名称と2024年の実装は分けて捉える必要があります。

02 / 検証

6つの変更を順に試す

数値は講演で報告されたものです。再現率は上位15文書を対象にしています。
  1. 01

    デフォルト設定を基準にする

    固定長の分割、基本のエンベディングモデル、検索器のデフォルト設定で索引を作りました。この段階では正式な評価データセットを用意していません。

    45,000チャンク · 定性評価のみ

  2. 02

    段落単位で分け、検索器を調整する

    合成質問を作成し、多言語エンベディングへ変更しました。チャンク分割と検索パラメータも調整し、この文書集合では1,000文字が最良でした。コンテキストへ渡すチャンク数は、およそ10件を超えると再現率の伸びが落ち着いています。

    13,000チャンク · 再現率80.0% · Q&A精度73.1%

  3. 03

    用語定義を明示的に追加する

    保険用語と略語を説明する4,000チャンクを手作業で追加しました。全体指標はわずかに下がりましたが、用語の意味を答えることが製品要件だったため、この変更を残しています。

    17,000チャンク · 再現率78.0% · Q&A精度72.5%

  4. 04

    密検索と字句検索を組み合わせる

    多言語エンベディングとBM25を組み合わせたハイブリッド検索へ移行しました。検索と回答の両方が大きく改善し、検索できない根拠は生成側でも補えないという観察を裏づけています。

    17,000チャンク · 再現率84.0% · Q&A精度76.0%

  5. 05

    コンテキストを再ランキングする

    検索したチャンクを別のモデルで並べ替えてから生成へ渡しました。この検証は、長いコンテキストの中央にある情報をモデルが利用しにくい現象を示したLost in the Middleを参照しています。講演では、重要度の高いチャンクを後方へ置く並びが報告されました。

    再現率84.0% · Q&A精度77.9%

  6. 06

    文書集合を広げ、モデルを更新する

    文書数の増加とプロンプト変更により検索条件は難しくなり、再現率は低下しました。一方、PaLM 1からPaLM 2への更新によって、報告された評価上の回答精度は改善しています。

    再現率69.0% · PaLM 1 Q&A 72.0% · PaLM 2 Q&A 78.0%

03 / 評価

合成データをそのまま信じない

合成質問によって検証を進められますが、人による品質確認は必要です。

チームは段落チャンクから質問と回答の組を生成し、学習、検証、テストに使う約2,000問を構成しました。正解データ不足を補う実用的な方法ですが、生成した評価セット自体を確認しなければ、測定対象と同じモデルの誤りを評価側でも繰り返すおそれがあります。

分割は段落境界を優先し、長い段落のみLangChainの反復型スプリッターで細分化しました。意味の異なる複数段落が1チャンクに混ざることを避ける設計です。1,000文字という結果は、この文書集合と質問群で得た値であり、あらゆるRAGに共通する初期値ではありません。

文書数が少ない間は、更新のたびにエンベディング索引を再構築する運用でも対応できます。更新量が増えた段階で、差分取り込みとパラメータ化したパイプラインを導入します。Vertex AI Pipelinesの成果物はCloud Storageへ保存し、Qdrantではチャンクごとのメタデータを保持して検索と絞り込みに利用しました。

04 / 質疑応答

運用で生じる問い

質疑応答では、文書更新、表データ、メタデータ、会話の文脈をどう扱うかが議論されました。

文書が更新されたらどうするか

文書集合が小さい間は、エンベディング索引を作り直す方法が単純で確実です。文書数と更新頻度が上がった段階で差分パイプラインを導入し、チャンク分割とエンベディングのパラメータを明示的に管理します。

複雑なスプレッドシートをどう分割するか

Pandasなどで各シートを前処理し、セル同士の意味が残るよう文章や区切り文字を加えて直列化する案が示されました。セルの関係をモデルが読める構造にするには、入力時のプロンプト設計も必要です。

成果物とメタデータをどこへ保存するか

Vertex AI Pipelinesは実験成果物をCloud Storageへ保存します。Qdrantではチャンクと一緒にメタデータを保持できるため、ファイル名以外の条件でもセマンティック検索と絞り込みができます。

補足質問の文脈をどう維持するか

それまでの会話を要約する方法と、会話全体を次のプロンプトへ含める方法が挙げられました。どちらもモデルの入力長に制約され、この部分は検討中と説明されています。

05 / 要点

回答精度の上限は検索で決まる

この事例から持ち帰れるのは、個別の数値より検証の進め方です。検索と生成を別々に測り、変更点を一つずつ増やし、総合指標が少し下がっても製品に必要な知識は残します。検証3の用語チャンクは、その判断をよく示しています。

2024年時点の次候補はGemini 1.5 Pro、Vertex AI Auto SxS、Vertex AI Vector Searchでした。現在これらを試す場合は、講演当時の名称や提供状況ではなく、最新のGoogle Cloudドキュメントを出発点にする必要があります。

本稿はMedium版の記事を日英で再編集したものです。アーキテクチャと指標の一次資料は、リンク先の講演です。