8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Generative AI ServiceのAIエージェント開発 ~メモリ、Tools編 ~

8
Last updated at Posted at 2026-07-09

本記事は日本オラクルが運営する下記Meetupでの発表内容を記事に纏めたものです。

Meetup実施時の動画はこちら。

はじめに

本記事は下記記事の補足記事となります。

上記の記事では、Generative AI ServiceでAIエージェントを開発し、同サービスに新しく追加された Hosted Deploymentと呼んでいる仕組みを利用し、AIエージェントをGenerative AI Serviceにデプロイするしくみをご紹介しました。本記事では、上記の記事ではお伝えしきれなかった、AIエージェント開発時に利用できる便利な仕組みをご紹介します。

Agentの開発、運用には広範な知識と沢山の工数が必要になります。それを少しでも軽減し楽に運用するためにOCI Generative AI ServiceにはPaaSとしての様々な機能があります。

image.png

具体的には開発・運用面で下記のような機能を利用することができ、これによって開発時のアプリケーションコードは非常にシンプルになり、かつ運用面では管理ポイントを削減することができるようになっています。

AIエージェントの開発時に利用する機能

  • 短期メモリ保持:最近の会話履歴を保持する機能とリソース
  • 短期メモリの圧縮機能:なるべく沢山の会話を保持するためにる会話履歴情報を圧縮する機能
  • 長期メモリ:将来の使用のために会話から重要な情報を抽出し、保持する機能
  • ツール:MCP、Function Calling、NL2SQL、ベクトル検索、コードインタープリタなどのよく使われるツールを簡単に組み込めます
  • コンテナ操作:コンテナを利用する処理を実行する場合のコンテナ管理機能
  • ベクトルストア:セマンティック検索やNL2SQLツールを利用する際に必要となるベクトルストア機能
  • File Storage : 同サービス内で利用するファイルを保存できるストレージ
  • ガードレール:不適切なテキストの入出力の警告、ブロックを管理する機能

AIエージェントの運用時に利用する機能

  • オートスケール:エージェントへの問い合わせ負荷に応じてインフラリソースをオートスケールする機能
  • リソースモニタリング:エージェントの負荷状況、オートスケールの状況のモニター機能
  • 監査ログ:エージェントの処理の監査ログ機能
  • 認証・認可:クライアントからエージェントへのアクセスの認証認可機能

いずれの機能も、LLMを使ったアプリを開発・運用する際に大抵必要になるであろう仕組みです。本記事では、その中でもAIエージェントの開発時に利用する機能(主に「エージェント・メモリ」と「ツール」)について、その実装をご紹介します。

事前設定

OpenAI互換APIキーの作成

まず、OpenAI互換APIキーを取得します。GenAIのコンソールメニューを下記のように辿ってOpenAI互換APIキーを生成し、メモしておきます。

OCIコンソールの左上メニューから「アナリティクスとAI」-> 「生成AI」「API keys」->「APIキーの作成」ボタンをクリックしウィザードに従ってキーを生成すると下記のように"sk-"から始まるキーが生成されますのでこれをメモしておきます。

sk-wxxxxxxxxxBaiCS4f3mt

IAMポリシーを設定する

取得したOpenAI互換APIキーが利用できるようにIAMポリシーをセットします。

allow group Administrators to manage generative-ai-response in compartment agents where ALL { request.principal.type='generativeaiapikey', request.principal.id='sk-wxxxxxxxxxBaiCS4f3mt' }

OCI GenAIのプロジェクトを作成する

OCI GenAIで予め実装されている便利機能を使う場合は予めOCI GenAIの「プロジェクト」を作成します。 そして、この「プロジェクト」のOCIDをエージェントのコードに埋め込むことでOCI GenAIの便利機能を使うことができるようになります。

この「プロジェクト」には冒頭にご紹介した同サービスの PaaS機能の一部(メモリ関連のリソース、オートスケールのkubernetesインフラなど)が配備されており、エージェントのコードにその機能を利用するコードを埋め込む形で利用します。

OCIコンソールの左上メニューから「アナリティクスとAI」->「生成AI」-> 「Project」-> 「プロジェクトの作成」ボタンをクリックするとプロジェクトの作成ウィザードが起動します。

まずは、プロジェクトの名前と説明を入力します。

image.png

次に、会話の保存に関する要件を入力します。

image.png

次に短期メモリの圧縮機能に関する要件を入力します。
短期メモリは圧迫される前に自動圧縮(要約)されるためその処理に使うLLMを選択します。

image.png

次に長期メモリの圧縮機能に関する要件を入力します。
こちらも会話内容の要約に使うLLMと、ベクトル検索のための埋め込みモデルを選択します。
「作成」ボタンをクリック。

image.png

下図のようにプロジェクトの右にある「・・・」ボタンから「OCIDのコピー」をクリックしてこのプロジェクトのOCIDをメモしておきます。

image.png

下記のようなOCIになります。

ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxx

