8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

話題の MCP と巡る OCI RAG ソリューションの旅 - Select AI with RAG と Generative AI Agents ディープダイブ

Last updated at Posted at 2025-06-16

はじめに

「すべてはコンテキストにあり(Context is all you need)」 と言われる今、注目されているのが、Model Context Protocol(MCP) という新しい技術です。MCPは、AIモデルと様々なデータソースやツールを標準化された方法で接続することを可能にします。これにより、企業は既存のシステムやデータベースをAIアプリケーションと簡単に連携させることができるようになります。
このブログでは、話題のMCPを活用して、Oracle Cloud Infrastructure(OCI)のRAGソリューションを深掘りしていきます。

この記事は2025年5月23日(金)に開催された Developer Day 2025 のブレイクアウトセッション [T1-4] 「話題の MCP と巡る OCI RAG ソリューションの旅 - Select AI with RAG と Generative AI Agents ディープダイブ」の内容をブログ記事化・再構成したものです。

1. 生成AI(LLM)活用で大切なもの:コンテキスト

大規模言語モデル(LLM)を活用する上で最も重要なのは、コンテキスト(文脈) です。LLMは、質問に対して関連性の高いコンテキストが不足している場合、事実ではない内容を生成してしまうことがあります。これは「ハルシネーション」とも呼ばれます。

image.png

質問に対する正確な答えを得るためには、「コンテキストを踏まえて質問に答えて+コンテキスト」という形式で、LLMに適切な背景情報を提供することが不可欠です。

コンテキストを拡張・補完する方法として、主に以下の二つが挙げられます。

image.png

  • Retrieval-Augmented Generation (RAG): データベースなどから検索によってコンテキストを拡張(補完)します。
  • ツール利用: AIアプリケーションが、Web検索、天気予報、ホテル空室情報など、各種ツールからコンテキストを取得してLLMへ提供します。

2. モデルコンテキストプロトコル(MCP)とは?

MCP(Model Context Protocol) は、アプリケーションがLLMにコンテキストを提供する方法を標準化するオープンプロトコルです。
image.png

MCPは、AIアプリケーションにとってのUSB-Cポートのようなものと例えられます。USB-Cがデバイスを様々な周辺機器やアクセサリーに接続する標準的な方法を提供するように、MCPはAIモデルを異なるデータソースやツールに接続する標準的な方法を提供します。
image.png

ちなみに、「コンテキスト(文脈)」という言葉が入っていることから見逃されがちですがMCPは、単に環境から情報を取得するだけでなく、環境へ影響を与えること もできます。例えば、ホテルの空室情報取得だけでなくホテルの予約、あるいはデータベースの検索だけでなくDBA業務の実行やデータベースの更新も可能です。
image.png

MCPのアーキテクチャ

image.png

MCPは以下のコンポーネントで構成されます。

  • MCPホスト: AIアシスタント、IDE、AIエージェントなど、MCPを使ってデータやサービスへアクセスするアプリケーションです。このブログでは、主に Anthropic社のAIアシスタントアプリケーションである「Claude Desktop」をMCPホストとして使用しています。
  • MCPクライアント: MCPサーバーとの接続を維持・管理するプロトコルクライアントです。
  • MCPサーバー: MCP標準に則ってデータソースや外部サービスとのプロキシーとして振舞うプログラムです。
  • MCPプロトコル: ホスト、クライアント、サーバー間の通信プロトコルです。

MCPの主な機能(プリミティブ)

image.png

  1. ツール(モデル制御): AIモデルが自ら判断して実行するアクションです。AIモデルが状況を分析し、自律的に適切なツールを選択して実行します(例:SQLの実行、天気予報の取得、Web検索)。
  2. リソース(アプリケーション制御): アプリケーション側が管理・提供する読み取り専用のデータソースです。アプリケーションがどのリソースをAIモデルに利用可能にするかを決定します(例:テキストファイル、データベーススキーマ、ファイル)。
  3. プロンプト(ユーザー制御): ツールやリソースを効果的に利用するためにあらかじめ定義されたプロンプトのテンプレートです。ユーザーがどのプロンプトを使用するかを主体的に選択・指定します。AIアプリケーションによっては スラッシュコマンドでプロンプトを呼び出したり、プルダウンリストで選択するなど様々な UI がありますがユーザーが主体的に使用を決定する点がツールやリソースとは大きく異なります。

