チャンキングについて今回紹介するのは、文書の構造や内容に応じて柔軟にチャンクサイズを変更する手法です。例えば、既に段落や見出しごとにチャンクを分けていても、内容・意味を理解して分割すれば、情報の意味を保ったまま、より効率的に検索できるようになります。このような分け方を「セマンティックチャンキング」といいます。このためのライブラリがオープンソースで提供されていますが、試すのが簡単なのは「生成AIに文書を渡し、意味のあるまとまりに分割するよう指示する」方法です。
生成AIに与えるプロンプトの例を以下に示します。
あなたは日本語の社内文書をRAG向けにセマンティックチャンキングする専門家です。
以下の文書を、検索と質問応答で使いやすい意味単位に分割してください。
## 要件
- 意味のまとまりを優先し、見出しや章立ても可能な限り維持する
- 文の途中で切らない
- 1チャンク1主題を原則とする
- 手順、規程、FAQ、案内文の特性に応じて自然に分ける
- 参照語、例外条件、注意事項、問い合わせ先は切り離さない
- 固有名詞、略語、数値、期限、部署名、製品名を分断しない
- 1チャンクは300から700文字程度を目安にする
- 出力はJSON形式で、chunk_id, title, text, keywords, section_path を含める
ある用語の検索で、欲しい文書ではなく別の文書が参照されてしまうといった場合に、文書の作成日、カテゴリー、重要度などの属性情報(メタデータ)を検索に組み込むことで、より信頼性の高い、適切な情報を取得できる手法です。例えば「最新の情報を優先」「重要度が高い文書を上位に」といったフィルタを設定することで、精度の向上を図ることが可能です。
ただし、メタデータの在り方を設計して文書ごとに付与するのは手間がかかりますし、メタデータ自体の質が悪いと精度も悪くなるため、何をメタデータとして扱うかは慎重に考慮すると良いでしょう。
| 追加策 | 効果 | 概要 | 注意点 |
|---|---|---|---|
| マルチパス検索 | ・柔軟な検索が可能 | ・BM25などのキーワード検索やベクトル検索と組み合わせる | ・検索回数が増えコストや処理時間が増加 ・重複やノイズの対策が必要 |
| クエリ拡張・最適化 | ・検索ヒット率が向上する ・曖昧な質問でも回答しやすい |
・同義語追加や質問分解などでユーザークエリを検索しやすい形に変換 | ・拡張しすぎると意図がずれて無関係な結果が増える |
| コンテキスト強化 | ・回答の正確性が向上する ・ハルシネーション抑制 |
・検索結果の関連段落や周辺情報をまとめてLLMに渡す | ・コンテキストウィンドウの上限を超えないよう管理が必要 ・関連情報が多すぎてノイズとなる場合がある |
| セマンティックチャンキング | ・検索精度が向上する ・固定長分割による文脈の断絶を防げる |
・意味的なまとまり(段落/トピック境界)を考慮して分割する | ・処理のコストと時間が増加する |
| メタデータ活用 | ・検索対象を絞り込むことで精度・速度が向上する ・日付やカテゴリーによる柔軟なフィルタリングが可能 |
・文書チャンクに作成日、著者、カテゴリー、ソースなどのメタデータを付与する ・ベクトル検索と組み合わせてフィルタリングや重み付けを行う |
・メタデータの設計/付与/管理にコストがかかる ・メタデータの品質・一貫性が低いと逆効果になる |
RAGは、外部から関連情報を検索しその内容を基に回答を生成する仕組みです。生成AI自体の知識だけでなく、外部の最新データや専門情報を活用できるのが最大の特徴です。
しかし、全ての課題にRAGが適しているわけではありません。以下の項目を確認し、該当項目が多い場合は、RAGや生成AI以外の手法もあらためて検討してみてはいかがでしょうか。
ご紹介した対策は一度に全てではなく、段階的に1つずつ実施して効果を確かめながら進めていくことをお勧めします。
文書や使い方の特性からどの対策を導入するかを決めていくことになります。迷う場合は、導入難易度が低めな「クエリ拡張・最適化」や「メタデータ活用」から着手し、さらに精度を追求したい場合には、それ以外の対策に広げていくのがお勧めです。
| 対策 | 導入難易度 | 必要な知識 |
|---|---|---|
| マルチパス検索 | 中 〜高 | ・検索結果の統合手法 ・LangChain/LlamaIndexなどのマルチパス検索パイプライン実装スキル |
| クエリ拡張・最適化 | 低〜中 | ・ユーザーの検索意図の分析 ・言語化スキル |
| コンテキスト強化 | 中 | ・ドキュメントの階層構造の理解 ・トークン数(コンテキスト長)とコストの最適化スキル |
| セマンティックチャンキング | 中〜高 | ・自然言語処理(NLP)の基礎知識 ・類似度計算やクラスタリングの実装スキル |
| メタデータ活用 | 低 | ・データ構造・スキーマ設計の知識 ・メタデータフィルタリング機能の理解 |
ここまでを一通り試しても納得のいく精度が出ず、RAGでの対策に限界を感じた場合は、生成AIのモデルそのものに手を入れることを検討することになります。
| 精度向上対策 | 概要 | メリット | デメリット | 学習コスト | 導入難易度 |
|---|---|---|---|---|---|
| RAG | ・外部DBから関連情報を検索し、プロンプトに付加して回答を生成する | ・モデルの再学習が不要 ・出典を明示しやすい |
・処理時間が増加する ・文書の管理が必要 |
低 | 低〜中 |
| ファインチューニング | ・モデルのパラメーターを追加学習により更新する | ・特定領域への適応精度を高められる ・振る舞いや出力形式を細かく調整可能 |
・学習コストがかかる ・新しい情報への対応は再学習が必要 |
高 | 中〜高 |
| 蒸留 | ・大規模モデル(教師)の知識を小規模モデル(生徒)に転移させる | ・モデルを軽量化できる ・推論速度が向上する ・低リソース環境に対応可能 |
・教師モデルの精度が上限になる ・バイアスや誤りも継承してしまう |
中 | 高 |
既存の生成AIモデルに、専門データを学習させてカスタマイズする手法です。特有の用語や文脈に強くさせられますし、推論結果の出し方を調整することも可能ですが、業界特有の専門用語、業務ルール・スタイルなど特定の知識を学習させるためのデータ準備に時間がかかったり、大量の計算リソースが必要になったりするため、法律・歴史などのように、一度学習した知識の更新頻度が少ない領域に向いています。
大規模で高精度なモデルの知識を、小規模で高速なモデルに圧縮/転移させる手法です。エッジデバイスのような計算能力が低い環境で動作させることも可能なことと、精度を保ちつつ、処理速度やコストを削減できることが特徴です。
データを外部に出す必要がなく、閉じた環境で構築しやすいのですが、蒸留用のデータセットを作成する必要があり、その分コストや難易度は高くなります。
蒸留により、ノイズの除去や重要情報の強調がやりやすくなります。また、より高性能なモデルを対象に蒸留することで、精度の向上が期待できます。
今回ご紹介した改善策を全て試みた上で、さらなる精度向上が必要な場合や、以下のような課題が残る場合は、ファインチューニングもしくは蒸留を選択肢として考えても良いでしょう。
| 対策 | 解決すべき課題 |
|---|---|
| ファインチューニング | ・回答の出力形式や判断基準が安定しない ・「長い文章をまとめさせる(要約)」「入力情報を独自の判断基準やルールで仕分ける(分類)」「文書から必要な情報だけを取り出す(データ抽出)」など毎回同じパターンの処理を繰り返しており、より高い精度と安定性を求めたい |
| 蒸留 | ・RAGの「検索+生成」のプロセスが重く、応答速度が遅いためユーザーの満足度が低い ・大規模モデルのAPI利用コストや運用コストが見合わない |
以下に挙げるのは例であり、必ずしもこの通りに実施する必要はありませんが、目安として参考になれば幸いです。
STEP1(すぐ実施)
STEP2(1、2カ月後)
STEP 3(それ以降)
精度向上は一度で完結するものではなく、段階的な改善の積み重ねです。またファインチューニングや蒸留は確かに強力な手法ですが、RAGと比較するとコストと時間がさらに多くかかりますので、採用は慎重に判断すると良いでしょう。
重要なのは、「本当にこの対策が必要かどうか」を見極めることです。基本的な改善策と最近の手法を組み合わせることで、十分な精度が得られることも多いと思います。
まずは本記事で紹介した対策を、優先順位を付けて試してみてください。その過程で、取り扱うデータやユースケースに最適なアプローチを見つけてみてはいかがでしょうか。
Copyright © ITmedia, Inc. All Rights Reserved.