※ 本記事は、Mark Hornickによる”Build Natural-Language and Agentic Database Apps in Java with Oracle Select AI“を翻訳したものです。
2026年11月8日
Java向けSDKを使い、自然言語によるデータ操作、RAG、データベースで管理するAIエージェントのワークフローを、Javaアプリケーションに組み込む
SpringのサービスやJakarta EEアプリケーション、大量の要求を処理するAPI、バッチ処理、データ集約型システムなど、世界中の多くの企業向けアプリケーションでJavaが使われています。こうしたアプリケーションでは、組織にとって特に価値の高いデータを扱うことがよくあります。ところが、生成AIを組み込むには、データベースドライバー、プロバイダーのSDK、プロンプトの処理を取りまとめる仕組み、ベクトルストア、認証情報、会話の状態などを、個別に組み合わせなければならないことがあります。さらに最近では、AIエージェントと、そのツールの動作を調整する実行環境も必要になってきています。
Oracle Select AI for Javaを使うと、Javaに自然なプログラミングモデルでOracle Select AIの機能を扱えるため、こうした作業を簡素化できます。
このSDKには、厳密に型付けされたJavaインターフェース、リクエストや設定を表すモデル、リソースの作成から削除までを管理するAPI、JDBCベースの接続管理、実行可能なサンプルを用意しています。Javaから、自然言語でデータベースの内容を質問する、SQLを生成して実行する、大規模言語モデルとチャットする、といった操作を行えます。検索拡張生成(RAG)で企業内文書を根拠とした回答を得るほか、合成データの生成、コンテンツの要約や翻訳、会話の文脈の保持も可能です。
機能の拡充によって、企業向けJavaアプリケーションの開発チームができることも広がります。自然言語からのSQL生成やRAGを使う同じアプリケーションから、エージェントのワークフローも呼び出せるようになりました。データベース内で定義したツールの利用、専門の異なるエージェントの連携、エージェントチームの状態管理、アプリケーションへのリクエストをまたぐ会話の再開、一元管理された共有チームの実行を行えます。データベース側では、Oracle Select AIと適用されるデータベースの制御を通じて、リソースの検証、認可、ワークフローの処理、AIプロバイダーとの通信のうち、対応する機能を管理します。