MCPのメリット

  • サービスプロバイダー(API)デベロッパー: 自社データソース/サービスのMCPサーバーを一度公開すれば、様々な(Virtually Unlimited)MCP対応AIアプリケーションから使ってもらえるようになります。
    image.png

  • AIアプリケーションデベロッパー: AIアプリケーションを一度MCP対応にすれば、様々な(Virtually Unlimited)外部ツールを活用できるようになります。
    image.png

  • AIアプリケーションユーザー: MCP対応AIアプリケーションを導入すれば、様々な(Virtually Unlimited)外部ツールを活用できるようになります(サービス固有のAPIを知る必要がなくなります)。
    image.png

なお、MCPそのものについては以下の記事も是非ご参照ください。

3. Oracle Database MCPサーバー(非公式な実験的な実装)

Oracle Database と AI アプリケーションを接続する MCPサーバーは、私が勉強のために作った非公式な実装を使っています。Qiitaにも記事を公開しています。

構成と技術スタック

image.png

  • MCPホスト: Claude Desktop
  • MCPサーバー(仮): 自作のOracle Database MCPサーバー
  • データベース: Oracle Autonomous Database (23ai)
  • MCPサーバーの技術スタック:
    • MCP SDK: 公式 MCP Python SDK (FastMCPクラス) Ver. 1.6.0
    • 言語: Python 3.13.2
    • Oracle Driver: python-oracledbドライバ 3.1.0

提供する3つのツール

このOracle Database MCPサーバー(仮)は、以下の3つのツールを提供します。
image.png

DDLやDMLの実行を制限しているのは今回の実験的な実装の仕様です。MCPなどの制約ではありません。

MCP サーバーの作りかた – Python MCP SDK 編

上記のようなツールを持った基本的な MCP サーバーの作り方は意外とシンプルです。
image.png

これは、公式SDKに含まれてる FastMCP を使った例です。FastMCP には、更に高機能に拡張された FastMCP 2.0 というものもあります。
MCPサーバーにツールを登録する際は、Python SDKの@mcp.tool()デコレーターを使用します。このデコレーターを適用した関数の情報(関数名、引数、戻り値の型、ドックストリング)がMCPクライアントから利用可能となり、LLMは関数の説明をもとにツールを選択することができるようになります。

動作例

”どんなテーブルがありますか?“

AI アプリケーション(Claude Desktop) に"どんなテーブルがありますか?"と聞いてみます。
image.png

LLM(Claude) が自ら list_tables ツールの使用を決定して実行しています。さらに、親切なことにテーブルの詳細を確認することができますよと教えてくれています。

ここで、LLM(Claude)が適切なツールを選択できるのは、関数の説明が @mcp.toolデコレータによって MCPサーバーに登録されているためです。
image.png

この関数の説明がとても大切です!

“どんなテーブルがありますか?“

次に、AI アプリケーション(Claude Desktop) に"どんなテーブルがありますか?"と聞いてみます。
image.png

現在、MCP サーバーが Autonomous Database へログインしているデータベース・ユーザーが所有するテーブルを教えてくれています。
「list_tables」というツール名が表示されているプルダウンを展開するとツールのパラメータと応答を確認することができます。
image.png
この例では、パラメータには何も指定していません。この場合、list_tablesは、現在のデータベース・ユーザーが所有するテーブルを応答します。

“テーブルの構造は?“

次に、"テーブルの構造は?"と聞いてみます。
image.png

image.png

describe_tableツールを呼び出して、IMAGESテーブルの構造を調べて、説明までしてくれています。

“他のスキーマのテーブル?“

先程は、ログインユーザーが所有するテーブルの一覧を取得しましたが今度は他の人が所有するテーブルの一覧を見てみます。
image.png
image.png

SHスキーマのテーブル一覧を取得できました。
今回は、LLM が list_tablesのパラメータの"所有者(owner)"を指定してくれています。
image.png

”NL2SQL”

今度は、自然言語で指示をしてデータベースを検索、集計してもらうタスクを試してみます。
image.png
image.png

ちゃんと集計できていますね。
execute_oracleツールのパラメータを見てみます。
image.png
image.png

LLM が SQL を生成して、そのSQL を execute_oracleツールに渡してくれていることがわかります。

4. Select AI with RAG

Oracle Autonomous Databaseの Select AI with RAGを使用すると、わずか5分でRAG環境を構築できます。(5分は著者の感想ですw)

環境構築から質問するまでのステップはこの4つです。

image.png

RAGの環境構築ステップ

image.png

Select AI with RAG では、DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャで、データの取り込みから、テキスト抽出とチャンキング、ベクトル化、ベクトル・ストア作成、ベクトル・ストア作成へのドキュメントとベクトル埋め込みの格納、ベクトル索引の生成までを一気に実行することができます。

