お客様のDXの推進やクラウド活用をサポートする
NRIグループのプロフェッショナルによるブログ記事を掲載

OCI Generative AI AgentsとOCI FunctionsでRAGのデータ自動取り込みを構成してみた

高橋佑輔 - Oracle Cloud Infrastructure 2023 Certified Architect Professional

はじめに

NRIで、Oracle Cloud Infrastructure(以下OCI)サービスの運営を担当している高橋です。

2024年9月にOCI Generative AI Agents (以下GAI Agent)がリリースされました。GAI Agentを使うことで、外部情報の検索を組み合わせて生成AIの回答精度を向上させるRetrieval-Augmented Generation(RAG*1)を簡単に構成することが出来ます。

本記事ではGAI Agentが利用するObject Storage上にドキュメントがアップロードされたことを検知して自動的にデータをGAI Agentに取り込む処理を、OCI Functionsを利用して構築する方法をご紹介します。

 

自動取り込みジョブの概要

Object Storageを使った構成は最も手軽にGAI Agentの設定を行うことが出来る上、DBインスタンス / OpenSearchノードの費用がかからないため、他の2つと比較してリソースに対するクラウド利用料を抑えて運用することが出来ます。その一方で、格納したドキュメントをベクトルデータ化し、GAI Agentが利用可能な状態にするために取込みジョブの実行が必要です。

データ・ストア・タイプ データロード
Object Storage GAI Agentの機能で処理 (取込みジョブの実行)
OCI OpenSearch OpenSearchの機能で処理
Oracle AI Vector Search DBの機能で処理

取り込みジョブはコンソール画面から実行が可能な他SDK(Software Development Kit)を通じてCLI(Command Line Interface)から実行することが出来ますが、Object Storageにドキュメントが追加・更新されるたびに手動で取込みジョブを実行するのは大変なので、今回はOCIサービスの一つである「OCI Functions」で取込みジョブを起動するアプリケーションを作成し、ドキュメントがアップロードされたことを検知して自動的に実行する環境を構築します。

 

OCI Functionsを使ったOCI Generative AI Agentsデータ・ソース取り込みジョブの自動化

1.OCI Generative AI Agentsの構成

まず、事前準備としてObject Storageをデータ・ソースとするGAI Agentを構成します。

 

1.① Object Storageバケットの作成

GAI AgentがRAGで利用するドキュメントの格納場所であるObject Storageバケットを作成します。

今回、取り込みジョブを自動的に実行するためにオブジェクト・イベントをトリガーとしてOCI Functionsを実行しますので、「オブジェクト・イベントの出力」にチェックを入れて作成しましょう。

Object Storageバケット作成の詳細手順は以下のOCIドキュメントを参照ください。
オブジェクト・ストレージ・バケットの作成

バケットを作成したら、GAI Agentのテストに使用するための適当なドキュメントファイルを作成したバケットにアップロードしておきましょう。このファイルはこの後のエージェントのテストで利用します。

 

1.② OCI Generative AI Agentsの構成

続いて、今回利用するナレッジ・ベースとエージェントを以下の流れで準備します。

 

1.②-1 ナレッジ・ベースの作成

アナリティクスとAI > 生成AIエージェント > ナレッジ・ベース > ナレッジ・ベースの作成

ナレッジ・ベースはデータ・ストア・タイプデータ・ソースを指定して作成します。今回は下記のように指定します。

名前 任意
説明 任意
データ・ストア・タイプ オブジェクト・ストレージ
データ・ソース 1.①で作成したObject Storageバケット

Object Storageをデータ・ソースとして使用する場合、ドキュメントを追加するたびに取込みジョブを実行してベクトルデータを作成する必要がありますが、ナレッジ・ベースを作成する際に「上のデータ・ソースの取込みジョブを自動的に開始」にチェックを入れておくことで作成時に自動的に取込みジョブを実行してくれます。

Object Storageバケットに格納するファイルの要件に関しては、以下のOCIドキュメントを参照ください。
生成AIエージェントのオブジェクト・ストレージのガイドライン

 

1.②-2 エージェントの作成

アナリティクスとAI > 生成AIエージェント > エージェント > エージェントの作成

生成AIエージェントを作成します。1.②-1で作成したナレッジ・ベースを指定して作成しましょう。

名前 任意
説明 任意
ようこそメッセージオプション 任意(入力内容はエージェントの冒頭の挨拶に使用されます)
ナレッジ・ベース 1.②-1で作成したナレッジ・ベース

