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

## はじめに

**「すべてはコンテキストにあり（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 ディープダイブ」の内容をブログ記事化・再構成したものです。

https://speakerdeck.com/kutsushitaneko/hua-ti-no-mcp-toxun-ru-oci-rag-soriyusiyonnolu-select-ai-with-rag-to-generative-ai-agents-deipudaibu

## 1. 生成AI（LLM）活用で大切なもの：コンテキスト

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/8de090bd-e66b-457f-bfef-260ec146f9f9.png)


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

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/6aea51cf-cf1d-4891-b005-fea5ed18b513.png)
*   **Retrieval-Augmented Generation (RAG)**: データベースなどから検索によってコンテキストを拡張（補完）します。
*   **ツール利用**: AIアプリケーションが、Web検索、天気予報、ホテル空室情報など、各種ツールからコンテキストを取得してLLMへ提供します。

## 2. モデルコンテキストプロトコル（MCP）とは？
**MCP（Model Context Protocol）** は、アプリケーションがLLMにコンテキストを提供する方法を標準化するオープンプロトコルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/d9e24259-1ad7-4260-bcd4-603d8fe46bbc.png)


MCPは、AIアプリケーションにとってのUSB-Cポートのようなものと例えられます。USB-Cがデバイスを様々な周辺機器やアクセサリーに接続する標準的な方法を提供するように、MCPはAIモデルを異なるデータソースやツールに接続する標準的な方法を提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/9f25c4b7-f5ad-4864-85c7-1ee00d62c78b.png)

ちなみに、「コンテキスト（文脈）」という言葉が入っていることから見逃されがちですがMCPは、単に環境から情報を取得するだけでなく、**環境へ影響を与えること** もできます。例えば、ホテルの空室情報取得だけでなくホテルの予約、あるいはデータベースの検索だけでなくDBA業務の実行やデータベースの更新も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/5d47a5db-a2e7-454a-ba2b-ae40bb07421e.png)


### MCPのアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/657c8b31-2dbf-4b36-9ada-e98d02951c4a.png)

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

### MCPの主な機能（プリミティブ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/3b8f4fb9-63f3-4019-817d-04ff112c1c8d.png)


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

### MCPのメリット

*   **サービスプロバイダー（API）デベロッパー**: 自社データソース/サービスのMCPサーバーを一度公開すれば、様々な（Virtually Unlimited）MCP対応AIアプリケーションから使ってもらえるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/3958bfdd-caef-4ce1-a0f8-fc964f67d598.png)

*   **AIアプリケーションデベロッパー**: AIアプリケーションを一度MCP対応にすれば、様々な（Virtually Unlimited）外部ツールを活用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/5a9f28f6-a73c-46ad-880e-f6765656d144.png)

*   **AIアプリケーションユーザー**: MCP対応AIアプリケーションを導入すれば、様々な（Virtually Unlimited）外部ツールを活用できるようになります（サービス固有のAPIを知る必要がなくなります）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/98443a1d-4424-4c14-9e60-9d5195ce1ed1.png)

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

https://qiita.com/ksonoda/items/1c681a563a95a93975ff

## 3. Oracle Database MCPサーバー（非公式な実験的な実装）

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

https://qiita.com/yuji-arakawa/items/64aad551c810b41ed49d

### 構成と技術スタック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/9d1ef037-8341-45f1-bef0-f4026fb3218b.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/a28c75d2-9082-476c-bed1-b66cb6637350.png)

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

### MCP サーバーの作りかた – Python MCP SDK 編
上記のようなツールを持った基本的な MCP サーバーの作り方は意外とシンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/448fae20-7bf2-4ae2-81b2-c5d7bcb772ce.png)

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

### 動作例
#### ”どんなテーブルがありますか？“
AI アプリケーション（Claude Desktop） に"どんなテーブルがありますか？"と聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/6017f154-75f8-4abd-b6fd-f5b5cd66622f.png)

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

ここで、LLM（Claude）が適切なツールを選択できるのは、関数の説明が `@mcp.tool`デコレータによって MCPサーバーに登録されているためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/675186e1-9557-49a2-93f9-6e458a0b9600.png)

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

#### “どんなテーブルがありますか？“
次に、AI アプリケーション（Claude Desktop） に"どんなテーブルがありますか？"と聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/473edb8a-ab37-43f1-a706-31c3fa279f94.png)

現在、MCP サーバーが Autonomous Database へログインしているデータベース・ユーザーが所有するテーブルを教えてくれています。
「list_tables」というツール名が表示されているプルダウンを展開するとツールのパラメータと応答を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/918067b9-61a3-4411-b745-ddc82b8ae821.png)
この例では、パラメータには何も指定していません。この場合、`list_tables`は、現在のデータベース・ユーザーが所有するテーブルを応答します。
#### “テーブルの構造は？“
次に、"テーブルの構造は？"と聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/c8a3d72c-e25a-4a17-b087-49eeb3533d54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/f765e44a-be48-4270-86b7-4d544680f902.png)

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