これをすることにより、OCI GenAIに予め備わっているPaaSとしての一部の便利機能(主にメモリ関連)が簡単なコードで利用できるようになります。

メモリ機能の実装

チャットボットのようなアプリケーションを構築する場合、会話の内容を保存しておくメモリ構造が必須となります。一般的にはデータベースを用意し、ユーザーとボットの会話を逐次そのデータベースに保存し、必要に応じてデータベースから過去の会話を取り出すことで、会話を成立させます。

image.png

そのメモリ構造には 「短期メモリ」と「長期メモリ」 と呼んでいる二つの仕組みがあります。

  • 短期メモリ
    同一会話内(同一セッション内) の直前までのやり取りを一時的に保持し、文脈を理解した応答を行う仕組みです。例えば「私の名前は田中です」の後に「私の名前は?」と聞くと、「田中です」と答えられるのは短期メモリによるものです。通常、会話終了やセッション切断で消去されます。

  • 長期メモリ
    複数の会話をまたいで(つまり異なるセッションで) ユーザー情報や過去のやり取りを継続的に保持する仕組みです。例えば以前に「犬を飼っている」と話した内容を、別の日の会話でも覚えていて応答に活用できます。ユーザーごとに識別子を持ち、個人設定や継続的な対話体験の向上に利用されることが多いです。

同サービスには、この2つのメモリ構造がPaaSの機能として備わっており、ユーザーはデータベースを構築・運用する必要なく簡単なコードでこのメモリ構造を利用することができるようになっています。

短期メモリの実装

まずはLLMのクライアントを定義します。その際はOCI Generative AI ServiceのProject IDを指定します。これにより、プロジェクトに紐づけられているメモリ(チャット履歴保存用のデータベース)が利用できます。

from openai import OpenAI

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",
    api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)

次に、会話ID(セッションID)を定義します。この際、会話の内容を要約してメモリに保持したい場合には"short_term_memory_optimization"の引数を定義します。

# 会話IDのセット
conversation = client.conversations.create(
    metadata={
        # 短期メモリの圧縮オプション
        #"short_term_memory_optimization": "True",
    }
)

conversation_id = conversation.id
print("conversation_id:", conversation_id)

次に、ユーザーの会話の入力です。入力時に、引数conversationで上記の会話IDを使うことで、同一セッションの会話と見なされ、このIDで会話が短期メモリに保存されます。例えば下記のように「私は心理学について勉強しています。何から勉強すればよいですか?」と入力してみます。

# 初回のチャット入力
user_input = "私は心理学について勉強しています。何から勉強すればよいですか?"

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input=user_input,
    # セット済の会話IDを利用
    conversation=conversation_id,
    max_output_tokens=500,
)

print(response.output_text)

LLMの応答としては下記の通りです。この出力も同じ会話IDでメモリに保持されています。

## 心理学入門・学習ロードマップ(初心者から中級者へ)

### 1️⃣ 心理学全体像をつかむ ― 「何が学べるのか」を把握する
| 大項目 | 目的 | オススメテキスト・動画 |
|--------|------|---------------------------|
| **心理学概論** | 心理学の歴史・主要理論・研究手法の全体像を俯瞰 | – **『心理学概論』**(荒木・中山 編、等)<br>– **「Psychology 101」**(Khan Academy・YouTube)|
・・・・・・
<略>
・・・・・・

次の入力で下記のように"私の勉強していることに関するニュースを教えてください。"と入力をしてみます。この際も引数conversationで上述と同じ会話IDを指定します。

# 二回目のチャット入力

user_input = "私の勉強していることに関するニュースを教えてください。"

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input=user_input,
    # セット済の会話IDを利用
    conversation=conversation_id,
    max_output_tokens=500,
)

print(response.output_text)

引数conversationで会話IDを指定することで、そのIDで短期メモリに保存されている過去の会話から「私が心理学について勉強している」という情報を前提とした応答が出力されていることがわかります。

以下は **2024 年 4 月~2026 年 5 月** に国内外の主要メディア・学術ジャーナルで取り上げられた、心理学に直接関係する最新ニュースです。テーマ別にまとめているので、今勉強中の分野や興味がある領域をピックアップして読んでみてください。  

---

## 1️⃣ 心理療法・メンタルヘルス

| 発表日 | タイトル(概略) | 主なポイント | 出典・リンク(※) |
|--------|------------------|--------------|-------------------|
| **2025‑03‑12** | **「AI‑チャットボットが臨床心理士の診断補助に」**(日経サイエンス) | - 米国の大手医療機関が、自然言語処理モデルを用いた「感情スクリーニング」ツールを臨床現場で試験開始。<br>- 精度は従来の自己報告式質問紙と同等、診断時間が **30 %短縮**。<br>- プライバシー保護のため、データはローカルで暗号化保存。 |

ちなみに、下記のように引数conversationをコメントアウトした状態で会話を入力してみます。

# conversationをコメントアウトして実行