作成したエージェントとやり取りするためには、エンドポイントを作成する必要がありますが、「このエージェントのエンドポイントの自動作成」にチェックを入れておくことで、自動的に作成されます。

 

1.②-3 エージェントのテスト

アナリティクスとAI > 生成AIエージェント > エージェント > チャット

今回テストでデータ・ソースに取り込みを行ったドキュメントには、生成AIが学習していない情報の例として、インターネットで検索した翌日の天気予報の情報を入れておきました。

試しにOCI Generative AIサービスでCohere Command R+に問い合わせを行ってみた結果が下記です。

質問:今日は2024年11月2日です。明日の天気を教えて?

回答:申し訳ありませんが、AI言語モデルである私はリアルタイムの天気情報を入手することができません。2024年11月3日の天気を知るには、信頼できる天気予報ウェブサイトをチェックするか、デバイスの天気予報アプリケーションを使用することをお勧めします。

このように、通常、生成AIはある時点の断面までの情報をもとに学習を行っているため、それ以降の情報を活用して回答を生成することは出来ません。

では、GAI AgentでRAGを構成することで結果がどう変わるか見てみたいと思います。同じ質問を1.②-2で作成したエージェントに投げかけてみましょう。

作成したエージェントのテストは、コンソール画面のチャットUIを利用するのが簡単です。先ほどと同一の質問メッセージを入力すると、エージェントからの結果が表示されます。

今回は「最高気温は23℃、午前中は雨が降り、その後は曇り空となる。」とテキストファイルの内容に基づいて回答をしてくれました。右側のログ欄を見ると、ちゃんと参照したドキュメントとして先ほど作成したデータ・ソースが示されており、外部情報を参照して回答できていることがわかります。

各手順の詳細については以下のOCIドキュメントを参照ください。
生成AIエージェントの開始

 

2.OCI Functionsからの取込みジョブの実行

2.① OCI Functionsアプリケーションの作成

OCI Functions(以下Functions)はOCIで利用可能なフルマネージドのFunctions-as-a-Serviceプラットフォームです。今回はFunctions上でObject StorageからGAI Agentへのデータ取込みジョブを自動実行するアプリケーションを作成します。

 

2.①-1 Functionsのセットアップ

Functionsのセットアップ方法については、以下のOCIドキュメントを参照ください。
ファンクションQuickStartガイド

ドキュメントの手順に従ってグループ/ユーザー作成・VCNとサブネットの作成などを終え、サンプルアプリケーションの稼働確認が完了すればOKです。

 

2.①-2 データ取込みジョブを実行するFunctionsの作成

今回はPython SDKを利用してFunctions上でデータ取込みジョブを実行するアプリケーションを作成します。

OCIで提供されているSDKに関しては、以下のOCIドキュメントを参照ください。
ソフトウェア開発キットおよびコマンドライン・インタフェース

Python SDKからGAI Agentサービスを利用するためのクラスはGenerativeAiAgentClientです。データ取込みジョブの作成はcreate_data_ingestion_jobを実行します。

GenerativeAiAgentClient
classoci.generative_ai_agent.GenerativeAiAgentClient(config, **kwargs)

create_data_ingestion_job(create_data_ingestion_job_details, **kwargs)

リファレンス・ドキュメントは以下のOracle社のドキュメントを参照ください。
Oracle Cloud Infrastructure Python SDK - 2.138.0 — oci 2.138.0 documentation

以下、Pythonアプリ作成時のポイントとなる箇所を抜粋して記載いたします。

 

・signerの設定

GenerativeAiAgentClientの引数であるsignerに関して、Functionsで実行する場合にはresource_principalsから取得します。

signer = oci.auth.signers.get_resource_principals_signer()

 

・エンドポイントの明示的な指定

記事執筆時点でGAI AgentサービスはChicagoリージョンのみでの提供です。エンドポイントはOptional項目ですが、利用するエージェントがあるリージョンを明示的に指定しておきましょう。以下はChicagoリージョンの例です。

generative_ai_agent_client = oci.generative_ai_agent.GenerativeAiAgentClient(config={},signer=signer,service_endpoint="https://agent.generativeai.us-chicago-1.oci.oraclecloud.com")

 

・データ取込みジョブ実行例

create_data_ingestion_jobの実行例は下記のとおりです。
CreateDataIngestionJobDetailsには1で作成したエージェントの情報を指定します。