Oracle Select AI for Javaの主な機能
Oracle Select AI for Javaでは、Java APIを通じて、次のような幅広い機能を利用できます。
- AIプロバイダーとモデルの選択:対応するプロバイダーとモデルに合わせてAIプロファイルを設定します。プライベートエンドポイントやOpenAI互換APIも利用できます。
- 自然言語からのSQL生成:自然言語のプロンプトからSQLを生成し、内容の確認、説明の取得、データベースでの実行、実行結果を自然言語で説明した回答の取得を行えます。生成されたSQLについて、プロファイルごとにフィードバックを渡し、その後の自然言語からSQLへの変換(NL2SQL)の手掛かりにすることもできます。
- チャット:LLMを使い、コンテンツ生成、質問への回答、推奨、コード生成など、対話型の機能を実現できます。
- 検索拡張生成:Oracle AI Vector SearchとOracle Select AIのベクトル索引を使い、企業内のコンテンツを根拠とした回答を得られます。
- 文脈を引き継ぐ会話:プロンプトの履歴を保存し、前のやり取りを踏まえた追加質問ができます。
- AI Agent Framework:エージェント、タスク、ツール、チームを作成、読み込み、一覧表示、有効化、無効化、削除できます。ツールの定義の取得と実行、チームの実行、チームの状態管理、チーム定義のインポートとエクスポートも可能です。導入と管理を容易にするため、ほかのユーザーに自分のエージェントチームへのアクセス権限を付与できます。
- 合成データの生成:開発やテストのために、1つ以上のデータベーステーブル向けに、実際のデータに近い合成データを生成できます。
- 要約と翻訳:直接渡したコンテンツや外部に保存したコンテンツを要約し、AIプロファイルに設定したプロバイダーを通じてテキストを翻訳できます。
- Javaの仕組みに沿った接続管理:接続プールを使うアプリケーションでは、アプリケーションで管理するDataSourceを利用できます。また、DbConnectionConfigを使い、SDKにJDBC接続の管理を任せることもできます。
Javaからデータベースに質問する
Oracle Select AIのプロファイルで、プロンプトの処理方法を設定します。AIプロバイダーとモデル、認証情報、対象にするデータベースオブジェクトの範囲、その他のリクエストに影響する設定を指定できます。プロファイルは、Javaからでも、Oracle Select AIのほかのインターフェースからでも作成できます。Javaアプリケーションでは、接続するデータベースユーザーから参照できるプロファイルを開いて利用できます。
プロファイルを利用できるようになれば、Javaアプリケーションから通常のメソッド呼び出しで、SQLの生成、実行、説明の取得や、実行結果の自然言語での説明を行えます。
import com.oracle.database.selectai.Profile;
import com.oracle.database.selectai.SelectAI;
import com.oracle.database.selectai.model.DbConnectionConfig;
import com.oracle.database.selectai.model.SelectAIException;
public final class SelectAIExample {
public static void main(String[] args) throws SelectAIException {
DbConnectionConfig config = DbConnectionConfig.builder()
.dbUser(System.getenv("SELECTAI_DB_USER"))
.dbPassword(System.getenv("SELECTAI_DB_PASSWORD"))
.jdbcUrl(System.getenv("SELECTAI_JDBC_URL"))
.build();
try (SelectAI selectAI = SelectAI.create(config)) {
Profile profile =
selectAI.profile(System.getenv("SELECTAI_PROFILE_NAME"));
String prompt = "How many customers placed an order this month?";
System.out.println("Generated SQL: " + profile.showsql(prompt));
System.out.println("SQL explanation: " + profile.explainsql(prompt));
System.out.println("Query result: " + profile.runsql(prompt));
System.out.println("Narrated response: " + profile.narrate(prompt));
}
}
}
(訳注:”How many customers placed an order this month?” 「今月注文した顧客は何人ですか?」)
メソッド名はOracle Select AIのアクションに対応しているため、すでにそのプログラミングモデルに馴染みのある開発者にも理解しやすくなっています。共通の呼び出し口を1つとして使いたい場合は、generateにGenerateActionを渡します。showsql、runsql、explainsql、narrate、chat、summarize、translate、embeddingなどを指定できます。
アプリケーション側で、プロンプトテンプレート、プロバイダー固有のHTTP呼び出し、SQL生成の一連の処理を、自前で実装する必要はありません。Oracle Select AIでスキーマの情報を補い、設定したモデルを呼び出し、プロファイルとデータベースの権限に従って、生成結果に基づくデータベース操作を実行します。利用者がSQLを書かず、自然言語で質問したいアプリケーションでは、開発の生産性と利用者の使い勝手の改善につながります。
型を持つJavaオブジェクトでAIプロファイルを設定する
Oracle Select AI for Javaには、プロファイルとプロバイダーを表す、型を持ったクラスを用意しています。プロバイダー固有の設定を利用できるようにしながら、設定のための定型コードを減らせます。たとえば、OCI Generative AIのプロファイルでは、ビルダーパターンのJavaオブジェクトを使い、モデル、リージョン、認証情報、データベースオブジェクトの対象範囲を定義できます。
ProviderProfile providerProfile =
ProviderProfile.OCIGenAIProviderProfile.builder()
.model(System.getenv("SELECTAI_MODEL"))
.region("us-chicago-1")
.ociApiFormat("GENERIC")
.build();
ProfileAttributes profileAttributes = ProfileAttributes.builder()
.credentialName(System.getenv("SELECTAI_CREDENTIAL_NAME"))
.providerProfile(providerProfile)
.objectList("[{\"owner\":\"SH\"}]")
.objectListMode(ObjectListMode.AUTOMATED.getValue())
.enforceObjectList(true)
.build();
Profile profile = selectAI.profile(
"sales_profile",
profileAttributes,
"Sales profile for NL2SQL queries",
ProfileStatus.ENABLED);
profile.create();
このほかにも、追加の指示、コメント、制約、temperature、トークン数の上限、会話の動作、プロバイダーのエンドポイント、埋め込みモデル、ベクトル索引名を、SDKからプロファイルに設定できます。showpromptメソッドでは、Oracle Select AIが設定済みのプロバイダーに送る、補足情報を追加したプロンプトを取得できます。メタデータやプロファイルの設定が、AIへのリクエストにどう反映されるかを理解したいときに役立ちます。
RAGで信頼できる資料を回答の根拠に加える
多くのアプリケーションでは、リレーショナル表に保存されていない情報も使って、質問に答える必要があります。製品ドキュメント、運用手順、サポート記事、社内ポリシーなどが、その例です。Oracle Select AI for Javaでは、Oracle AI Vector SearchとOracle Select AIのベクトル索引を使い、RAGを実装できます。
Javaアプリケーションから、対応する文書の情報源を対象にベクトル索引を作成・管理し、その索引をRAG用プロファイルに関連付けて、根拠資料に基づく回答を要求できます。Oracle Select AIに検索を任せ、関連する内容をモデルへのリクエストに追加し、生成された回答を受け取れます。そのため、アプリケーション側では、利用者向けの機能や使い勝手に集中できます。
VectorIndexAttributes attributes = VectorIndexAttributes.builder()
.location(System.getenv("SELECTAI_DOCUMENT_LOCATION"))
.objectStorageCredentialName(
System.getenv("SELECTAI_OBJECT_STORAGE_CREDENTIAL"))
.profileName("embedding_profile")
.vectorDbProvider("oracle")
.enableSources(true)
.build();
VectorIndexConfig config = VectorIndexConfig.builder("support_index")
.description("Support documentation vector index")
.vectorIndexAttributes(attributes)
.waitForCompletion(true)
.build();
VectorIndex vectorIndex = selectAI.vectorIndex(config);
vectorIndex.create();
Profile ragProfile = selectAI.profile("support_rag_profile");
String response = ragProfile.generate(
"What is the escalation procedure for a failed deployment?",
GenerateAction.narrate);
(訳注:”What is the escalation procedure for a failed deployment?” 「デプロイに失敗した場合のエスカレーション手順は何ですか?」)
enableSourcesを設定すると、検索結果に情報源の情報を追加でき、生成した回答が何に基づいているかを、アプリケーションから追跡しやすくなります。
前のやり取りを引き継ぐ会話を作る
Oracle Select AIの会話機能では、チャットの文脈を保存し、後のプロンプトから、それ以前のやり取りを参照できます。Javaアプリケーションから、タイトル、説明、保持期間、文脈の長さを設定して会話を作成し、その情報を使って複数ターンの対話を行えます。
Conversation conversation = selectAI.conversation(
ConversationAttributes.builder()
.title("Support conversation")
.description("Deployment support discussion")
.conversationLength(10)
.retentionDays(30)
.build());
conversation.create();
try (Session session = profile.chatSession(conversation, true)) {
System.out.println(session.chat(
"What should I check after a deployment failure?"));
System.out.println(session.chat(
"Which of those checks applies to the database connection?"));
}
エージェントのワークフローでは、会話の識別子をもう1つの目的にも使います。アプリケーションへの別々のリクエストや、プール内の異なるJDBC接続をまたいで、データベースで管理する文脈を保持し、チームのワークフローを再開するためです。
JavaからAIエージェントのワークフローを作る
バージョン1.1.0では、Oracle Select AI Agent Framework向けの、専用のJava呼び出し口を追加しました。SelectAIAgentクライアントでは、データベース内に定義するAgent、Task、Tool、Teamの各リソースを扱います。これらは、データベースで管理するリソースをJavaで表したものであり、独立したJavaのエージェント実行環境ではありません。
この構成では、エージェントのリソースと関連するアクセス制御を、データベースを中心に管理できます。JavaアプリケーションからOracle AI Databaseへの通信には、JDBCを使います。データベース側で、リソースの定義と権限を検証し、チームのワークフローと状態を管理し、設定したツールを実行して、必要に応じてAIプロバイダーと通信します。Javaアプリケーションでは、処理の調整機構を作り直す代わりに、アプリケーションのロジックや利用者向けの機能に集中できます。
少数のJava呼び出しでエージェントチームを実行する
販売実績を調べるためのエージェントチームを、すでにデータベース内に用意している販売アプリケーションを考えます。あるエージェントで必要なデータを取得し、別のエージェントで結果を解釈して回答を作る、といった構成です。Javaからは、SDKのほかの機能と同じ接続方法で、このチームを読み込んで実行できます。
import com.oracle.database.selectai.agent.SelectAIAgent;
import com.oracle.database.selectai.agent.Team;
import com.oracle.database.selectai.model.DbConnectionConfig;
import com.oracle.database.selectai.model.agent.RunTeamRequest;
DbConnectionConfig config = DbConnectionConfig.builder()
.dbUser(System.getenv("SELECTAI_DB_USER"))
.dbPassword(System.getenv("SELECTAI_DB_PASSWORD"))
.jdbcUrl(System.getenv("SELECTAI_JDBC_URL"))
.build();
try (SelectAIAgent agentClient = SelectAIAgent.create(config)) {
Team team = agentClient.team("SALES_INSIGHT_TEAM");
String result = team.run(
RunTeamRequest.builder()
.userPrompt(
"Which products have the largest quarter-over-quarter " +
"revenue decline, and what should we investigate?")
.conversationId(conversationId)
.build())
.getRawValue();
System.out.println(result);
}
(訳注:”Which products have the largest quarter-over-quarter revenue decline, and what should we investigate?” 「前四半期と比べて売上高の減少が最も大きい製品はどれですか。また、何を調査すべきですか?」)
チーム、その参加エージェント、タスク、ツール、AIプロファイル、権限は、引き続きデータベース内で定義・管理します。Team.runと関連APIでは、データベースで生成した応答をJSON文字列として返します。これにより、アプリケーションからは一定のインターフェースで結果を受け取り、ワークフローの管理はデータベース側に任せられます。
エージェント、タスク、ツール、チームをJavaのリソースとして管理する
エージェントAPIでも、SDKのほかの機能と同じ、リソースを中心に操作するモデルを使います。Javaアプリケーションから、エージェント、タスク、ツール、チームを作成または読み込み、属性や状態を確認し、有効化・無効化、対応する属性の更新、不要になったリソースの削除を行えます。listAgents()、listTasks()、listTools()、listTeams()では、接続しているデータベースユーザーが所有するリソースを一覧表示します。そのユーザーやロールに利用権限が付与された共有チームも含め、利用可能なチームを調べるには、listAvailableTeams()を使います。この検出用APIでは、変更可能なTeamリソースへのハンドルではなく、読み取り専用のAvailableTeamオブジェクトを返します。
ツールも、ほかのリソースと同じように直接操作できます。Javaアプリケーションから、データベース内で定義したツールの説明を取得し、定義や入力メタデータを調べたり、JSONデータを渡して直接実行したりできます。チームについても、説明の取得、実行、状態の問い合わせができ、アプリケーションや人間からの入力を待っているワークフローの状態を更新できます。Oracle Select AI Agent Frameworkで定義したツールは、Autonomous AI Database MCP Serverを使って、MCPツールとして公開することもできます。
Webリクエストや接続プールをまたいで、チームの処理を再開する
企業向けJavaアプリケーションでは、接続プールを使うことが一般的です。そのため、同じ業務上の会話に属する2つのリクエストでも、別々の物理データベース接続で実行される場合があります。Oracle Select AI Agent Frameworkでは、データベースで作成する会話識別子を使って、この構成に対応します。チームの処理を再開するときに同じ会話識別子を指定すれば、別のリクエストからでも、データベース内のワークフローを継続できます。
try (SelectAIAgent agentClient = SelectAIAgent.create(dataSource)) {
String result = agentClient.runTeam(
"AI_OWNER.SALES_INSIGHT_TEAM",
RunTeamRequest.builder()
.userPrompt("Now focus on the western region.")
.conversationId(conversationId)
.build()).getRawValue(); }
この仕組みは、Spring、Jakarta EE、アプリケーションサーバー、ステートレスなサービス構成で、特に役立ちます。DataSourceモードでは、SDKの操作ごとにJDBC接続を借り出し、処理が完了したら返却します。チームの文脈は、会話識別子によって、データベース内に保持します。
一元管理された共有チームを再利用する
あるデータベースユーザーがチームを所有して保守し、別のユーザーに利用を許可できます。必要なチームへのアクセス権限をデータベース側で付与した後、Javaアプリケーションから、AI_OWNER.SALES_INSIGHT_TEAMのような所有者名付きの名前を使って共有チームを実行できます。
これにより、企業内で次のような分担ができます。中央の管理チームで、再利用可能なエージェントのワークフローを定義・管理・更新し、アプリケーションのスキーマからは、その定義を所有せずにエージェントチームを呼び出します。データベースによる認可は、引き続き適用されます。共有チームを利用する権限を得ても、そのチームが必要とするすべてのカスタム関数、データベースオブジェクト、認証情報、外部リソースへのアクセス権限まで、自動的に得られるわけではありません。
チーム定義を環境間で移し、再利用する
Java SDKでは、正式に管理されている定義を取得し、チームのインポートとエクスポートを行えます。そのため、チームと関連する定義を、環境間での移行やデプロイの手順に組み込めます。定義をインポートしたり、利用したりするときの、意味的な妥当性の検証と認可は、引き続きデータベース側で行います。
既存のJavaアプリケーション構成に合わせて使う
Oracle Select AI for Javaは、独立したクライアント側の実行モデルを持ち込むのではなく、既存のJavaアプリケーションの構成に合わせて使えるように設計されています。
アプリケーションで管理する接続プールにはDataSourceを使う
Spring、Jakarta EE、アプリケーションサーバー、マルチスレッドのサービスでは、既存のDataSourceをSDKに渡してください。DataSource自体はアプリケーションで管理します。SDKでは、操作ごとに接続を借り出し、処理が完了したら、その操作用の接続を閉じます。接続プールを使っている場合、通常は、閉じることで接続をプールに返却します。
try (SelectAI selectAI = SelectAI.create(dataSource)) {
Profile profile = selectAI.profile("sales_profile");
System.out.println(profile.chat("Summarize our sales performance."));
}
try (SelectAIAgent agentClient = SelectAIAgent.create(dataSource)) {
System.out.println(agentClient.listTeams());
}
互いに独立した操作を並行実行する場合は、DataSourceモードを推奨します。長時間実行するエージェントチームでは、操作から結果が返るまで、借り出したJDBC接続を保持する場合があります。エージェントの処理時間を考慮して、接続プールの規模とステートメントのタイムアウトを設定してください。
単純なプログラムではJDBC接続の管理をSDKに任せる
コマンドラインツール、サンプル、比較的単純なサービスでは、DbConnectionConfigを使い、SDKにJDBC接続の作成と管理を任せられます。クライアントを閉じるまで、その接続を再利用します。アプリケーション側でSDKへのアクセスを直列化しない限り、このモードは原則としてシングルスレッドで扱うべきです。
JDBCクエリのタイムアウトを意図して設定する
SelectAIOptionsを使うと、SDKレベルのJDBCクエリタイムアウトをステートメントに適用できます。デフォルトでは、SDKからこのタイムアウトを設定しません。JDBCステートメントのタイムアウトと、AIプロバイダーのエンドポイントのタイムアウトは、必ずしも同じものではありません。また、タイムアウトが発生しても、データベースやプロバイダーのサーバー側の処理が停止したとは限りません。状態を変更するエージェントやチームの操作では、タイムアウト後に、結果を確認せず再試行することを避けるべきです。
セキュリティと管理は引き続きデータベースを中心に行う
Java SDKの操作には、対象のOracle AI Databaseの認可モデルが適用されます。操作は、接続したデータベースユーザーの権限で実行します。AIプロファイル、エージェントのリソース、ツール、チームへのアクセス、参照するデータベースオブジェクト、認証情報、ネットワークリソースも、引き続きデータベースのセキュリティ制御に従います。
通常のアプリケーション実行には、必要最小限の権限を持つデータベースユーザーを使ってください。パッケージの権限付与、ネットワークアクセスの変更、認証情報の管理、共有チームへのアクセス管理などは、管理されたセットアップ手順の中で行います。Oracle Select AI for Javaでは、明示的に許可された管理操作向けに、別のDatabaseAdmin APIを用意しています。共有チームへのアクセスは、チームの所有者が、SelectAIAgent.grantTeamAccess()とSelectAIAgent.revokeTeamAccess()、またはTeam.grantAccess()とTeam.revokeAccess()を使って管理します。これらは所有者の権限範囲で行う操作であり、それ自体にDBA権限が必要なわけではありません。DatabaseAdminから提供する操作でもありません。
SDKでは、パスワード、秘密鍵、アクセストークン、認証情報のシークレット、プロンプト、生成された応答、エージェントの定義全体、ツールへの入力、チームの実行時の値といった機密情報を、意図的にログ出力しないよう設計しています。ただし、アプリケーション独自のログ、保持期間、機密部分のマスキング、監視、アラートの方針は、引き続きアプリケーションの管理者が設定します。
独自のエージェントツールにも、データベースの権限が必要です。チームを使う権限を付与しただけでは、カスタム関数や、その関数が使うデータベースオブジェクトへのアクセスは許可されません。この役割分担によって、企業向けデータベースアプリケーションですでに使っている、最小権限の考え方を維持できます。
利用を始める
Oracle Select AI for Javaには、JDK 17以降が必要です。プロジェクトのビルドには、Maven 3.8以降を推奨します。SDKではOracle JDBC Thin Driverを使い、Javaの標準的な依存関係と接続管理の方法に従います。
ソースコードは、Oracle Select AI for JavaのGitHubリポジトリで公開しています。Mavenを使い、ローカル環境でSDKをビルドしてインストールしてください。
git clone https://github.com/oracle/java-select-ai.git
cd java-select-ai
mvn clean install
バージョン1.1.0では、公開エージェントパッケージとして、com.oracle.database.selectai.agentとcom.oracle.database.selectai.model.agentを追加しました。com.oracle.database.selectai.implやcom.oracle.database.selectai.impl.agent配下の実装クラスには依存せず、公開パッケージのインターフェースとファクトリーメソッドを使ってください。
エージェント機能を使うには、対応するOracle Select AI Agent Frameworkの機能を提供する、Oracle AI Databaseのリリースが必要です。リポジトリには、Oracle Select AIの基本機能に加え、エージェント、タスク、ツール、チーム、共有チーム、状態管理、インポート、エクスポート、後片付けの一連の操作を試せる、実行可能なサンプルを用意しています。
オープンソースとして利用する
Oracle Select AI for Javaは、Universal Permissive License, Version 1.0の下で、オープンソースソフトウェアとして提供しています。Oracleでは、Oracle Contributor AgreementとプロジェクトのGitHubリポジトリを通じた貢献を歓迎しています。
Oracle Select AI for Javaで開発を始める
Java開発者は、企業向けアプリケーションのコードから、自然言語によるデータ操作、RAG、データベースで管理するエージェントのワークフローを、直接利用できるようになりました。使い慣れたJavaの構成を維持しながら、AIプロファイルの設定、データアクセス、検索、会話の文脈、エージェントの定義、ツール、チームのワークフローを、データと、そのデータをすでに保護しているデータベースのセキュリティモデルに近い場所で扱えます。
既存のJavaアプリケーションを刷新する開発チームは、まずNL2SQLやRAGなど、目的を絞った機能から導入し、使い慣れた構成を維持したまま、エージェントが処理を進めるワークフローへと拡張できます。その結果、アーキテクチャの変更を抑えられる可能性があります。Java側のプログラミングモデルにはOracle Select AI for Javaを使い、その背後で動くデータベース内のAI機能には、Oracle Select AIとOracle Select AI Agent Frameworkを使います。
