Databricks生成AIクックブック - 収集品質のデバッグ

[Debugging retrieval quality — Databricks Generative AI Cookbook](https://ai-cookbook.io/nbs/5-hands-on-improve-quality-step-1-retrieval.html) [2024/6/26時点]の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> [Databricks生成AIクックブック](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204)のコンテンツです。

# 収集品質のデバッグ

## 収集品質のデバッグ方法

**あなたが実施した[根本原因分析](https://qiita.com/taka_yayoi/items/c1f76a39a43506fe7e33)によって、収集の改善が対応すべき根本原因であることがわかったのでこのページを参照しています。**

収集の品質は、RAGアプリケーションにおいてまず間違いなく、最も重要なコンポーネントとなります。与えられたクエリーに対して最も適切なチャンクが返却されなかったら、LLMは高品質なレスポンスを生成するために必要な情報にアクセスすることができません。このため、貧弱な収集は、不適切、不完全、幻覚を伴うアウトプットにつながります。このステップでは、背後のデータを分析するための手動の工数が必要となります。Mosaic AIを用いることで、データプラットフォーム(Unity CatalogやVector Search)と実験トラッキング(MLflow LLM evaluationやMLflow tracing)の間の密連携によって、これは非常に簡単なものになります。

## 手順

**収集の品質**問題に対応するためのステップバイステップのプロセスを以下に示します:

1. [`B_quality_iteration/01_root_cause_quality_issues`](https://github.com/databricks/genai-cookbook/blob/main/rag_app_sample_code/B_quality_iteration/01_root_cause_quality_issues.py)ノートブックを開きます。
1. 収集品質問題があるレコードのMLflow traceをロードするためのクエリーを使用します。
1. それぞれのレコードに対して、収集されたチャンクを手動で検証します。可能であれば、正解の収集ドキュメントとそれらを比較します。
1. 低品質の収集によるクエリー間でのパターンや共通的な問題を探します。例には以下のようなものがあります:
    - ベクトルデータベース全体で適切な情報が不足している。
    - 収集クエリーに対して返却されるチャンク/ドキュメントの数が不十分。
    - チャンクが小さすぎて、十分なコンテキストに欠けている。
    - チャンクが大きすぎて、複数かつ関係のないトピックが含まれている。
    - エンべディングモデルがドメイン固有の用語の意味論的類似性を捕捉することに失敗している。
1. 特定した問題に基づき、潜在的な根本原因と対応する修正方法について仮説を立てる。このガイドに関しては、以下の[貧弱な収集品質の一般的な理由](#貧弱な収集品質の一般的な理由)の一覧をご覧ください。
1. 修正方法を実装、評価するために[変更の実装と評価](https://qiita.com/taka_yayoi/items/42de353690e29dbb6efe)のステップに従います。
    - これには、データパイプラインの修正(チャンクサイズの修正、別のエンべディングモデルを試すなど)やRAGチェーンの修正(ハイブリッド検索の実装、より多くのチャンクの収集など)が含まれることがあります。
1. 依然として収集品質が不十分である場合には、期待されるパフォーマンスが得られるまで、次のより有望な修正策を特定するまでステップ4-5を繰り返します。
1. チェーン全体で対応すべき他の根本原因が他にないのかを特定するための[根本原因分析](https://qiita.com/taka_yayoi/items/c1f76a39a43506fe7e33)を再実行します。

## 貧弱な収集品質の一般的な理由

潜在的なこれらの修正方法は、大きく分けて3つに分類されます:

1. ![](https://ai-cookbook.io/_images/data_pipeline.png)の変更
1. ![](https://ai-cookbook.io/_images/chain_config.png)の変更
1. ![](https://ai-cookbook.io/_images/chain_code.png)の変更

変更の種類に応じて、[変更の実装と評価](https://qiita.com/taka_yayoi/items/42de353690e29dbb6efe)の異なるステップに従うことになります。

| 収集の問題 | デバッグのステップ | 修正案 |
|:--|:--|:--|
| チャンクが小さすぎる  | <ul><li>不完全に情報を切り落とされていないかチャンクを検証</ul>  |  <ul><li>![](https://ai-cookbook.io/_images/data_pipeline.png) チャンクサイズやオーバーラップの増加<li>![](https://ai-cookbook.io/_images/data_pipeline.png) 別のチャンキング戦略を試す</ul> |
| チャンクが大きすぎる  | <ul><li>収集したチャンクに複数、無関係のトピックが含まれていないかをチェック</ul>  | <ul><li>![](https://ai-cookbook.io/_images/data_pipeline.png) チャンクサイズの減少<li>![](https://ai-cookbook.io/_images/data_pipeline.png) 関係のないトピックの混入を避けるためにチャンキング戦略を改善(セマンティックチャンキングなど)</ul>  |
| チャンクに取得元のテキストに関する十分な情報が含まれていない  | <ul><li>それぞれのチャンクのコンテキストの欠如が収集結果に混乱や曖昧さをもたらしていないかを評価</ul>  | <ul><li>![](https://ai-cookbook.io/_images/data_pipeline.png) それぞれのチャンクにメタデータやタイトルを追加してみる(セクションタイトルなど)<li>![](https://ai-cookbook.io/_images/chain_config.png) より多くのチャンクを収集し、より大きなコンテキストサイズを持つLLMを使用</ul>  |
| エンべディングモデルがユーザークエリーのドメイン、キーフレーズを正確に理解していない |  <ul><li>同じクエリーで意味的に類似するチャンクが収集されているかどうかをチェック</ul> | <ul><li>![](https://ai-cookbook.io/_images/data_pipeline.png) 別のエンべディングモデルを試す<li>![](https://ai-cookbook.io/_images/chain_config.png) ハイブリッド検索<li>![](https://ai-cookbook.io/_images/chain_code.png) 収集結果の数を増やしてリランク。リランクされたトップのフィードのみをLLMコンテキストとして指定<li>![](https://ai-cookbook.io/_images/data_pipeline.png) ドメイン固有のデータでエンべディングモデルをファインチューニング</ul>  |
| ベクトルデータベースに適切な情報が欠けている  | <ul><li>ベクトルデータベースで適切なドキュメントやセクションが欠けていないかどうかをチェック</ul>  | <ul><li>![](https://ai-cookbook.io/_images/data_pipeline.png) 適切なドキュメントをベクトルデータベースに追加<li>![](https://ai-cookbook.io/_images/data_pipeline.png) ドキュメントのパーシングとメタデータ抽出の改善</ul>  |
| 収集クエリーが貧弱に処理されている  |  <ul><li>ユーザークエリーがセマンティック検索で直接使用されている場合、クエリーを分析して曖昧さや特定性の欠如がないかをチェック。これは、生のクエリーが前の会話の一部を参照するマルチターンの会話でよく起きる事象であり、生のクエリーを直接収集クエリーとして用いることが不適切になります。<li>クエリーの用語が検索コーパスで用いられる用語とマッチしているかどうかをチェック</ul> |  <ul><li>![](https://ai-cookbook.io/_images/chain_code.png) クエリー拡張や変換アプローチの追加(セマンティック検索の前のクエリーの変換など)<li>![](https://ai-cookbook.io/_images/chain_code.png) 意図やエンティティを特定するためのクエリー理解の追加(メタデータフィルタリングで用いる属性を抽出するためにLLMを活用するなど)</ul> |

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [ステップ5: 品質問題の根本原因の特定](https://qiita.com/taka_yayoi/items/c1f76a39a43506fe7e33)
- 次のセクション: [生成品質のデバッグ](https://qiita.com/taka_yayoi/items/2a14ef50cec340502fec)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)