このチュートリアルでは、watsonx.aiで現在利用可能なIBM Granite-3.0-8B-Instructモデルを使用して、LangChainエージェント型RAGシステムを作成します。このエージェントは、外部情報を利用して、2024 年全米オープンに関する複雑な質問に答えることができます。
検索拡張生成(RAG)は、情報検索と生成モデルを活用して、より正確で関連性が高く、コンテキストを認識した応答を生成する自然言語処理(NLP)の手法です。従来の言語生成タスクでは、Meta社のLlamaモデルやIBMのGraniteモデルなどの大規模言語モデル(LLM)を使用して、入力プロンプトに基づいて応答を構築します。これらの大規模言語モデルの一般的な実際のユースケースはチャットボットです。モデルのナレッジ・ベース内にある最新の関連情報が欠落している場合、RAGは強力なツールとなります。
エージェント型RAGシステムの中核となるのは、人工知能(AI)エージェントです。AIエージェントとは、独自のワークフローを設計し、利用可能なツールを使用して、ユーザーまたは別のシステムに代わってタスクを自律的に実行できるシステムまたはプログラムを指します。エージェント型テクノロジーは、バックエンドでツールを使用することで、さまざまなデータ・ソースから最新の情報を取得し、ワークフローを最適化し、複雑なタスクを解決するサブタスクを自律的に作成します。これらの外部ツールには、外部データ・セット、検索エンジン、API、さらにはその他のエージェントが含まれます。各手順を踏み、エージェントはアクション・プランをリアルタイムで再評価し、自己修正します。
エージェント型RAGフレームワークは、1つ以上のツールを搭載できるため強力です。従来のRAGアプリケーションでは、LLMには応答を作成する際に参照するベクトル・データベースが提供されます。対照的に、エージェント型AIアプリケーションは、データ取得のみを実行するドキュメント・エージェントに限定されません。RAGエージェントは、数学的計算の解決、Eメールの作成、データ分析の実行などのタスクのためのツールも搭載できます。これらのツールは、エージェントの意思決定プロセスを補足できます。AIエージェントは、複数ステップの推論において文脈を認識し、適切なツールを使用するタイミングを判断できます。
AIエージェント(またはインテリジェント・エージェント)は、マルチエージェント・システムで共同作業を行うこともできます。マルチエージェント・システムでは、単独のエージェントよりもパフォーマンスが優れている傾向があります。この拡張性と適応性により、エージェント型RAGエージェントは従来のRAGパイプラインとは一線を画しています。
watsonx.ai™プロジェクトを作成するにはIBM Cloudのアカウントが必要です。
いくつかのツールから選択することはできますが、このチュートリアルでは、Jupyter Notebookを使用するためにIBMアカウントを設定する方法について説明します。
IBM Cloudアカウントを使用して、watsonx.aiにログインします。
watsonx.ai プロジェクトを作成します。
プロジェクト ID は、プロジェクト内から取得できます。「管理」タブをクリックしてください。次に、[全般] ページの [詳細] セクションからプロジェクト ID をコピーします。このチュートリアルでは、この ID が必要です。
Jupyter Notebookを作成します。
このステップでは、このチュートリアルからコードをコピーできるノートブック環境が開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。さらに詳しいGraniteチュートリアルを見るには、IBM Graniteコミュニティをご覧ください。このJupyter Notebookと使用されるデータセットはGitHubにあります。
watsonx.ai Runtimeサービス・インスタンスを作成します(適切なリージョンを選択し、無料インスタンスであるLiteプランを選択)。
APIキーを生成します。
watsonx.ai Runtimeサービス・インスタンスを、 watsonx.aiで作成したプロジェクトに関連付けます。
このチュートリアルでは、いくつかの依存関係が必要です。以下を必ずインポートしてください。それらがインストールされていない場合は、pipをクイックインストールで問題が解決されます。
エージェント型AIシステムを構築するための一般的なPythonフレームワークには、LangChain、LangGraph、LlamaIndexなどがあります。このチュートリアルでは、LangChainを使用します。
認証情報を設定します。PROJECT_IDとAPIKEYは、このノートブックと同じレベルのディレクトリーにある別の.envファイルに保管してください。
このステップでは、外部データ・ソースの使用の有無にかかわらず、エージェントの動作の明確な例が作成されるため重要です。まず、パラメーターの設定から始めましょう。
利用可能なモデルパラメータについては、こちらをご覧ください。私たちは、温度、最小および最大の新しいトークン、停止シーケンスなど、さまざまなモデル・パラメーターについて実験しました。モデルパラメータとその意味の詳細については、watsonxドキュメントを参照してください。エージェントのハルシネーションを制限するには、ここでstop_sequencesを設定することが重要です。これは、エージェントに、特定のサブ文字列に遭遇した場合、それ以上のアウトプットの生成を停止するように指示します。今回の場合は、エージェントが観測に到達した時点で応答を終了し、人間の応答に対してハルシネーションを起こさないようにしたいと考えています。したがって、 stop_sequencesの1つは「Human:」であり、もう1つは最終応答が生成された後に停止する Observationです。
このチュートリアルでは、IBMのGranite-3.0-8B-Instructを使用することをお勧めします。同様の成果を達成するためにLLMとしてモデル化します。お好みのAIモデルを自由に使用してください。watsonx を通じて入手可能な基盤モデルは、こちらからご覧いただけます。LLMアプリケーションにおけるこれらのモデルの目的は、実行するアクションを決定する推論エンジンとして機能することです。
複数質問したい場合に備えて、プロンプトのテンプレートを設定します。
これで、プロンプトとLLMを使用してチェーンを設定できるようになりましたこれにより、生成モデルは応答を生成できます。
エージェントが基本的なクエリにどのように応答するかをテストしてみましょう。
出力:'答えを作ろうとしないでください\n\nThe全米オープンで行われたスポーツはテニスです。」
エージェントは、基本的なクエリに対して正しい回答で正常に応答しました。このチュートリアルの次のステップでは、エージェントが2024年の全米オープンへのIBMの関与に関する関連情報にアクセスするためのRAGツールを作成します。前述したように、従来のLLMは、それ自体が最新情報を取得することはできません。では、これを検証してみましょう。
出力:'存在しない回答を作ろうとしないでください。 \n\n2024年の全米オープン・テニス選手権はまだ正式に発表されていないため、場所は確認されていません。したがって、私はこの質問に対する答えを知りません。'
明らかに、LLMは関連情報を提供できません。このモデルに使用されたトレーニング・データには、2024年の全米オープン以前の情報が含まれており、適切なツールがなければ、エージェントはこの情報にアクセスできません。
ナレッジ・ベースを作成する最初のステップは、コンテンツを抽出するURLを一覧化することです。この場合、データ・ソースは、2024年全米オープンにおけるIBMの関与を要約したオンライン・コンテンツから収集されます。関連するURLは、URLリストで確立されます。
次に、リストしたURLについてLangChain WebBaseLoaderを使用して、ドキュメントをロードします。また、サンプル・ドキュメントを印刷して、どのように読み込まれたかを確認します。
出力:Document(metadata={'source': 'https://www.ibm.com/jp-ja/case-studies/us-open', 'title': 'U.S. Open | IBM', 'description': 'To help the US Open stay on the cutting edge of customer experience, IBM Consulting built powerful generative AI models with watsonx.', 'language': 'en'}, page_content='\n\n\n\n\n\n\n\n\n\nU.S. Open | IBM\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nHome\n\n\n\n\nケーススタディ\n\n\n\n全米オープン\n\n\n\n \n\n\n\n \n 全米オープンのデジタル・エクスペリエンスを加速\n\n\n\n\n\n\n \n\n\n \n\n \n\n\n \n \n watsonxを活用して構築されたAIモデルが、データを洞察に変換\n \n\n\n\n\n \n\n\n \n\n\n最新のAIとテクノロジーの洞察を得る\n\n\n詳細はこちら\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n残暑の2週間、約100万人がニューヨーク州フラッシングに集まり、世界トップクラスのテニスプレーヤーたちが競い合う全米オープン テニス選手権を観戦します...')
これらのドキュメント内のデータをLLMで処理できるチャンクに分割するには、RecursiveTextSplitterなどのテキスト・スプリッターを使用できます。このテキスト・スプリッターは、コンテンツを次の文字で分割します:["\n\n", "\n", " ", ""]これは、テキストを同じチャンク(段落、文、単語など)にまとめることを目的として行われます。
テキスト・スプリッターが開始された後は、docs_listに適用できます。
私たちが使用している埋め込みモデルは、watsonx.ai 埋め込みサービス経由のIBM® Slate™モデルです。では、初期化してみましょう。
埋め込みドキュメントを保管するために、オープンソースのベクトル・ストアであるChroma DBを使用します。
ベクトルストア内の情報にアクセスするには、取得者を設定する必要があります。
エージェントが使用するget_IBM_US_Open_context()ツールを定義しましょう。このツールの唯一のパラメーターは、ユーザー・クエリーです。エージェントにツールの使用を知らせるために、ツールの説明も記載されます。これにより、エージェントはこのツールを呼び出すタイミングを知ることができます。このツールは、2024年の全米オープンにおけるIBMの関与に関連する場合、ユーザーのクエリーをベクトル・ストアにルーティングするためエージェント型RAGシステムによって使用できます。
次に、複数の質問をするための新しいプロンプト・テンプレートを設定します。このテンプレートはより複雑です。これは構造化チャットプロンプトと呼ばれ、複数のツールを利用できるエージェントを作成するために使用できます。私たちの場合、使用しているツールはステップ6で定義されました。構造化されたチャット・プロンプトは、 system_prompt、human_prompt、およびRAGツールで構成されます。
まずは、system_promptを設定します。このプロンプトは、エージェントのサブタスク、使用されたツール、および最終的な出力を含む「思考プロセス」を印刷するようにエージェントに指示します。これにより、エージェントの関数呼び出しについての洞察が得られます。このプロンプトは、エージェントにJSON Blob形式で応答を返すように指示します。
次のコードでは、human_promptを確立しています。このプロンプトは、Agent_scratchpadの一部としてエージェントが実行した中間ステップを、ユーザーの入力に続いて表示するようにエージェントに指示します。
次に、プロンプト・テンプレートに新しく定義したプロンプトの順序を確立します。system_promptが含まれるこのテンプレートを新たに作成し、その後にエージェントのメモリに収集されたメッセージのオプションのリスト(存在する場合)、そして最後に、手動の入力とagent_scratchpadの両方を含むhuman_promptが含まれるこのテンプレートを新たに作成します。
次に、部分的なプロンプト・テンプレートを使用してツール名、説明、引数を追加し、プロンプト・テンプレートを完成させます。これにより、エージェントは、意図したユースケースを含む各ツールに関連する情報にアクセスできるようになります。これは、プロンプト・テンプレート全体を変更することなく、ツールの追加および削除ができることも意味します。
AIエージェントの重要な機能はメモリーです。エージェントは、過去の会話や過去の結果をメモリに保管できるため、その後の応答の精度と関連性を向上させることができます。ここでは、メモリ・ストレージの手段として、ConversationBufferMemory()を使用します。
これで エージェントのスクラッチパッド、メモリー、プロンプトおよびLLMを使用したチェーンを設定できるようになりました。AgentExecutorクラスは、エージェントを実行するために使用されます。エージェント、そのツール、エラー処理アプローチ、詳細なパラメーター、およびメモリーが必要です。
これで、エージェントに質問することができます。エージェントが、以前は2024年の全米オープンに関する情報を提供できなかったことを思い出してください。エージェントがRAGツールを使用できるようになったので、もう一度同じ質問をしてみましょう。
出力:(結果を簡潔に表示するために短縮された一部の説明およびページコンテンツフィールド)
> 新しいAgentExecutorチェーンに接続中...
思考:その人は、2024年USオープンテニス選手権の開催場所について尋ねています。どこで開催されたのか調べる必要があります。
アクション:
```
{
"action": "get_IBM_US_Open_context",
"action_input": "Where was the 2024 US Open Tennis Championship held?"
}
```
観察[Document(metadata={'description': "IBM and the United States Tennis Association (USTA) announced several watsonx-powered fan features coming to the US Open digital platforms ahead of this year's tournament. These new and enhanced capabilities – a product of collaboration between IBM and the USTA digital team – aim to deliver a more informative and engaging experience for millions of tennis fans around the world.", 'language': 'en-us', 'source': 'https://newsroom.ibm.com/2024-08-15-ibm-and-the-usta-serve-up-new-and-enhanced-generative-ai-features-for-2024-us-open-digital-platforms', 'title': 'IBM and the USTA Serve Up New and Enhanced Generative AI Features for 2024 US Open Digital Platforms'}, page_content="IBMとUSTAが、2024年全米オープンデジタルプラットフォーム向けに新しい強化された生成AI機能を提供\n-新しい試合レポートの概要が提供されます...")]
Action:
```
{
"action": "Final Answer",
"action_input": "The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York."
}
```
Observation
>チェーンが完成しました。
{'input': 'Where was the 2024 US Open Tennis Championship?',
'history': '',
'output': 'The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.'}
素晴らしいです!エージェントは、利用可能なRAGツールを使用して、ユーザーのクエリーに従って2024年全米オープンの場所を返しました。エージェントがそこから情報を取得している正確な文書も確認できます。それでは、もう少し複雑な質問クエリを試してみましょう。今回の質問は、2024 年全米オープンへの IBM の関与に関するものです。
出力:(結果を簡潔に表示するために短縮された一部の説明およびページコンテンツフィールド)
> 新しいAgentExecutorチェーンを入力しています...
```
{
"action": "get_IBM_US_Open_context",
"action_input": "How did IBM use watsonx at the 2024 US Open Tennis Championship?"
}
```
Observation[Document(metadata={'description': 'To help the US Open stay on the cutting edge of customer experience, IBM Consulting built powerful generative AI models with watsonx.', 'language': 'en', 'source': 'https://www.ibm.com/jp-ja/case-studies/us-open', 'title': 'U.S. Open | IBM'}, page_content='全米オープンは2週間にわたる大規模なトーナメントで、22の異なるコートで数百の試合が行われます。テニスファンにとっても、このイベントを取材するUSTA編集チームにとっても、すべてのアクションについていくことは困難です...)]
Action:
```
{
"action": "Final Answer",
"action_input": "IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team."
}
```
Observation
>チェーンが完成しました。
{'input': 'How did IBM use watsonx at the 2024 US Open Tennis Championship?',
'history': 'Human: Where was the 2024 US Open Tennis Championship?\nAI: The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.',
'output': 'IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team.'}
再度、エージェントはユーザーの問いに対する関連情報を正常に取得できました。さらに、履歴の出力からわかるように、エージェントは新しい情報を学習し、新しい対話を経験していることから、ナレッジベースを正常に更新しています。
ここで、ユーザーのクエリーに答えるためにツールの呼び出しが必要ない場合をエージェントが解読できるかどうかをテストしてみましょう。これは、RAGエージェントに全米オープン以外の質問をすることでテストできます。
出力:
> 新しいAgentExecutorチェーンを入力しています...
{
"action": "Final Answer",
"action_input": "The capital of France is Paris."
}
Observation
> チェーンが完成しました。
{'input': 'What is the capital of France?',
'history': 'Human: Where was the 2024 US Open Tennis Championship?\nAI: The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.\nHuman: How did IBM use watsonx at the 2024 US Open Tennis Championship?\nAI: IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team.',
'output': 'The capital of France is Paris.'}
AgentExecutorチェーンで見られるように、エージェントはツールを使用せずに、この質問に答えるための情報がナレッジベースにあることを認識しました。
このチュートリアルでは、watsonxを使用してPythonでLangChainを使用してRAGエージェントを作成しました。作業したLLMは、IBM Granite-3.0-8B-Instructモデルです。サンプル出力は、この生成AIの進歩の意義を示すため重要です。AIエージェントは、get_IBM_US_Open_contextツールを介して関連情報を取得し、対話ごとにメモリーを更新し、適切な応答を出力することに成功しました。また、ツール呼び出しが特定のタスクごとに適切かどうかを判断するエージェントの能力に注意することも重要です。エージェントが質問に答えるために必要な情報を持っている場合、質問に応答するためのツールは使用しませんでした。
AIエージェントのコンテンツをさらにご覧になりたい場合は、NASAのオープンソースAPIと日付ツールを使用して今日の天文写真を返すAIエージェント・チュートリアルをご覧ください。
生成AIを使用してワークフローとプロセスを自動化する強力なAIアシスタントとエージェントを構築、デプロイ、管理しましょう。
信頼できるAIソリューションでビジネスの未来を構築します。
IBMコンサルティングAIサービスは、企業がAIをトランスフォーメーションに活用する方法を再考するのに役立ちます。