AIプロファイルの作成: Select AI with RAG に必要な生成AIモデル(埋め込みモデル、回答生成モデル)や資格証明などを定義します。

```sql
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'RAG_PROFILE',
    attributes   => '{"provider": "oci",
                     "credential_name": "OCI$RESOURCE_PRINCIPAL",
                     "embedding_model": "cohere.embed-multilingual-v3.0",
                     "model": "cohere.command-a-03-2025",
                     "vector_index_name": "MY_INDEX" }');
END;
```

ベクトルインデックスの作成: オブジェクトストレージ上のドキュメントをデータソースとして、ベクトルストアとベクトルインデックスを作成します。テキスト抽出、チャンキング、ベクトル化、格納、索引更新が自動化されます。

```sql
BEGIN
  DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
    index_name  => 'MY_INDEX',
    attributes  => '{"vector_db_provider": "oracle",
                     "location": "https:.../my_namespace/my_bucket/my_data_folder",
                     "object_storage_credential_name": "OCI$RESOURCE_PRINCIPAL",
                     "profile_name": "RAG_PROFILE",
                     "vector_dimension": 1024,
                     "vector_distance_metric": "cosine",
                     "chunk_overlap":25,
                     "chunk_size":250,
                     "refresh_rate": 60}');
END;
```
データソースとして、オブジェクトストレージのバケット内のサポートされるフォーマットの全てのドキュメントが利用されます。
今回投入したドキュメント

今回は、Select AI / DBMS_CLOUD_AI パッケージ関連のオラクルのドキュメント群と私のRAG / 埋め込み関連のブログを入れてみました。

image.png

RAGの利用

image.png

セッションにAIプロファイルを設定

EXEC DBMS_CLOUD_AI.SET_PROFILE('RAG_PROFILE');

SELECT AI narrateを使用して質問

SELECT AI narrate 生成AIとは?;

実行すると、質問文のベクトル化、ベクトル検索、回答生成が自動的に行われます。回答には、利用されたソースドキュメントのURLも含まれます。