#### “他のスキーマのテーブル？“
先程は、ログインユーザーが所有するテーブルの一覧を取得しましたが今度は他の人が所有するテーブルの一覧を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/756c163a-2f57-46dd-a9c0-95dfa802f370.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/cf030d08-19aa-4730-b080-ae91e8652152.png)

SHスキーマのテーブル一覧を取得できました。
今回は、LLM が `list_tables`のパラメータの"所有者（owner）"を指定してくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/fa9a201d-6419-4650-87d2-a4fa41df8821.png)

#### ”NL2SQL”
今度は、自然言語で指示をしてデータベースを検索、集計してもらうタスクを試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/e74093d0-b255-419a-be95-6c0fa93bb137.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/9ba2ca21-4057-45d0-a1c3-645d9e1197a6.png)

ちゃんと集計できていますね。
`execute_oracle`ツールのパラメータを見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/c8f184e1-73a5-4bfb-b9c7-fc5b3e93523f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/bc8ece98-c47b-4181-a644-81bb47851ced.png)

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


## 4. Select AI with RAG

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/0258976e-ba1a-4ba0-aa23-cd597aa1c951.png)

### RAGの環境構築ステップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/af530239-fb19-4520-89c4-32e406ccdeec.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/5f31631e-8c7f-423c-9bd0-951eea650e3c.png)


### RAGの利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2b24bcd2-a0bd-450b-860d-071a54042451.png)


#### **セッションにAIプロファイルを設定**
```sql
EXEC DBMS_CLOUD_AI.SET_PROFILE('RAG_PROFILE');
```

#### `SELECT AI narrate`を使用して質問
```sql
SELECT AI narrate 生成AIとは？;
```
実行すると、質問文のベクトル化、ベクトル検索、回答生成が自動的に行われます。回答には、利用されたソースドキュメントのURLも含まれます。
|回答例|
|---|
|生成AIは、テキスト、画像、音声などのコンテンツを生成する人工知能です。この技術は、大規模な言語モデル（LLM）や画像生成モデルなど、さまざまな形式で実現されています。<BR>生成AIは、ユーザーからの入力に基づいてコンテンツを生成する能力を持ち、自然言語処理（NLP）やコンピュータービジョンなどの分野で活用されています。<BR>Sources:<BR>  - GenAIwithEmbeddings.txt (https://orasejapan.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/orasejapan/b/devday25-arakawa-bucket/o/GenAIwithEmbeddings.txt)<BR>  - GenAIwithRAG-2.txt (https://orasejapan.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/orasejapan/b/devday25-arakawa-bucket/o/GenAIwithRAG-2.txt)<BR>  - 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/0eed972c-d61e-4519-84ca-5a0743dab2fc.png)

LLMは、`execute_oracle`ツールで利用可能なAIプロファイルを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/1f8e2a32-0aa9-44c1-bb71-aac733660374.png)

利用可能なAIプロファイルを見つけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/f503c204-9d19-46ca-981c-8d1abc238c32.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/4d78d01c-2a0d-4dcd-9468-f2a0c138c032.png)

`SELECT AI with RAG`で質問を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2aa41c8b-e029-48d3-8a78-d4183787edd1.png)

生成された回答が返って来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/744c23b6-a303-403e-94d3-fdfab440818c.png)

どうやら LLM は最初の回答に満足しなかったようで、更に、観点を変えて質問を繰り返しています。このあたりの動作は、LLMの賢さと AI アプリケーションのプロンプトに依存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/463b3ffe-e744-4025-a4ef-76784efff4d0.png)

AI アプリケーション（Claude Desktop）からの最終回答はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/4d7f09ab-7f76-4212-aa49-98b13a7b4362.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/a0868f71-ce20-49fc-96b9-1cde526beea3.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/66f7fcf3-442c-4527-b1b2-b11ae5e772aa.png)
どうやら`USER_CLOUD_AI_PROFILES`ビューを調べればよいようです。
ちなみに、このときLLMが設定したクエリーはこちらでした。`SELECT AI narrate 質問文`を使っていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/e4fc125d-210c-4a95-9d83-d372e02f0267.png)

#### **”USER_CLOUD_AI_PROFILESビューで RAG_PROFILE の属性を調べて”**
"USER_CLOUD_AI_PROFILESビューで RAG_PROFILE の属性を調べて"と質問してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/52286f0d-c4b1-49f0-a19b-d6163b6925f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/f9d66c43-58c4-4362-a19c-e6fa005018ff.png)

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

#### **"MY_INDEX が設定されているテーブルは？"**

では、このMY_INDEXが設定されているテーブル、つまり、ベクトルストアの名前は何でしょうか？今、探しているのはベクトルストアですよね。
そこで、次は、"MY_INDEX が設定されているテーブルは？"と聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/b9f814f3-e72e-47ce-b4bf-2e62e4fc3932.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/376eff59-4a4b-4c50-ad40-29ff85bfdc70.png)
“**My_INDEX$VECTAB**”というテーブルが自動的に作られていたことがわかりました（ベクトル索引作成時に名前を指定することもできます）。

#### **"My_INDEX$VECTABのテーブル構造を知りたい"**
この`My_INDEX$VECTAB`はどんなテーブルでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/d03f8361-62d3-4aad-8db9-aa772506b41d.png)