data_source_id 1.②-1で作成したナレッジ・ベースのデータ・ソースからOCIDを指定
compartment_id 1.②-2で作成したエージェントの所属するコンパートメントのOCIDを指定
create_data_ingestion_job_response = generative_ai_agent_client.create_data_ingestion_job(
	create_data_ingestion_job_details=oci.generative_ai_agent.models.CreateDataIngestionJobDetails(
		data_source_id="ocid1.genaiagentdatasource.oc1.us-chicago-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
		compartment_id="ocid1.compartment.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
		display_name="EXAMPLE",
		description="EXAMPLE-desc"))

 

2.①-3 作成したFunctionsのテスト

2.①-2で作成したFunctionsをデプロイ・実行してデータ・ソースの取込みジョブが実行されれば成功です。

ファンクションをデプロイ

fn -v deploy --app [application name] 

ファンクションを呼び出し

fn invoke [application name] [function name]


 

3. Events Serviceを利用した取込みジョブの自動化

Events Service(以下Events)は、OCIテナンシのリソースの状態変更に基づいてイベントを作成し、それらを起点として自動化の仕組みづくりが出来るサービスです。

Eventsサービスに関しては以下のOracle社のドキュメントを参照ください。
イベントの開始

 

3.① ルールの作成

Eventsでは、イベント作成の起点となるリソースと、それらのイベントを受けて実行するアクションを「ルール」として定義して利用します。

今回は、データ・ソースに指定したObject Storageバケットにドキュメントがアップロードされた際に自動的にGAI Agentの取込みジョブ(を実行するFunctions)を実行したいため、下記のように指定します。

イベント型

イベント・タイプ Object - Create Object - Update
属性 bucketIdに対象のObject StorageバケットのOCIDを指定


アクション

アクション・タイプ ファンクション
詳細 ファンクション・アプリケーション及びファンクションに2.①-2で作成したFunctionsを指定

 

3.② 取込みジョブ自動化の検証

設定したEventsが正しく動作することを確認します。まず、事前の状態としてGAI Agentのデータ・ソースに無い質問を行い、回答が得られないことを確認します。



次に、先ほど回答が得られなかった質問に対する情報が記載されているドキュメントを、Object Storageバケットにアップロードします。



アップロードが完了した後に、Eventsのログを確認すると、Fanctionsが自動実行されたことがわかります。(実行ログを確認するためには、事前にEventsでログの有効化が必要です。)



GAI Agentの取込みジョブのステータスが成功に変わったことを確認します。



データ・ソースへの取込が完了した後に、先ほどと同一の質問をGAI Agentに対して投げかけると、アップロードしたドキュメントに基づいて想定通りの回答を得ることが出来ました。

 

おわりに

OCIで2024年9月より提供開始されたGenerative AI AgentsサービスをObject Storageをデータ・ソースとして構成する際、OCI FunctionsとEvent Serviceを使ってドキュメントの取込みを自動化する方法をご紹介しました。

ご覧頂いた皆さまのOCIにおける生成AIサービス活用の一助となれば幸いです。

 

お問い合わせ

atlax では、ソリューション・サービス全般に関するご相談やお問い合わせを承っております。

 

関連リンク・トピックス

・atlax / クラウドの取り組み / OCI (Oracle Cloud Infrastructure)

・2024/08/15 RAGの真価を引き出す:生成AIチャットボット回答精度向上の実践的アプローチ

 ・2024/07/30 日本初のOCI最上位資格取得者にインタビュー!常に学ぶ姿勢を持ち、新たな技術領域のファーストペンギンに

※ 記載された会社名 および ロゴ、製品名などは、該当する各社の登録商標または商標です。
※ アマゾン ウェブ サービス、Amazon Web Services、AWS および ロゴは、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。
※ Microsoft、Azure は、米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です。
※ Google Cloud、Looker、BigQuery および Chromebook は、Google LLC の商標です。
※ Oracle、Java、MySQL および NetSuite は、Oracle Corporation、その子会社および関連会社の米国およびその他の国における登録商標です。NetSuite は、クラウド・コンピューティングの新時代を切り開いたクラウド・カンパニーです。

*1:Retrieval-Augmented Generation (RAG)大規模言語モデル(LLM)によるテキスト生成に、外部情報の検索を組み合わせることで、回答精度を向上させる技術のこと。