user_input = "私の勉強していることに関するニュースを教えてください。"

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input=user_input,
    # セット済の会話IDを利用
    #conversation=conversation_id,
    max_output_tokens=500,
)

print(response.output_text)

当然、短期メモリを参照しないため、下記のように、「私が心理学を勉強している」というコンテキストから外れた応答が生成されます。

はい、かしこまりました!  
まず、どの分野やテーマについて勉強されているのか教えていただけますか?  

- 例:AI・機械学習、環境科学、経済学、歴史、文学、医学、プログラミング言語(Python など)  
- あるいは「〇〇に関する最新の研究動向」や「〇〇の業界ニュース」など、具体的に知りたい内容があればお知らせください。

いただいた情報をもとに、最新のニュースや注目すべきトピックをご紹介いたします。お待ちしています!

このように、過去の会話を同じIDでメモリに保持し、その情報を前提とした会話を継続するために短期メモリの仕組みが必要になります。

長期メモリの実装

同じくまずは clientの設定です。

from openai import OpenAI

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",
    api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)

次に長期メモリのIDを定義します。下記のmemory_subject_idがそれに相当します。
長期メモリはユーザーごとに識別子を持ち、個人設定や継続的な対話をセッション終了後、もしくは他のセッションからも利用できるようにするというユースケースでよく使われます。従って、下記のように"user_123"というようなIDを設定していますが、これは任意の文字列で何でも構いません。大抵の場合は、チャットボットアプリにログインするユーザーIDをここに代入することになります。

# 長期メモリのIDを定義
conversation1 = client.conversations.create(
    metadata={ "memory_subject_id": "user_123" },
)

print(conversation1)

下記のような長期メモリのIDがわりあてられます。

conv_ord_hea853fzzuk6i7ejrkto616753eetl5r75ymim5su3dm3sar

次に、下記のように"私は魚が好きです。夏に旬のお魚は何ですか?"という質問を入力してみます。その際、引数conversationに指定したIDで、長期メモリに入力文章が保存されます。

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input="私は魚が好きです。夏に旬のお魚は何ですか?",
    conversation=conversation1.id
)
print(response.output_text)

下記のような出力がえられました。当然この出力も指定した会話IDで長期メモリに保持されます。

### 日本の夏(6月〜8月)に旬を迎える代表的なお魚 ★

| 魚の名前 | 主な旬時期 | 特徴・おすすめの食べ方 | 主な産地・捕獲エリア |
|----------|------------|------------------------|----------------------|
| **アジ(鰺)** | 6月〜9月 | 脂がのってきて旨味が増す。*塩焼き*、*しめ鯵*、*フライ*が定番。 | 東北・関東・九州沿岸、特に静岡・三重 |
| **サバ(鯖)** | 6月〜9月 | 青魚の代表。*塩焼き*・*味噌煮*・*しらす干し*にすると◎。 | 太平洋側全域、特に新潟・福井・三重 |
| **イワシ(鰯)** | 6月〜9月 | 小骨が多いが栄養価が高い。*つみれ*、*かば焼き*、*酢締め*が人気。 | 北海道・東北・関東・北陸 |
| **カツオ(鰹)** | 7月〜9月 | 「初鰹」は6月中旬、夏の代表魚。*たたき*、*刺身*、*たくさん沸騰させた出汁*が最上。 | 鳥取・島根・和歌山・鹿児島 |

ここでノートブックのセッションを再起動します。(kernelの再起動)もしくは新たなノートブックを開いて、長期メモリを使った会話をしてみます。

ここまでと同じようにclientを定義します。

from openai import OpenAI

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",
    api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
)    

そして、セッションを再起動する前に定義した長期メモリの下記IDを指定し、"私が好きな食材を使った料理を提案してください。"と入力してみます。

conversation1.id="conv_ord_hea853fzzuk6i7ejrkto616753eetl5r75ymim5su3dm3sar"

response = client.responses.create(
    model="openai.gpt-oss-120b",
    input="私が好きな食材を使った料理を提案してください。",
    conversation=conversation1.id
)
print(response.output_text)

異なるセッションですが、長期メモリから「私が魚が好き」というコンテキストを参照し、下記のような応答テキストが生成されていることが分かります。

## あなたが好きな「魚」をメインにした、季節感たっぷりのおすすめレシピ 3選

以下は、**「魚が好き」**というあなたの嗜好に合わせて、夏でも食べやすいシンプルかつ本来の旨みを活かした料理です。調理時間・手間・材料の目安も併記しているので、気分や時間に合わせて選んでみてください。

---

### 1️⃣ 鯛(タイ)の柚子塩焼き  ― さっぱりした塩味と柚子の爽やかな香りがポイント
| 項目 | 内容 |
|------|------|
| **対象魚** | 鯛の切り身(200 g×1枚) |

このように、セッション内、およびセッション間で過去の会話をコンテキストとして参照するための仕組みがメモリということになります。