#### **"サンプルレコードを見たい"**
サンプルレコードを取ってきてもらいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/8b5605f1-550d-462e-8e74-b9ba947437b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/f42842fb-144b-4ed3-a1fa-d00a3f31a675.png)

### RAG の “R” ではどんな SQL が使われているの？（`showsql`アクション）
ベクトルストアの名前や構造、どんなデータが入っているか、ベクトル索引の名前がわかりました。ところで、RAG の "R"、つまり、Retriever ではどんな SQL で検索が行われているのでしょうか？

SELECT AI には `narrate` という検索結果を元に自然言語による回答を生成してくれるアクションの他に `showsql` という検索に使われる SQL の生成だけを行うアクションがあります。
#### **SELECT AI SHOWSQL 埋め込みモデルとは何ですか？**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/18229f35-f49f-4373-8d9e-52eb0404830c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/4d4ffe42-9525-4cbd-8468-9e91c4385927.png)

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

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

#### **SELECT AI RUNSQL 埋め込みモデルとは何ですか？**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/25b19fc7-5452-443d-827d-674a7b0adae4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/d7dc6cb1-9efb-4c53-8d4f-dee6067c55f4.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/6271b585-cfdb-4e1c-9d82-2ab997efcab9.png)

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

`SELECT AI RUNSQL`などで取得・補完したコンテキストを元に、`SELECT AI CHAT`で回答を生成するという使い方も考えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/0b19c640-0252-449e-9c3f-d2615e059226.png)

## 8. OCI Generative AI Agents Platform
SELECT AIでは、今のところ自然言語による質問や指示に相応しいツールを適切なタイミングで呼び出すという機能は実装されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/35da0e1e-c248-4218-939d-1a20557457de.png)
そこで活用できるのが **OCI Generative AI Agents Platform** です。
**OCI Generative AI Agents Platform**は、AIエージェントのローコード開発サービスです。このプラットフォームでは、エージェントがツールの選択、実行順序を自律的に計画し、実行して目的を達成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/f1a4280f-baa9-4fb9-96eb-9c0dcae9c3de.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/3937cf39-1d81-4577-ad89-616bde6f33cd.png)

#### カスタムツールのコード例
（OCI Generative AI Agents Python SDK の例）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/70780a64-dd66-4c05-ac4a-4b5629af402a.png)

### エージェントの実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/bf812709-e280-4b24-9fb3-6c34f16baad5.png)

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

[OCI Agent Development Kit (ADK) と SDK の使い分けについて](https://awsbloglink.wordpress.com/2025/06/01/oci-agent-development-kit-adk-sdk-2/)
[OCI Agent Development Kit (ADK) で RAG を用いたエージェントの作成](https://awsbloglink.wordpress.com/2025/06/07/oci-agent-development-kit-curry-agent/)
[OCI Agent Development Kit (ADK) で作成したエージェントのセットアップ処理と実行処理を分離する](https://awsbloglink.wordpress.com/2025/06/07/oci-agent-development-kit-adk-split-setup-run/)
[OCI ADK を使用してエージェントの初期化を効率的に実施する方法](https://awsbloglink.wordpress.com/2025/06/14/oci-adk-reset/)
[GitHub Actions を使って OCI Agent Development Kit (ADK) の自動化を実現](https://awsbloglink.wordpress.com/2025/06/15/oci-agent-development-kit-adk-github-actions/)

## 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](https://github.com/modelcontextprotocol/python-sdk/tree/main/examples/clients/simple-chatbot)
[Gradio 公式 のガイド  “Using the Gradio Chatbot as an MCP Client”](https://www.gradio.app/guides/building-an-mcp-client-with-gradio)


### LangGraph Prebuild Agent + Claude 3.7 Sonnet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/76e3b567-8111-4365-bd8a-e006023cc200.png)


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

この方法では、本質的な部分は以下の数行で実装可能です。
```python
tools = await load_mcp_tools(session)
graph = create_react_agent(
    llm,
    tools=[tools],
    prompt="あなたは親切なアシスタントです。",
)
```
LLMからの応答にツールの起動指示がなくなるまで繰り返します（繰り返し回数のデフォルト上限は10回）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/efdfcb2d-1d56-441d-96bd-48c2fd73001e.png)
[LangGraph Prebuild Agent](https://langchain-ai.github.io/langgraph/reference/agents/#langgraph.prebuilt.chat_agent_executor.create_react_agent)より


こちらも、利用可能なAI Profileの確認から回答生成まで、MCPツールを使って全自動で実行可能です。
#### LangGraph Prebuild Agent 参考情報
[LangChain 公式の LangChain MCP Adapter](https://github.com/langchain-ai/langchain-mcp-adapters)
[LangChain 公式 のLangGraph Prebuild Agent](https://langchain-ai.github.io/langgraph/reference/agents/)


## 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/7effeccf-9c30-490d-a4ac-70f701995b1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/39f09898-d3fc-4431-acf5-26717c8fc16c.png)

https://qiita.com/yuji-arakawa/items/d82607da0c96eb4099c3