回答例
生成AIは、テキスト、画像、音声などのコンテンツを生成する人工知能です。この技術は、大規模な言語モデル(LLM)や画像生成モデルなど、さまざまな形式で実現されています。
生成AIは、ユーザーからの入力に基づいてコンテンツを生成する能力を持ち、自然言語処理(NLP)やコンピュータービジョンなどの分野で活用されています。
Sources:
- GenAIwithEmbeddings.txt (https://orasejapan.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/orasejapan/b/devday25-arakawa-bucket/o/GenAIwithEmbeddings.txt)
- GenAIwithRAG-2.txt (https://orasejapan.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/orasejapan/b/devday25-arakawa-bucket/o/GenAIwithRAG-2.txt)
- GenAIwithRAG.txt (https://orasejapan.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/orasejapan/b/devday25-arakawa-bucket/o/GenAIwithRAG.txt)

なお、AIプロファイルの設定を忘れると「ORA-00923: FROMキーワードが指定の位置にありません。 https://docs.oracle.com/error-help/db/ora-00923/ 」というエラーとなります

5. MCPでSelect AI with RAG

私の実験的実装のOracle Database MCPサーバーのexecute_oracleツールを使用することで、Claude Desktopから直接RAGクエリを実行したり、RAGの裏側を探索したりすることができます。

RAGクエリの実行

「RAGを使って調べて」と質問してみます。

image.png

LLMは、execute_oracleツールで利用可能なAIプロファイルを探します。
image.png

利用可能なAIプロファイルを見つけました。
image.png

次にLLMは見つめたプロファイルをセッションに設定します。

image.png

SELECT AI with RAGで質問を行います。
image.png

生成された回答が返って来ました。
image.png

どうやら LLM は最初の回答に満足しなかったようで、更に、観点を変えて質問を繰り返しています。このあたりの動作は、LLMの賢さと AI アプリケーションのプロンプトに依存します。
image.png

AI アプリケーション(Claude Desktop)からの最終回答はこちらです。
image.png
image.png

6. MCPでSelect AI with RAG の深堀り

Select AI with RAG では、CREATE_VECTOR_INDEX プロシージャひとつで簡単に RAG パイプラインを構築して、SELECT AI narrate 質問文 で QA ができることを見てきました。ところで、CREATE_VECTOR_INDEX プロシージャでドキュメントを格納するベクトルストアって指定しましたっけ?(今回の例では指定していません。Attribute で指定することも可能です。)
そこで、MCPを使って AI アプリケーション(Claude Desktop)から対話形式でベクトルストアを探してみましょう。

ベクトルストアを探索

”AI Profileの属性の調べ方をRAGで聞いて”

image.png
どうやらUSER_CLOUD_AI_PROFILESビューを調べればよいようです。
ちなみに、このときLLMが設定したクエリーはこちらでした。SELECT AI narrate 質問文を使っていますね。
image.png

”USER_CLOUD_AI_PROFILESビューで RAG_PROFILE の属性を調べて”

"USER_CLOUD_AI_PROFILESビューで RAG_PROFILE の属性を調べて"と質問してみます。
image.png
image.png

vector_index_name は、MY_INDEX であることがわかりました。確かに RAG_PROFILE を作成したときに MY_INDEX と指定していましたね。

"MY_INDEX が設定されているテーブルは?"

では、このMY_INDEXが設定されているテーブル、つまり、ベクトルストアの名前は何でしょうか?今、探しているのはベクトルストアですよね。
そこで、次は、"MY_INDEX が設定されているテーブルは?"と聞いてみます。
image.png
image.png
My_INDEX$VECTAB”というテーブルが自動的に作られていたことがわかりました(ベクトル索引作成時に名前を指定することもできます)。

"My_INDEX$VECTABのテーブル構造を知りたい"

このMy_INDEX$VECTABはどんなテーブルでしょうか?
image.png

"サンプルレコードを見たい"

サンプルレコードを取ってきてもらいましょう。
image.png
image.png

RAG の “R” ではどんな SQL が使われているの?(showsqlアクション)

ベクトルストアの名前や構造、どんなデータが入っているか、ベクトル索引の名前がわかりました。ところで、RAG の "R"、つまり、Retriever ではどんな SQL で検索が行われているのでしょうか?

SELECT AI には narrate という検索結果を元に自然言語による回答を生成してくれるアクションの他に showsql という検索に使われる SQL の生成だけを行うアクションがあります。

SELECT AI SHOWSQL 埋め込みモデルとは何ですか?

image.png
image.png

Select AI with RAG はdefaultで上位5件を取得しているんですね(ベクトル索引作成時に変更できます)。

RAG の “R” だけ実行してみたい(runsqlアクション)

RAG では精度向上が課題となりますが、そのためには原因分析が欠かせません。最終的な回答だけを見て正解率がXX%だと言っているだけでは精度を上げることはできません。そこで、重要なのは、果たして検索結果はどうだったのだろうかということですね。検索結果に正解を導く情報がなければ LLM は正解を回答できるはずがありません。そこで、検索だけを実行していたいということになります。今度は、runsqlというアクションを使うことができます。

SELECT AI RUNSQL 埋め込みモデルとは何ですか?

image.png
image.png
前半の表になっている部分がSQLの検索結果です。先程SQLで見たように5件返ってきています。
最後のまとめは、この検索結果を元に AIアプリケーション(Claude Desktop)の LLM が回答を生成しています。

7. Select AI Chat

ここまでに、SELECT AI のアクションとして、SQLを生成・実行して、その結果を元に自然言語で答えてくれるnarrate、SQLの生成だけを行うshowsql、SQL生成とSQLの実行までを行うrunsqlをご紹介してきましたが、SELECT AI ではさらに LLM と会話するアクションが提供されています。chatアクションです。
RAGの「R」(Retrieval)を行わないため、コンテキストがない場合は情報が古い可能性があります。
image.png

SELECT AI CHATの大きな利点は、回答生成のプロンプトを自分で設定できる点です。例えば、独自のガードレール(「医療、法律、または金融に関する助言を求められた場合は、AIアシスタントとしての制限を再確認し、適切な専門家に相談するようユーザーに指示します....」など)を設定することが可能です。

SELECT AI RUNSQLなどで取得・補完したコンテキストを元に、SELECT AI CHATで回答を生成するという使い方も考えられます。
image.png

8. OCI Generative AI Agents Platform

SELECT AIでは、今のところ自然言語による質問や指示に相応しいツールを適切なタイミングで呼び出すという機能は実装されていません。
image.png
そこで活用できるのが OCI Generative AI Agents Platform です。
OCI Generative AI Agents Platformは、AIエージェントのローコード開発サービスです。このプラットフォームでは、エージェントがツールの選択、実行順序を自律的に計画し、実行して目的を達成します。
image.png

提供される3つのツールタイプ

OCI Generative AI Agents Platform は、以下の3種類のツールが提供されています。
(※2025年6月16日時点では MCP には未対応です。今後に期待ですね)

  1. RAGツール: 文書検索を目的とし、Autonomous Database、Base Database、OpenSearch、Object Storageなどをデータソースとして利用できます。
  2. SQLツール: 自然言語からSQLクエリへの変換とSQLの実行を可能にし、Autonomous DatabaseやBase Databaseに対応しています。テーブルや列の説明、例を含めることで、より正確なSQL生成が可能です。
  3. カスタムツール: 外部サービスとの連携プログラムへの連携を目的とし、OCI SDKで必要な処理をコーディングできます(例:インターネット検索、OCIサービスの連携、現在時刻取得、天気情報取得)。

エージェントは、ユーザーメッセージを元に、ツールの定義からツール起動の必要性を識別し、指定されたツールを起動します。ツール実行結果を添えて、最終回答を生成します。RAG Tool、SQL Tool、カスタムツールそれぞれの応答を元に回答を生成することができます。

OCI Generative AI Agents Platformで定義されたツールの例

image.png

カスタムツールのコード例

(OCI Generative AI Agents Python SDK の例)
image.png

エージェントの実行例

image.png

OCI Agent Development Kit (ADK)

OCI Generative AI Agents Platform には、SDK に加えて、よりハイレベル、抽象度の高いプログラミングが可能な OCI Agent Development Kit (ADK) があります。
こちらは、すばらしいブログを書かれている方がいらっしゃいますのでぜひそちらをご参照ください。

OCI Agent Development Kit (ADK) と SDK の使い分けについて
OCI Agent Development Kit (ADK) で RAG を用いたエージェントの作成
OCI Agent Development Kit (ADK) で作成したエージェントのセットアップ処理と実行処理を分離する
OCI ADK を使用してエージェントの初期化を効率的に実施する方法
GitHub Actions を使って OCI Agent Development Kit (ADK) の自動化を実現

9. DIYでMCPホスト(クライアント)を作る

Claude Desktop の利用の他に、MCP公式SDKやLangChainを使用して、自作のMCPホスト(クライアント)を構築する実験も行いました。

MCP公式SDKの mcp.client.stdio スクラッチ + Claude 3.7 Sonnet

  • UIフレームワーク: Gradio
  • エージェントフレームワーク: なし(ツールの呼び出しがなくなるまで繰り返し実行、上限25回のLLM呼び出し)
  • MCP統合: 公式 MCP Python SDK
  • LLM: Anthropic Claude 3.7 Sonnet

この実装では、以下の処理をMCPツールを使って全自動で実行できました。

  1. 利用可能なAI Profileの確認
  2. AI Profileの設定
  3. SELECT AI NARRATEを使ったSQL文の生成
  4. SQLの実行
  5. 回答生成

MCP公式SDK と Gradio による実装の参考情報

MCP 公式の MCP Simple Chatbot
Gradio 公式 のガイド “Using the Gradio Chatbot as an MCP Client”

LangGraph Prebuild Agent + Claude 3.7 Sonnet

image.png

  • UIフレームワーク: Gradio
  • エージェントフレームワーク: LangGraph Prebuild Agent
  • MCP統合: LangChain MCP Adapter
  • LLM: Anthropic Claude 3.7 Sonnet

この方法では、本質的な部分は以下の数行で実装可能です。

tools = await load_mcp_tools(session)
graph = create_react_agent(
    llm,
    tools=[tools],
    prompt="あなたは親切なアシスタントです。",
)

LLMからの応答にツールの起動指示がなくなるまで繰り返します(繰り返し回数のデフォルト上限は10回)。
image.png
LangGraph Prebuild Agentより

こちらも、利用可能なAI Profileの確認から回答生成まで、MCPツールを使って全自動で実行可能です。

LangGraph Prebuild Agent 参考情報

LangChain 公式の LangChain MCP Adapter
LangChain 公式 のLangGraph Prebuild Agent

10. まとめ

  1. 生成AIの活用には、適切なコンテキスト(背景情報)をLLMに提供することが不可欠です。
  2. MCP(Model Context Protocol) を使うと、コンテキストの取得が容易になります。これはサービスプロバイダー、AIアプリケーションデベロッパー、ユーザーのいずれにとっても大きなメリットとなります。
  3. コンテキスト取得手段の代表はRAG (Retrieval-Augmented Generation) です。OracleのSelect AI with RAGを使えば、簡単にRAG環境を構築できます。
  4. RAG以外のツールからコンテキストを取得したい場合、OCI Generative AI Agents Platformのカスタムツールが利用できます。

AIエージェントとデータベースMCPサーバーを活用することで、経営戦略の立案のような複雑なタスクも実現できるようになるでしょう。

おまけ

AI エージェントとデータベース MCP サーバーで経営戦略を立案してもらう

image.png

image.png

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?