LLMが流行りだした当初は、このメモリ用のデータベースを自分で構築し、そのデータベースへの接続なども全てコーディングする必要がありました。(※その様子を説明した過去の記事がこちら。

PaaSの機能を利用することで、メモリ用のデータベースを自分で構築する必要がなければ、メンテナンスする必要もなく、コードも圧倒的に簡素化されていることがよくわかります。

ツール機能

AIエージェントにはツールを設定し、そのツールがLLMの外の世界と連携することでより便利なAIエージェントを開発することができるようになります。

image.png

アプリケーション開発者は様々なツールを開発する必要がありますが、よくある便利なツールは予めクラウド側に実装されていて、簡単なコードでそのツールを利用できる状況が理想的です。
そのようなニーズから、各クラウドベンダーは様々な事前定義済のツールを提供しています。

本記事ではOCI Generative AI Service(のEnterprise AI Agentsの機能)で提供されている下記4つのツールについてその概要と使い方をご紹介します。

image.png

  • MCP
  • Code Interpreter
  • File Search
  • NL2SQL

MCP Calling

冒頭、ツールとはLLMの外の世界と連携するためのものだと説明しました。その典型的なものがMCPツールです。AIエージェントはこのツールを使って、外の世界の様々なサービスから情報を得たり、また他のシステムを操作することができるようになります。

image.png

現在、サービス提供ベンダーにとってMCPはユーザーが開発するAIエージェントから自社のサービスを使ってもらうようにするために必要不可欠な存在となりました。インターネットではあらゆるサービス提供企業が自社サービス向けのMCPのサービスを提供しています。

※ MCPについて詳しく知りたい方はこちらの記事をご参照ください。

OCI Generative AI Serviceには事前定義済のMCP Clientのツールがありますので、このツールを使って、DeepWikiのMCPサーバーを操作するサンプルコードをご紹介します。

DeepWikiとは、ソフトウェア開発向けのAIドキュメント/ナレッジ共有ツールです。GitHubなどのコードや設計情報を解析し、仕様説明・コード理解・Q&Aを自然言語で支援するサービスとなり、現状APIキー不要の無償サービスです。開発者が「コードを読む時間」を減らし、チーム内の知識共有を効率化することを目的としています。

今回は事前にOCI Generative AI ServiceでOpneAI互換APIキーを発行し、そのキーを使ってLLMに対するClientを定義します。

from openai import OpenAI

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",
    api_key="sk-xxxxxxxxxxxxxxxxx",
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxxxxxxxxxxxx"
)

