「検索強化生成システムのパフォーマンスを向上させるための10の方法」
10 Ways to Improve Performance of Search Enhancement Generation System
プロトタイプから本番への道具
クイックスタートガイドだけでは十分ではありません
「リトリーバルオーグメンテッドジェネレーションは、ChatGPTのような大規模な言語モデル(LLM)に、システムが別の場所から取得した追加情報をユーザーの入力に補完するプロセスです。 LLMはそれを使用して生成される応答を補完するためにその情報を使用できます。」- Cory Zue
LLMは素晴らしい発明ですが、1つの重要な問題があります。彼らはでっち上げをします。 RAGは、クエリに答える際に事実の文脈を利用することで、LLMをはるかに有用にします。
LangChainやLlamaIndexのようなフレームワークのクイックスタートガイドを使用すれば、約5行のコードで簡単なRAGシステム(ドキュメント用のチャットボットなど)を構築できます。
- 「LLMプロンプティングにおける思考の一端:構造化されたLLM推論の概要」
- 「プログラマーの生産性を10倍にするための5つの無料のAIツール」
- 「Amazon SageMakerを使用して、Rayベースの機械学習ワークフローをオーケストレーションする」
しかし、5行のコードで構築されたボットはうまく機能しません。 RAGはプロトタイプ作成は簡単ですが、本番環境への展開は非常に困難です。基本的なチュートリアルではRAGを80%の動作にすることができるかもしれません。しかし、次の20%を埋めるには本格的な実験が必要です。ユースケースによっては、ベストプラクティスはまだ確立されておらず、異なる場合もあります。しかし、ベストプラクティスを見つけることは私たちの時間と労力に十分な価値があります。なぜなら、RAGはおそらくLLMを使用する最も効果的な方法だからです。
この記事では、RAGシステムの品質を向上させるための戦略を調査します。これは、基本的なセットアップと本番レベルのパフォーマンスのギャップを埋めたいRAGを使って構築する人々に対してカスタマイズされています。この記事の目的は、システムが適切な文脈を見つけ、適切な応答を生成するクエリの割合を増やすことです。読者がRAGの動作原理をすでに理解していることを前提とします。そうでない場合は、Cory Zueによるこの記事を読むことをお勧めします。また、これらのツールを構築するために使用される一般的なフレームワーク(LangChainとLlamaIndex)についても基本的な知識があることを前提とします。ただし、ここで議論されるアイデアはフレームワークに依存しません。
私は、カバーする各戦略を具体的に実装する方法の詳細には立ち入らず、むしろそれがどのような場合に有用であり、なぜ有用であるかを示そうとします。この領域は非常に速く動いているため、最新のベストプラクティスを完全かつ正確に提供することは不可能です。代わりに、リトリーバルオーグメンテッドジェネレーションアプリケーションの品質向上を試みる際に考慮すべきいくつかの事項を概説することを目指しています。
リトリーバルオーグメンテッドジェネレーションのパフォーマンスを向上させる10の方法
1. データをクリーンにする。
RAGはLLMの機能をデータに接続します。データが混乱している場合、内容やレイアウトのいずれかで、システムは困難を抱えます。矛盾した情報や冗長な情報を含むデータを使用している場合、リトリーバルは適切な文脈を見つけるのに苦労するでしょう。そして、LLMによって実行される生成ステップは最適ではないかもしれません。例えば、スタートアップのヘルプドキュメント用のチャットボットを構築しており、うまく機能しない場合、最初に確認すべきことはシステムに供給しているデータです。トピックは論理的に分割されていますか?トピックは1つの場所でカバーされていますか、それとも別々の場所でカバーされていますか?あなたが人間として、一般的なクエリに答えるためにどのドキュメントを参照する必要があるかを簡単に判断できない場合、リトリーバルシステムもできません。
このプロセスは、同じトピックの文書を手動で組み合わせるだけでも簡単ですが、さらに進めることもできます。私が見た中でより創造的なアプローチの1つは、LLMを使用して提供されたすべてのドキュメントの要約を作成することです。リトリーバルステップでは、まずこれらの要約に対して検索を実行し、必要な場合にのみ詳細に入ります。一部のフレームワークには、これが組み込まれているものもあります。
2. 異なるインデックスタイプを試す。
インデックスはLlamaIndexとLangChainの中核です。これは、リトリーバルシステムを保持するオブジェクトです。RAGの標準的なアプローチでは、埋め込みと類似度検索が使用されます。コンテキストデータを分割し、すべてを埋め込み、クエリが来たら、コンテキストから類似した部分を見つけます。これは非常にうまく機能しますが、すべてのユースケースにとって最適なアプローチではありません。クエリは、例えば電子商取引ストアの製品などの特定のアイテムに関連するものですか?キーワードベースの検索を試してみることを検討してください。一つか他のどちらかにする必要はありません。多くのアプリケーションではハイブリッドを使用します。たとえば、特定の製品に関連するクエリにはキーワードベースのインデックスを使用し、一般的なカスタマーサポートには埋め込みを使用することができます。
3. 自分のチャンキングアプローチを試してみてください。
コンテキストデータのチャンキングは、RAGシステムの構築の中核です。フレームワークはチャンキングプロセスを抽象化し、考えずに済むようにします。しかし、考える必要があります。チャンクのサイズは重要です。アプリケーションに最適なチャンクサイズを探索する必要があります。一般的に、より小さいチャンクは検索の改善につながることが多いですが、周囲の文脈の不足から生成に影響を与える可能性があります。チャンキングにアプローチする方法はさまざまありますが、盲目的にアプローチすることはうまくいきません。PineConeのこの投稿では、考慮すべきいくつかの戦略が提示されています。私はテストセットの質問を持っています。私は実験を行ってアプローチしました。小さい、VoAGI、大きいチャンクサイズでそれぞれのセットを1回ずつループし、小さいサイズが最も良いとわかりました。
4. ベースプロンプトで遊んでみてください。
LlamaIndexで使用されているベースプロンプトの一例は次のとおりです。
「以下はコンテキスト情報です。コンテキスト情報と事前知識なしで、クエリに回答してください。」
これを上書きして他のオプションを試してみることができます。また、RAGをハックして、コンテキストで良い回答が見つからない場合にLLMが独自の知識に頼ることもできます。プロンプトを調整して、受け入れるクエリのタイプを制御することもできます。たとえば、主観的な質問に対して特定の方法で応答するよう指示することができます。最低限、LLMが行っているジョブに関する文脈を持つようにプロンプトを上書きすることは役立ちます。例えば:
「あなたはカスタマーサポートエージェントです。事実に基づいた情報のみを提供することを目指して可能な限りお手伝いします。フレンドリーであることは求められますが、余計なおしゃべりは避けてください。以下はコンテキスト情報です。コンテキスト情報と事前知識なしで、クエリに回答してください。」
5. メタデータフィルタリングを試してみてください。
検索の改善に非常に効果的な戦略の1つは、チャンクにメタデータを追加し、それを使用して結果を処理することです。日付はよく使用されるメタデータタグであり、最新性に基づいてフィルタリングすることができます。ユーザーがメール履歴をクエリするアプリを構築している場合を想像してみてください。最新のメールの方が関連性が高い可能性があります。ただし、埋め込みの観点からは、最も類似しているとは限りません。各メールの日付をメタデータに追加し、検索時に最新のコンテキストを優先させることができます。LlamaIndexには、これに役立つノードの事後処理を行う組み込みクラスがあります。
6. クエリルーティングを使用してみてください。
1つのインデックスよりも複数のインデックスを持っていると便利なことがよくあります。その場合、クエリが来たときに適切なインデックスにルーティングできます。たとえば、要約の質問を処理するインデックス、具体的な質問を処理する別のインデックス、日付に関連する質問に適したインデックスなどがあるかもしれません。これらすべての動作を最適化しようとすると、全体としてのパフォーマンスが低下する可能性があります。代わりに、クエリを適切なインデックスにルーティングすることができます。別の用途としては、セクション2で説明されているように、キーワードベースのインデックスに一部のクエリを指示することもできます。
インデックスを構築したら、それぞれがどのように使用されるべきかをテキストで定義するだけです。そして、クエリのタイミングでLLMが適切なオプションを選択します。LlamaIndexとLangChainの両方には、これを簡単に設定できるツールがあります。
7. リランキングを検討してみてください。
リランキングは、類似性と関連性の不一致の問題に対する1つの解決策です。リランキングでは、通常のようにコンテキストのトップノードを取得します。それを関連性に基づいて再度ランク付けします。Cohere Rereankerは、これによく使用されるツールです。この戦略は、専門家がよく推奨するものです。どのようなユースケースであっても、RAGを使用している場合は、リランキングを試してシステムの改善が見られるかどうか確認する必要があります。LangChainとLlamaIndexの両方には、設定が容易な抽象化が備わっています。
8. クエリの変換を検討してください。
ユーザーのクエリをベースプロンプトに配置することで、既にクエリを変更しています。さらに変更することも意味があるかもしれません。以下にいくつかの例を示します:
文の言い換え:システムがクエリに関連するコンテキストを見つけられない場合、LLMにクエリを言い換えて再試行させることができます。人間にとって同じように見える2つの質問が、埋め込み空間では必ずしも似ているとは限りません。
HyDE:HyDEは、クエリを受け取り、仮想的な応答を生成し、両方を埋め込み検索に使用する戦略です。研究者たちは、これによってパフォーマンスが劇的に向上することを発見しました。
サブクエリ:LLMは、複雑なクエリを分解するときにうまく機能する傾向があります。RAGシステムにこれを組み込むことで、クエリは複数の質問に分解されます。
LLamaIndexには、この種のクエリ変換に関するドキュメントがあります。
9. 埋め込みモデルを微調整する。
埋め込みベースの類似性は、RAGの標準的な検索メカニズムです。データは分割され、インデックス内に埋め込まれます。クエリが入力されると、インデックス内の埋め込みと比較するためにクエリも埋め込まれます。しかし、埋め込みを行っているのは何でしょうか?通常、OpenAIのテキスト埋め込みada-002のような事前学習されたモデルです。
問題は、事前学習モデルの埋め込み空間での類似性の概念が、コンテキストでの類似性とはあまり一致しない場合があることです。法的文書を扱っていると想像してください。埋め込みが類似性を判断する際には、「知的財産」や「契約違反」といったドメイン固有の用語に基づく判断をより優先させたいと思うでしょう。「ここに」と「合意」といった一般的な用語よりもです。
この問題を解決するために、埋め込みモデルを微調整することができます。これにより、検索メトリクスを5〜10%向上させることができます。これには少し手間がかかりますが、検索パフォーマンスには大きな違いをもたらすことができます。このプロセスは思っているよりも簡単です。LlamaIndexはトレーニングセットを生成するのに役立つことができます。詳細については、Jerry LiuによるLlamaIndexの埋め込み微調整のアプローチについてのこの投稿、または微調整のプロセスを説明するこの投稿を参照してください。
10. LLMデバッグツールを使用し始める。
おそらくすでにLlamaIndexまたはLangChainを使用してシステムを構築しているでしょう。両フレームワークには、コールバックを定義して使用されるコンテキストや検索結果のドキュメントなどを表示する便利なデバッグツールがあります。
これらのフレームワークに組み込まれているツールが不十分だと感じる場合、RAGシステムの内部動作を探るための成長しているツールエコシステムがあります。Arize AIには、どのコンテキストが取得され、なぜ取得されるのかを調べるためのノートブック内ツールがあります。Rivetは、複雑なエージェントを構築するための視覚インターフェースを提供するツールです。これは法的技術企業Ironcladによってオープンソース化されたばかりです。新しいツールが絶えずリリースされており、ワークフローで役立つものを見つけるために実験する価値があります。
結論
RAGを使って構築することは、動作させるのは簡単ですが、うまく動作させるのは難しいため、イライラすることがあります。上記の戦略がギャップを埋めるためのいくつかのインスピレーションを提供できればと思います。これらのアイデアは常にうまくいくわけではなく、プロセスは実験、試行錯誤の一部です。この投稿では、システムのパフォーマンスを測定する方法である評価には踏み込んでいません。評価は現在、科学よりも芸術的な側面がありますが、変更が効果をもたらしているかどうかを一貫して確認できるシステムを設定することが重要です。以前、RAGシステムの評価方法について書きました。詳細については、LlamaIndex Evals、LangChain Evals、およびRAGASという非常に有望な新しいフレームワークを探索することができます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- RayはNVIDIA AIとの協業により、開発者が製品向けのLLMを構築、調整、トレーニング、スケールアップするのを支援します
- アンサンブル学習技術:Pythonでのランダムフォレストを使った手順解説
- 大規模言語モデルは安全性を自己評価できるのか?RAINに会ってください:ファインチューニングなしでAIのアライメントと防御を変革する革新的な推論方法
- 5つのステップでScikit-learnを始める
- 「人物再識別入門」
- 「今日、何を見たと思う?このAIモデルは、あなたの脳の信号を解読して、あなたが見たものを再構築するんだよ」
- 『DiffBIRを紹介:事前学習済みのテキストから画像への拡散モデルを使用して、盲目的な画像修復問題に対処するAIアプローチ』