「ユーザーとの対話により、RAG使用例でのLLM応答を改善する」
「ユーザーとの対話を通じて、RAGを用いたLLMの応答を向上させる方法」
生成型AIと大規模言語モデル(LLM)の最も一般的な応用の1つは、特定の外部知識コーパスに基づいて質問に答えることです。Retrieval-Augmented Generation(RAG)は、外部知識ベースを使用する質問応答システムを構築するための人気のある技術です。詳細については、Amazon SageMaker、Amazon OpenSearch Service、Streamlit、およびLangChainを使用してパワフルな質問応答ボットを構築するを参照してください。
従来のRAGシステムは、十分な文脈を提供せずに曖昧な質問をするユーザーからの満足のいく回答を提供するのに苦労することがよくあります。これにより、「わかりません」といった役に立たない回答や、LLMによって提供される不正確な虚偽の回答が生じます。この記事では、LangChainを使用した対話的な明確化コンポーネントを導入することで、従来のRAGシステムよりもそのような使用ケースでの回答の品質を改善する解決策を示します。
主なアイデアは、初期の質問が不明確な場合にRAGシステムがユーザーと対話的な対話を行うことを可能にすることです。明確化の質問をすることで、ユーザーに詳細情報を求め、新しい文脈情報を取り入れることで、RAGシステムは曖昧な初期ユーザークエリからでも正確で役に立つ回答を提供するために必要な文脈を収集することができます。
解決策の概要
解決策をデモンストレーションするために、Amazon Kendraインデックス(Amazon KendraのAWSオンラインドキュメント、Amazon Lex、およびAmazon SageMakerのデータ)と、Amazon BedrockのLLMを使用したLangChainエージェント、およびわかりやすいStreamlitのユーザーインターフェースをセットアップしました。
- ジェンAIの活用:攻撃型AIに対するサイバー強靭性の構築
- クロード2 APIの使い方をはじめる
- 「OpenAI API Dev Dayアップグレードは驚くべきものです:DALL-E 3、GPT-4 Vision、およびGPT-4 Turboのアクションをご覧ください」
前提条件
AWSアカウントでこのデモを実行するために、次の前提条件を完了してください:
- GitHubリポジトリをクローンし、READMEに説明されている手順に従ってください。
- AWSアカウントでAmazon Kendraインデックスを展開します。次のAWS CloudFormation テンプレートを使用して新しいインデックスを作成するか、既に実行中のインデックスを使用できます。新しいインデックスを展開すると、追加の料金が請求書に追加される場合があるため、不要になった場合は削除することをお勧めします。インデックス内のデータは、選択したAmazon Bedrockファウンデーションモデル(FM)に送信されます。
- LangChainエージェントはAmazon Bedrockで利用可能なFMに依存していますが、LangChainがサポートする他のLLMに適応することもできます。
- コードと共有されたサンプルフロントエンドで実験するには、Amazon SageMaker Studioを使用してStreamlitアプリケーションのローカル展開を実行できます。このデモを実行すると、追加のコストが発生します。
解決策を実装する
従来のRAGエージェントは、次のように設計されることがよくあります。エージェントは、ユーザークエリに関連するドキュメントを取得するために使用されるツールにアクセスできます。取得したドキュメントは、LLMプロンプトに挿入されるため、エージェントは取得したドキュメントスニペットに基づいて回答を提供することができます。
この記事では、KendraRetrievalTool
にアクセスできるエージェントを実装し、Amazon Kendraインデックスから関連するドキュメントを取得し、取得されたコンテキストを元に回答を提供します:
# Kendra取得ツールkendra_tool = Tool( name="KendraRetrievalTool", func=retrieval_qa_chain, description="人の質問に答えるためのツールです。このツールへの入力は質問です。",)# 伝統的なRAGエージェントtraditional_agent = initialize_agent( agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, tools=[kendra_tool] llm=llm, early_stopping_method="generate", memory=conversational_memory,)# ユーザの質問answer = traditional_agent.run("私のEC2インスタンスは何個のGPUを持っていますか?")
完全な実装コードについては、GitHubレポジトリを参照してください。伝統的なRAGのユースケースについては、Amazon SageMaker JumpStartでのファウンデーションモデルを用いた情報検索拡張生成を使用した質問応答に参照してください。
以下の例を考えてみましょう。ユーザが「私のEC2インスタンスは何個のGPUを持っていますか?」と質問しています。次のスクリーンショットで示されるように、エージェントはKendraRetrievalTool
を利用して答えを探しています。しかし、エージェントはユーザの参照しているAmazon Elastic Compute Cloud(Amazon EC2)インスタンスタイプが分からないため、ユーザには有益な回答を提供できず、顧客体験が悪くなってしまいます。
この問題を解決するために、AskHumanTool
という追加のカスタムツールを定義し、エージェントに提供します。このツールはLLMに指示して、ユーザの質問がKendraRetrievalTool
で良い回答が得られない場合には、ユーザに追加の質問を求めるようにします。これにより、エージェントは次の二つのツールを利用できるようになります:
# 人に質問するためのツールhuman_ask_tool = CustomAskHumanTool()# 二つのツールを持つRAGエージェントimproved_agent = initialize_agent( agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, tools=[kendra_tool, human_ask_tool], llm=llm, early_stopping_method="generate", memory=conversational_memory,)# ユーザの質問answer = improved_agent.run("私のEC2インスタンスは何個のGPUを持っていますか?")
これにより、エージェントは質問を改善するか、プロンプトに必要な追加コンテキストを提供することができます。エージェントがAskHumanTool
をこの目的のために使用するようにガイドするため、LLMに以下のツールの説明を提供します:
KendraRetrievalToolを使用して回答が見つからない場合は、このツールを使用して人に質問する。入力は人への質問である。
次のスクリーンショットで示されるように、AskHumanTool
を使用することで、エージェントは曖昧なユーザの質問を特定し、ユーザに追加の質問をして、使用しているEC2インスタンスタイプを明確にするように求めています。
ユーザがインスタンスタイプを指定した後、エージェントは元の質問に追加された回答をコンテキストに組み込んで、正しい回答を導き出します。
エージェントは今や、関連するドキュメントを取得するためにKendraRetrievalTool
を使用するか、AskHumanTool
を使って質問を明確にするかを決定できます。エージェントの決定は、プロンプトに挿入されたドキュメントのスニペットが最終的な回答を提供するのに十分かどうかに基づいています。この柔軟性によって、RAGシステムは、ユーザが提出するさまざまなクエリに対応することができます。それには、明確に定義された質問と曖昧な質問の両方が含まれます。
私たちの例では、フルエージェントワークフローは以下の通りです:
- ユーザーはRAGアプリにリクエストを行い、「EC2インスタンスは何個のGPUを持っていますか?」と尋ねます。
- エージェントはLLMを使用して、どのアクションを取るかを決定します:ユーザーのリクエストに答えるために関連情報を見つけるために、
KendraRetrievalTool
を呼び出します。 - エージェントはツールを使用してAmazon Kendraインデックスから情報を取得します。取得したドキュメントのスニペットはエージェントの指示に挿入されます。
- エージェントのLLMは、Amazon Kendraから取得したドキュメントが役に立たないか、ユーザーのリクエストに答えるための十分なコンテキストを含んでいないと推論します。
- エージェントは
AskHumanTool
を使用して追加の質問を作成します。「使用している特定のEC2インスタンスタイプは何ですか?インスタンスタイプを知ることは、それが何個のGPUを持っているかに答えるのに役立ちます。」ユーザーは「ml.g5.12xlarge」と答え、エージェントは今度はEC2インスタンスタイプを検索クエリに追加してKendraRetrievalTool
を再度呼び出します。 - ステップ2〜4をもう一度実行した後、エージェントは有用な回答を導き出し、ユーザーに送り返します。
次の図は、このワークフローを示しています。
この投稿で説明した例は、カスタムAskHumanTool
の追加により、必要な情報が足りない場合にエージェントが明確な詳細を要求できるようにすることで、顧客の信頼性と正確性を向上させ、さまざまなドメインのRAGアプリケーションでより良い顧客体験を実現できることを示しています。
クリーンアップ
不必要なコストを発生させないために、使用していない場合はAmazon Kendraインデックスを削除し、デモを実行するためにSageMaker Studioインスタンスをシャットダウンしてください。
結論
この投稿では、ユーザーのカスタマーエクスペリエンスを向上させるために、RAGシステムにカスタムツールを追加して、システムが情報の欠落部分をユーザーに質問することができる方法を示しました。この対話型の会話アプローチは、従来のRAGアーキテクチャを改善するための有望な方向を示しています。対話によって曖昧さを解消する能力は、知識ベースからより満足のいく回答を提供することにつながることに注意してください。
このアプローチはRAGのユースケースに限定されているわけではありません。カスタムAskHumanTool
が追加できるエージェントを中心とする他の生成AIユースケースにも適用できます。
Amazon Kendraを生成AIと使用する詳細については、Quickly build high-accuracy Generative AI applications on enterprise data using Amazon Kendra, LangChain, and large language modelsを参照してください。
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
- このAI論文は、’リラックス:エンドツーエンドの動的機械学習ワークロードの最適化のためのコンパイラの抽象化’を紹介しています
- 画像処理におけるノイズとは何ですか? – 簡易解説
- Google AIは、『AltUp(Alternating Updates)』というアートフィシャルインテリジェンスの手法を導入しましたこれは、トランスフォーマーネットワークのスケールの拡大を利用するための手法であり、計算コストを増やさずに行われます
- このAI論文は、柔軟なタスクシステムと手順的生成による強化学習を革新するNeural MMO 2.0を紹介しています
- 機械学習におけるXGBoostの詳細な理解
- 「GiskardはHuggingFaceにGiskard Botをリリースします:HuggingFace Hubにプッシュした機械学習モデルの問題を自動的に検出するボットです」
- このAI論文は、大規模言語モデルに対する敵対的攻撃に対する規則遵守の評価のための新しい機械学習フレームワークであるRuLESを紹介しています