次にMCP Clientの定義を行います。
OCI Generative AIにはMCP Clientがツールとして事前に定義されていますから、下記のような非常にシンプルなコードでdeepwikiのMCPサーバーに接続し情報を取得することができます。
下記の例では、Oracleのリポジトリ (https://github.com/oracle) の説明を生成する処理を実行しています。

response = client.responses.create(
    model="xai.grok-4-1-fast-reasoning",
    tools=[
        {
            "type": "mcp",
            "server_label": "deepwiki",
            "server_description": "Use this to read and analyze GitHub repositories.",
            "server_url": "https://mcp.deepwiki.com/mcp",
            "require_approval": "never",
        },
    ],
    input="""
    https://github.com/oracle のリポジトリについて、
    概要と主な機能を説明してください。
    必要ならDeepWiki MCPを使って参照してください。
    """
)

print(response.output_text)

実行結果は以下の通り。

### Oracle GitHub 組織 (https://github.com/oracle) の概要

Oracle Corporation の公式 GitHub 組織で、主にオープンソースソフトウェアのプロジェクトをホストしています。データベース、クラウド、Java 関連技術を中心に、高性能な VM、マイクロサービスフレームワーク、分散システム、開発ツールなどを提供しています。組織には数百のリポジトリがあり、スター数上位の人気プロジェクトは **GraalVM**、**Helidon**、**Coherence Community Edition**、**Skara**、**OpenGrok** などが代表的です。これらはエンタープライズ向けのモダンな Java エコシステムを支えるものです。

DeepWiki MCP を使用して一部のリポジトリ構造を調査しましたが、すべてのリポジトリがインデックスされていないため(例: oracle/graal のみ詳細構造取得可能)、以下はツール結果と一般的な公開情報を基にした説明です。

### 主なリポジトリと機能

1. **GraalVM (oracle/graal)**  
   - **スター数**: 約 20k+ (人気 No.1)。  
   - **概要**: 高性能な多言語仮想マシン (VM)。Java だけでなく JavaScript、Python、Ruby などの言語をサポートし、JIT (Just-In-Time) コンパイラと AOT (Ahead-Of-Time) コンパイル (Native Image) で高速実行を実現。  
   - **主な機能** (DeepWiki 構造より):  

<中略>

5. **OpenGrok (oracle/opengrok)**  
   - **概要**: ソースコード検索・クロスリファレンスツール。  
   - **主な機能**: 全文検索、シンボル解析、履歴閲覧。Elasticsearch 統合で大規模リポジトリ対応。

### その他の注目プロジェクト
- **VirtualThreads** や **Project Loom** 関連 (Java 並行処理)。
- **OCI SDKs** (多言語 SDK で Oracle Cloud アクセス)。
- **Database Tools** (SQLcl、Liquibase 拡張)。

詳細は GitHub ページ (https://github.com/oracle) でリポジトリ一覧を確認してください。DeepWiki のインデックスが不足していたため、一部は公式ドキュメントに基づきます。追加質問があればお知らせください!

下記のようにresponseの全出力からMCPが実行されていることがわかります。

responseの全出力(長いので折り畳みます。)
print(respoinse)

Response(
    id='resp_ord_9l5iszpx5vedcdjrj6ebt4pj1xbihz9nzw1lm9823eiuow3s',
    created_at=1779514555.0,
    error=None,
    incomplete_details=None,
    instructions=None,
    metadata={
        'system_fingerprint': 'fp_a7082eb90c'
    },
    model='grok-4-1-fast-reasoning',
    object='response',
    output=[
        McpListTools(
            id='mcpl_a1403fd9d6314b86bcf5abd02d3be055',
            server_label='deepwiki',
            tools=[
                McpListToolsTool(
                    input_schema={
                        'type': 'object',
                        'properties': {
                            'repoName': {
                                'type': 'string'
                            }
                        },
                        'required': ['repoName']
                    },
                    name='read_wiki_structure',
                    annotations=None,
                    description=(
                        'Get a list of documentation topics for a GitHub repository.\n\n'
                        'Args:\n'
                        '    repoName: GitHub repository in owner/repo format '
                        '(e.g. "facebook/react")'
                    )
                ),

                McpListToolsTool(
                    input_schema={
                        'type': 'object',
                        'properties': {
                            'repoName': {
                                'type': 'string'
                            }
                        },
                        'required': ['repoName']
                    },
                    name='read_wiki_contents',
                    annotations=None,
                    description=(
                        'View documentation about a GitHub repository.\n\n'
                        'Args:\n'
                        '    repoName: GitHub repository in owner/repo format '
                        '(e.g. "facebook/react")'
                    )
                ),

                McpListToolsTool(
                    input_schema={
                        'type': 'object',
                        'properties': {
                            'repoName': {
                                'anyOf': [
                                    {'type': 'string'},
                                    {
                                        'items': {'type': 'string'},
                                        'type': 'array'
                                    }
                                ]
                            },
                            'question': {
                                'type': 'string'
                            }
                        },
                        'required': ['repoName', 'question']
                    },
                    name='ask_question',
                    annotations=None,
                    description=(
                        'Ask any question about a GitHub repository and get an '
                        'AI-powered, context-grounded response.\n\n'
                        'Args:\n'
                        '    repoName: GitHub repository or list of repositories '
                        '(max 10) in owner/repo format\n'
                        '    question: The question to ask about the repository'
                    )
                )
            ],
            type='mcp_list_tools',
            error=None
        ),

        ResponseReasoningItem(
            id='rs_712e8d62-bfe2-87e3-8d13-aff06b354627',
            summary=[],
            type='reasoning',
            content=None,
            encrypted_content=None,
            status='completed'
        ),

        McpCall(
            id='mcp_712e8d62-bfe2-87e3-8d13-aff06b354627_0',
            arguments=(
                '{"repoName":"oracle","question":"Oracle GitHub organization '
                '(https://github.com/oracle) のリポジトリの概要と主なリポジトリ、'
                '主な機能をまとめてください。人気のリポジトリや重要なプロジェクトを中心に。"}'
            ),
            name='ask_question',
            server_label='deepwiki',
            type='mcp_call',
            approval_request_id=None,
            error=None,
            output=(
                '"Invalid repoName format: \\"oracle\\". '
                'Expected format is \\"owner/repo\\", '
                'e.g. \\"facebook/react\\". '
                'For custom domains you must include the host, '
                'e.g., \\"git.mydomain.com/facebook/react\\"."'
            ),
            status='completed'
        ),

        ResponseReasoningItem(
            id='rs_ec6beffd-d989-77a4-ed20-9a831a92529a',
            summary=[],
            type='reasoning',
            content=None,
            encrypted_content=None,
            status='completed'
        ),

        ResponseOutputMessage(
            id='msg_ec6beffd-d989-77a4-ed20-9a831a92529a',
            content=[
                ResponseOutputText(
                    annotations=[],
                    text='''
### Oracle GitHub 組織 (https://github.com/oracle) の概要

Oracle Corporation が運営する GitHub 組織で、主に
**データベース、クラウドネイティブアプリケーション、
Java エコシステム、高性能仮想マシン、コンテナ技術**
などのオープンソースプロジェクトをホストしています。

2024年現在、**約1,000件以上のリポジトリ** を保有し、
**スター数上位のプロジェクトが数十万スター**
を集める人気組織です。

Oracle の商用製品
(Oracle Database, Oracle Cloud Infrastructure (OCI) など)
と連携したツールやサンプルが多く、
開発者コミュニティ向けに提供されています。

#### 主な特徴と目的

- **オープンソース戦略**
  Oracle のコア技術
  (DB, Java VM, マイクロサービスフレームワークなど)
  をオープンソース化し、コミュニティ貢献を促進。

- **対象領域**
  - **データベース関連**
    Oracle Database のサンプルデータ、
    クイックスタート、Docker イメージ。

  - **Java/VM**
    GraalVM などの革新的な JVM 実装。

  - **クラウド/コンテナ**
    OCI 互換ツール、
    Kubernetes オペレーター、
    Helidon フレームワーク。

  - **OS/インフラ**
    Oracle Linux 関連ツール。

- **アクティビティ**
  活発で、定期的なリリースとバグフィックス。
  企業ユーザー(金融、テレコムなど)向けの
  エンタープライズ級プロジェクトが多い。

- **スター/フォーク数**
  組織全体で数百万のスター。
  コントリビューターは数千人規模。

#### 主な人気リポジトリと機能
(スター数上位中心、2024年時点の参考値)

| リポジトリ | スター数 (約) | 主な機能・概要 |
|------------|---------------|----------------|
| oracle/graal | 20k+ | GraalVM と Graal コンパイラ。Java/Kotlin などのコードを高速ネイティブバイナリにコンパイル。 |
| oracle/helidon | 3k+ | OCI ネイティブの軽量 Java マイクロサービスフレームワーク。 |
| oracle/docker-images | 3k+ | Oracle 製品 (DB, WebLogic など) の公式 Docker イメージ。 |
| oracle/quickstart-db | 500+ | Oracle Database のクイックスタートテンプレート。 |
| oracle/db-sample-schemas | 400+ | Oracle DB のサンプルスキーマ (HR, OE など)。 |
| oracle/verrazzano | 300+ | OCI/Kubernetes 向けエンタープライズコンテナプラットフォーム。 |
| oracle/linux | 1k+ | Oracle Linux のソースとツール。 |
| oracle/opengrok | 2k+ | ソースコード検索エンジン。 |

#### 利用シーン

- **開発者**
  GraalVM で AOT コンパイル、
  Helidon でマイクロサービス構築。

- **DevOps**
  Docker/OCI イメージで DB 環境構築。

- **学習**
  DB サンプルで SQL/PLSQL を練習。

DeepWiki MCP ツールは
**個別リポジトリ (owner/repo 形式) 専用**
のため、組織全体のクエリでエラーが発生しました。

詳細が必要な特定リポジトリ
(例: oracle/graal)
を指定いただければ、
ツールでさらに深掘りします!

情報源:
GitHub 公開データと公式ドキュメント(2024年時点)。
最新は https://github.com/oracle を直接確認ください。
''',
                    type='output_text',
                    logprobs=[]
                )
            ],
            role='assistant',
            status='completed',
            type='message',
            phase=None
        )
    ],

    parallel_tool_calls=True,
    temperature=0.7,
    tool_choice='auto',

    tools=[
        Mcp(
            server_label='deepwiki',
            type='mcp',
            allowed_tools=None,
            authorization=None,
            connector_id=None,
            defer_loading=None,
            headers=None,
            require_approval='never',
            server_description='Use this to read and analyze GitHub repositories.',
            server_url='https://mcp.deepwiki.com/mcp'
        )
    ],

    top_p=0.95,
    background=False,
    completed_at=1779514559.0,
    conversation=None,
    max_output_tokens=None,
    max_tool_calls=None,
    previous_response_id=None,
    prompt=None,
    prompt_cache_key=None,
    prompt_cache_retention=None,

    reasoning=Reasoning(
        effort='medium',
        generate_summary=None,
        summary='detailed'
    ),

    safety_identifier=None,
    service_tier='default',
    status='completed',

    text=ResponseTextConfig(
        format=ResponseFormatText(type='text'),
        verbosity=None
    ),

    top_logprobs=0,
    truncation='disabled',

    usage=ResponseUsage(
        input_tokens=1340,
        input_tokens_details=InputTokensDetails(
            cached_tokens=608
        ),
        output_tokens=2537,
        output_tokens_details=OutputTokensDetails(
            reasoning_tokens=1567
        ),
        total_tokens=3877
    ),

    user=None,
    presence_penalty=0.0,
    frequency_penalty=0.0
)

このように様々なサイトでMCPサービスが提供されていおりますので参考までに、APIキー不要のその他のMCPサーバーを下記にご紹介します。

サービス 用途 APIキー URL
DeepWiki MCP GitHubリポジトリ理解 不要(公開repo) https://mcp.deepwiki.com/
GitMCP GitHubコード検索 不要 https://gitmcp.io/
Browserbase MCP ブラウザ自動操作 一部不要 https://www.browserbase.com/
Playwright Remote MCP ブラウザ制御 不要構成あり https://playwright.dev/
Fetch MCP Hosted Web取得 不要 https://github.com/modelcontextprotocol/servers/tree/main/src/fetch
Sequential Thinking Remote 推論補助 不要 https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking
Memory MCP Hosted 会話メモリ 不要構成あり https://github.com/modelcontextprotocol/servers/tree/main/src/memory
Puppeteer Remote MCP Chrome操作 不要 https://pptr.dev/
Firecrawl MCP Webクロール 無料枠あり https://www.firecrawl.dev/
Context7 MCP ライブラリDocs検索 不要寄り https://context7.com/

Code Interpreter

Code Interpreterとは、エージェント実行環境と分離したサンドボックス環境(コンテナ)で様々な処理を行うツールです。 主に、数学処理、データ分析、データのクレンジング処理、チャート表の作成など、様々な用途に利用します。

image.png

ツールでコンテナの作成から上記のような様々なデータ処理までを一括して実行することができます。このコンテナ内のPython環境には、Pandas、Matplotlib、SciPyなどの420以上のプリインストールされたライブラリが含まれているため、多くの一般的なタスクは追加の設定なしで機能します。また、これらの処理はAIエージェント経由で実行されますので、アプリケーションとしては、自然言語でデータ処理の指示を行うということになります。

例えば、上図の例では、CSVファイルのデータ分析をAIエージェントに指示しています。これを受けてAIエージェントがCode Interpreterツールを実行し、このツールがコンテナの起動、CSVファイルのアップロード、データ分析の実行を担当します。得られた結果はエージェント経由でユーザーに返されるという流れです。

上記を実装するにあたり、OCI Generative AI Serviceで実装済みのCode Interpreterツールと、コンテナ管理の機能を利用します。

image.png

以下が実装の流れです。
まず、Clientを定義します。

from openai import OpenAI

client = OpenAI(
    base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1",
    api_key="sk-xxxxxxxxxxxxxxxxx",
    project="ocid1.generativeaiproject.oc1.us-chicago-1.xxxxxxxxxxxxxxxxxx"
)

次にContainer APIを使って、コンテナを作成します。コンテナのメモリサイズやレプリカ数を指定することができます。このコンテナは非アクティブな状態が20分続くと自動的に削除されますので一時的な作業領域としての利用が前提です。

container = client.containers.create(name="test-container", memory_limit="4g")
container_id = container.id
print(container_id)

コンテナが作成されると、下記のようなIDが付与されます。

cntr-ord-mj6afthf8teu4bp9cr68wvo68gka8nbyb5pqykif8ezi2kti

このコンテナにデータファイルファイルをアップロードします。

# create container file
container_file = client.containers.files.create(
    container_id=container_id,
    file=open("boston_house_prices.csv", "rb"),
)
file_id = container_file.id
print(file_id)

こちらも同じようにファイルに対してIDが付与されます。

cfile-ord-k360k2pn1v4aem17ugwo66q0svc5pp38pg4nteq6i29wslq4

ファイルを削除したい場合は下記のようにコンテナとファイルのIDを指定しコードを実行します。

# delete container file
client.containers.files.delete(
    file_id=file_id,
    container_id=container_id,
)

準備ができましたので、データ分析の指示文を入力します。
toolにcode_interpreterとコンテナIDを指定し、inputにデータ分析用のプロンプトを渡すことで、コンテナ内でデータ処理が実行されます。GenAI Serviceではconde_interpreterのツールが事前実装済ですから、typeにcode_interpreterと指定するだけという点がポイントです。

response = client.responses.create(
    model="xai.grok-code-fast-1",
    tools=[{
        "type": "code_interpreter",
        "container": container.id,
    }],
    tool_choice="required",
    input="""
    boston_house_prices.csv を pandas で読み込み、
    全ての数値列間の相関係数を計算して表示してください。
    更に、目的変数MEDVと相関係数の絶対値が0.6以上の説明変数をリストしてください。
    """
)

print(response.output_text)

実行結果としては下記の通り、プロンプトの内容が全て処理されたことがわかります。

### Boston House Prices データセットの分析結果

以下の手順でデータを処理しました:
1. `boston_house_prices.csv` を pandas で読み込みました。
2. 全ての数値列間の相関係数行列を計算し、表示します。
3. 目的変数 `MEDV` と相関係数の絶対値が 0.6 以上の説明変数をリストします。

#### 相関係数行列
全ての数値列間のピアソンの相関係数行列は以下の通りです(小数点以下3桁で表示):


             CRIM        ZN     INDUS      CHAS       NOX        RM       AGE       DIS       RAD       TAX   PTRATIO         B     LSTAT      MEDV
CRIM     1.000000 -0.200469  0.406583 -0.055892  0.420972 -0.219247  0.352734 -0.379670  0.625505  0.582764  0.289946 -0.385064  0.455621 -0.388305
ZN      -0.200469  1.000000 -0.533828 -0.042697 -0.516604  0.311991 -0.569537  0.664408 -0.311948 -0.314563 -0.391679  0.175520 -0.412995  0.360445
INDUS    0.406583 -0.533828  1.000000  0.062938  0.763651 -0.391676  0.644779 -0.708027  0.595129  0.720760  0.383248 -0.356977  0.603800 -0.483725
CHAS    -0.055892 -0.042697  0.062938  1.000000  0.091203  0.091251  0.086518 -0.099176 -0.007368 -0.035587 -0.121515  0.048788 -0.053929  0.175260
NOX      0.420972 -0.516604  0.763651  0.091203  1.000000 -0.302188  0.731470 -0.769230  0.611441  0.668023  0.188933 -0.380051  0.590879 -0.427321
RM      -0.219247  0.311991 -0.391676  0.091251 -0.302188  1.000000 -0.240265  0.205246 -0.209847 -0.292048 -0.355501  0.128069 -0.613808  0.695360
AGE      0.352734 -0.569537  0.644779  0.086518  0.731470 -0.240265  1.000000 -0.747881  0.456022  0.506456  0.261515 -0.273534  0.602339 -0.376955
DIS     -0.379670  0.664408 -0.708027 -0.099176 -0.769230  0.205246 -0.747881  1.000000 -0.494588 -0.534432 -0.232471  0.291512 -0.496996  0.249929
RAD      0.625505 -0.311948  0.595129 -0.007368  0.611441 -0.209847  0.456022 -0.494588  1.000000  0.910228  0.464741 -0.444413  0.488676 -0.381626
TAX      0.582764 -0.314563  0.720760 -0.035587  0.668023 -0.292048  0.506456 -0.534432  0.910228  1.000000  0.460853 -0.441808  0.543993 -0.468536
PTRATIO  0.289946 -0.391679  0.383248 -0.121515  0.188933 -0.355501  0.261515 -0.232471  0.464741  0.460853  1.000000 -0.177383  0.374044 -0.507787
B       -0.385064  0.175520 -0.356977  0.048788 -0.380051  0.128069 -0.273534  0.291512 -0.444413 -0.441808 -0.177383  1.000000 -0.366087  0.333461
LSTAT    0.455621 -0.412995  0.603800 -0.053929  0.590879 -0.613808  0.602339 -0.496996  0.488676  0.543993  0.374044 -0.366087  1.000000 -0.737663
MEDV    -0.388305  0.360445 -0.483725  0.175260 -0.427321  0.695360 -0.376955  0.249929 -0.381626 -0.468536 -0.507787  0.333461 -0.737663  1.000000


#### MEDV と相関係数の絶対値が 0.6 以上の説明変数
`MEDV` と相関係数の絶対値が 0.6 以上の変数は以下の通りです:
- RM (相関係数: 0.695360)
- LSTAT (相関係数: -0.737663)

これらの変数は `MEDV`(住宅価格の中央値)との強い正または負の相関を示しています。RM は正の相関(部屋数が多くなると価格が上がる傾向)、LSTAT は負の相関(低所得者人口の割合が高くなると価格が下がる傾向)です。

処理完了後にコンテナを削除する場合は下記のようにコンテナIDを指定して削除します。

# delete container
client.containers.delete(
    container_id,
)

File Search

OCI Generative AI Serviceにはフルマネージドのベクトルストアがあります。このベクトルストアは同サービスのコンソールやAPIで簡単に構築することができます。更にセマンティック検索(ベクトル検索)を実行するツールである File Searchツールが事前に定義されており、このFile Searchツールとベクトルストアを併用することで、簡単に、かつフルマネージドのRAGを構成することができます。

image.png

下図のような構成となり、ベクトルストアにロードしたドキュメントデータに関する質問に答えられるチャットボットの開発などに利用されます。

※「RAG」や「セマンティック検索」とは何ですか?という方はこちらの記事をご参照ください。

image.png

例えば上図は、社内ドキュメントをベクトルストアにロードし、事前定義済のツール file searchを定義したエージェントにユーザーが社内規定について質問しそれに応答できるようなチャットボットのアプリです。

具体的な実装についてはこちらの記事をご参照ください。

NL2SQL

NL2SQLとはNatural Language to SQLの略称となり、自然言語で書かれた質問をSQL文に自動変換するツールです。

image.png

例えば「先月の売上トップ10を表示して」と入力すると、AIがその文章を以下のようなSQLに変換し、データベースから結果を取得します。

SELECT *
FROM sales
ORDER BY amount DESC
LIMIT 10;

生成AIや大規模言語モデル(LLM)の進化により精度が向上しており、SQL知識がないユーザーでもRDBのデータ分析を行えるようにするアプリを開発する際にこのツールを利用します。

また、ベクトルストアに、RDBのスキーマ情報(テーブル構造)をメタデータとして保持し、SQL変換時にその情報を参照することにより、LLMのハルシネーションに起因するSQLの誤生成を抑止することが可能です。

このベクトルストアは上述のFile Searchツールの章でご紹介したフルマネージドのベクトルストアとなり、外部のRDB(例えば、Oracle CloudのAutonomous Database)からそのスキーマ情報をここに抽出し保持します。

以上です。

8
4
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
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?