Oracle Database Vector Store Connector for Semantic Kernelの発表 (2025/09/04)
Oracle Database Vector Store Connector for Semantic Kernelの発表 (2025/09/04)
投稿者:Alex Keh

Oracle .NETチームは、Oracle Database Vector Store Connector for Semantic Kernel (.NET)のリリースを発表いたします。プレビュー版コネクタ(Oracle.VectorData)は、.NETベクター、Microsoft Semantic Kernel、Oracle Databaseを使用してAIアプリを構築する開発者向けにNuGet Galleryから入手可能です。
セマンティック・カーネルと同様に、Oracle Databaseはエンタープライズグレードのソリューション向けに構築されています。Oracle AI Vector Searchにより、開発者は機能、セキュリティ、データ一貫性の制限のない堅牢なデータベースを使用して、AIを活用した類似検索を.NETデータに適用できます。アプリケーションは、構造化データと非構造化データの両方を、セマンティクス(意味)と完全一致で検索できるため、より高度なAIソリューションを実現できます。
ネイティブのOracle AI Vector Searchは、任意の数の大規模言語モデル(LLM)に対応しています。LLMとOracle AI Vector Searchを組み合わせることで、アプリケーションは検索拡張生成(RAG)とビジネスデータを活用し、より正確で文脈に即した結果を提供できます。
Oracle コネクタは、データベースのデータ、ベクター データ、ベクター インデックスを使用して、これらすべての機能を .NET ベクターとセマンティック カーネルが提供するサービスに提供します。
これらの取り組みに協力してくれた Microsoft Semantic Kernel チームと .NET チームに感謝します。
コネクタの機能を調べてみましょう。
Oracle .NETコネクタの主な機能
Oracle Database Vector Store Connector for Semantic Kernelには、いくつかの特徴的な特性があります。より幅広いベクトル距離関数をサポートし、以下を含みます。
- コサイン距離
- コサイン類似度
- ドット積類似度
- 負のドット積類似度
- ユークリッド距離
- ユークリッド二乗距離
- ハミング距離
- マンハッタン距離
- ジャカード類似度
これらの距離関数は、ベクトル間の類似性を比較する数式です。どの関数を使用するかは、アプリのベクトル特性、データの性質、比較特性によって異なります。選択肢が増えることで、開発者の柔軟性が向上し、検索結果の改善につながる可能性が高まります。
もう1つの際立った特徴は、Oracleコネクタがアプリに提供できるベクターインデックスの種類がさらに多いことです。
- フラット
- 階層的にナビゲート可能なスモールワールド(HNSW)
- 逆さファイル(体外受精)
ベクトル インデックスは、ベクトル埋め込みを効率的に管理およびクエリすることで、検索を高速化します。
Oracle コネクタには、すべてのレコードに 0 個、1 個、または複数のベクトルを格納する機能もあります。
開発者が .NET およびセマンティック カーネル アプリでデータベースの豊富な AI 機能セットをさらに活用できるように設計されています。
Oracle Database Vector Store コネクタとその機能の使用の詳細については、こちらをご覧ください。
注:ベクターデータ検索にはOracle Database 23ai以降が必要です。その他のOracleコネクタ機能はすべてOracle Database 19c以降でご利用いただけます。
このコネクタはセマンティックカーネルを完全にサポートしていますが、セマンティックカーネルに依存することはありません。最上位の依存ライブラリは、Microsoft.Extensions.AI.AbstractionsとMicrosoft.Extensions.VectorData.Abstractionsです。このコネクタを使用することで、セマンティックカーネルに依存せずに .NET ベクターアプリを構築できます。
クラス
Oracleコネクタでは、いくつかの新しいODP.NETクラスが導入されています。早速見ていきましょう。
OracleCollection
そしてOracleCollectionOptions
このOracleCollection
クラスはレコードを検索および管理します。名前付きコレクションはOracleデータベース表にマッピングされます。また、このクラスはコレクションの作成または削除も行います。Microsoft.Extensions.VectorData.VectorStoreCollection
インタフェースを実装します。
このOracleCollectionOptions
クラスは、使用する埋め込みジェネレーターの設定やカスタム コレクション定義など、コレクションを構成します。
OracleDynamicCollection
OracleDynamicCollection
は A キーと似ていますOracleCollection.
が、名前付きコレクションの定義がアプリケーション提供のキー タイプと汎用データ モデルに基づいているという点が異なりますDictionary<object, object?>
。
OracleServiceCollectionExtensions
このクラスは、拡張メソッドがOracleVectorStore
または OracleCollection
インスタンスを に登録するためのものですIServiceCollection
。
OracleVectorStore
そしてOracleVectorStoreOptions
このOracleVectorStore
クラスはデータベース接続を表し、データベースアクセスを提供します。主にコレクション(テーブル)の作成、削除、取得に使用されます。Microsoft.Extensions.VectorData.VectorStore
インターフェースを実装します。
このOracleVectorStoreOptions
クラスは、データベース スキーマやデフォルトの埋め込みジェネレーターなどのベクトル オプションを構成します。
Oracle Database Vector Store Connector for Semantic Kernel クラスとそのメンバーの詳細については、Oracle ドキュメントを参照してください。
顧客事例
サンプルアプリの概要
Oracleコネクタの使い方が分かったので、.NETベクター、コネクタ、そしてOracleデータベースを使ってホテル検索アプリを構築してみましょう。サンプルアプリでは、Oracle AIベクターデータとコレクションを検索する様々な方法を紹介します。
まず、ファイル ( Hotels.json
) からサンプルデータを.NETオブジェクトリストに読み込みます。データには、ホテル名、説明、ID番号、評価、駐車場の空き状況が含まれます。ホテル名と説明は、OracleデータベースのONNX埋め込みを使用してベクター埋め込みに変換されます。アプリは、このデータセット全体をデータベースに読み込みます。
次に、次の 4 つの検索を実行します。
- 主キー(ホテルID)で検索
- 複数の宿泊施設を一度に検索(ホテルの評価と駐車場)
- コサイン類似度を用いた類似検索(ホテル名)
- ユークリッド距離を使用した類似検索(ホテルの説明)
最初の2つのクエリでは、検索条件に完全に一致するすべてのホテルが返されます。最後の2つのクエリは類似度検索です。これらのクエリでは、上位3つの結果がランク付けされ、それぞれの検索スコアが返されます。スコアは、使用される値距離関数(コサイン類似度、ユークリッド距離、ドット積など)に基づいています。スコアが0に近いほど、2つのベクトルの類似度が高くなります。このスコアリング原則は、Oracleのすべてのベクトル距離関数に適用されます。
類似検索の性能を理解しやすく評価しやすいように、データセットは小規模(ホテル20件)に抑えています。JSONファイルにホテルのエントリを追加することで、データサイズと複雑さを増やすことができます。
設定
Oracle .NETベクターサンプルとデータセットの完全版は、GitHubリポジトリからダウンロードできます。サンプルは、.NET 8以降で動作するコンソールアプリです。
ベクターストアにはOracle Database 23ai以降が必要です。データベースはオンプレミス、クラウドベース、またはAutonomous Database(ADB)のいずれかを選択できます。このブログ記事では、デモセットアップにAlways Free Autonomous Databaseを使用しています。もちろん、これは無料です。
デモを実行する最も簡単な方法は、ADB ADMINユーザーを使用することです。オンプレミスデータベースや他のスキーマユーザーを使用している場合は、このブログ記事の最後に、それらの状況でのデータベースの設定手順に関する補足情報があります。
ベクトルを生成するために、Hugging Faceトランスフォーマーモデルの拡張版であるall-MiniLM-L12-v2(ONNX形式)を使用します。このモデルは、DBMS_VECTOR.LOAD_ONNX_MODEL
またはを介してデータベースに直接読み込むことができますDBMS_DATA_MINING.IMPORT_ONNX_MODEL
。GitHubリポジトリからダウンロードしたファイルの中に、が含まれていますLoad-model.sql
。ADMINユーザーアカウントで以下のSQLスクリプトを実行し、ONNXモデルを読み込んでください。
アプリの接続文字列を設定するには、Appsettings.json
ファイルを開いて、データベースのユーザー名、パスワード、データソースのエントリを入力します。
プロジェクトに NuGet パッケージを追加します。
- Oracle.VectorData
- Microsoft.Extensions.Configuration.Json
サンプルホテルデータはHotels.json
ファイル内にあります。このファイルを確認することで、DBにロードしてベクトル化するデータを確認できます。
.NET データモデル
このHotel.cs
ファイルには.NETデータモデルが含まれています。HotelクラスのプロパティはHotels.json
フィールドと一致しています。
using Microsoft.Extensions.VectorData;
namespace OracleAIVectorData
{
public class Hotel
{
[VectorStoreKey]
public int HotelId { get; set; }
[VectorStoreData]
public string HotelName { get; set; }
[VectorStoreData]
public float Rating { get; set; }
[VectorStoreData]
public bool HasParking { get; set; }
[VectorStoreData]
public string Description { get; set; }
//Oracle has numerous vector distance functions to identify the most relevant results.
//Let's use cosine similarity for the hotel name vectors.
[VectorStoreVector(Dimensions: 384, DistanceFunction = DistanceFunction.CosineDistance)]
public float[] NameEmbedding { get; set; }
//Let's use Euclidean distance for the hotel description vectors.
[VectorStoreVector(Dimensions: 384, DistanceFunction = DistanceFunction.EuclideanDistance)]
public float[] DescriptionEmbedding { get; set; }
}
}
これHotelId
はベクトルストアのキーです。次の4つのプロパティはベクトルストアのデータです。
最後の2つのプロパティは、ホテル名と説明のベクトル化された埋め込みを格納します。サンプルアプリでは、ホテル名についてはコサイン類似度距離指標を使用してベクトルを比較します。説明についてはユークリッド距離を使用します。
Distance Function値を変更することで、代替の距離関数を選択できます。
サンプルコード
このAi-vector-search-stores-and-collections.cs
ファイルはコンソールコードです。ホテルのデータをデータベースに読み込み、ホテル検索を実行します。コードを確認してみましょう。
AI ベクトルおよび Oracle データ アクセス機能のusingディレクティブを追加します。
using Oracle.VectorData;
using Oracle.ManagedDataAccess.Client;
using Microsoft.Extensions.VectorData;
using Microsoft.Extensions.Configuration;
using System.Text.Json;
Appsettings.json
次に、データ ソース、ベクター ストア、およびコレクション オブジェクトから接続文字列を取得して設定します。
var configuration = new ConfigurationBuilder()
.AddJsonFile(path: "AppSettings.json", optional: false)
.Build();
string? connStr = configuration.GetSection("Oracle")["ConnectionString"];
OracleDataSource? ds = null;
OracleVectorStore? vs = null;
OracleCollection<int, Hotel>? collection = null;
string collectionName = "Hotels";
次に、ベクター ストアとコレクションを作成し、JSON ホテル データをロードし、ホテル名と説明のベクター埋め込みを生成し、そのすべてのホテル データを Oracle データベースに挿入します。
ds = new OracleDataSourceBuilder(connStr).Build();
// Create a vector store
vs = new OracleVectorStore(ds);
// Create a vector collection
collection = (OracleCollection<int, Hotel>)vs.GetCollection<int, Hotel>(collectionName);
// HotelsData.json contains plain text information about various hotels.
// Add Hotels.json directory path below or place file in app's output directory.
string jsonContent = File.ReadAllText("Hotels.json");
List<Hotel>? hotels = JsonSerializer.Deserialize<List<Hotel>>(jsonContent);
// Use the database ONNX generator to create VECTOR(384, FLOAT32) embeddings for each hotel/record.
foreach (Hotel hotel in hotels)
{
hotel.NameEmbedding = await GenerateEmbeddingAsync(ds, hotel.HotelName);
hotel.DescriptionEmbedding = await GenerateEmbeddingAsync(ds, hotel.Description);
}
// Verify the collection exists in the database.
await collection.EnsureCollectionExistsAsync();
// Upsert the records into the database.
await collection.UpsertAsync(hotels);
このGenerateEmbeddingAsync
手順では、all-MiniLM-L12-v2 モデルを使用して、FLOAT32 ストレージ形式を使用して 384 ベクトル次元の埋め込みを生成します。
// Generate embeddings in ONNX format.
// This app uses Hugging Face's all-MiniLM-L12-v2 model for all its embeddings.
static async Task<float[]> GenerateEmbeddingAsync(OracleDataSource ds, string searchText, CancellationToken cancellationtoken = default)
{
using (OracleConnection conn = await ds.OpenConnectionAsync(cancellationtoken))
{
using (OracleCommand cmd = new OracleCommand($"SELECT TO_VECTOR(VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING :1 as DATA), 384, FLOAT32)", conn))
{
cmd.Parameters.Add("searchStr", OracleDbType.Varchar2, null, System.Data.ParameterDirection.Input);
cmd.Parameters[0].Value = searchText;
return (float[])cmd.ExecuteScalar();
}
}
}
これでデータのクエリを実行する準備が整いました。まずは完全一致検索から始めましょう。ホテルID番号でクエリを実行し、IDが5と10のホテルを検索します。
// Search hotels in the vector collection by primary key.
Console.WriteLine("Search for hotels with ID 5 and 10.");
Console.WriteLine("===============================================================================");
IAsyncEnumerable<Hotel> hotelsById = collection.GetAsync([5, 10]);
await foreach (Hotel hotel in hotelsById)
{
Output(hotel);
}
条件に一致するホテルが 2 つあります:

GetAsync ID 番号の入力値を変更して、他の結果を返すこともできます。
一度に1つ以上のデータフィールドをフィルタリングして検索することもできます。2番目のクエリでは、評価が9以上で駐車場があるホテルを検索します。
// Search hotels by their characteristics, such as rating and parking availability.
Console.WriteLine("Search for hotels with a 9 or higher rating and parking.");
Console.WriteLine("===============================================================================");
IAsyncEnumerable<Hotel> hotelsByFilter2 = collection.GetAsync(r => r.Rating >= 9 && r.HasParking == true, 3);
await foreach (Hotel hotel in hotelsByFilter2)
{
Output(hotel);
}
条件に一致するホテルは 2 件あります:

検索パラメータを変更して異なる結果を返すこともできます。
完全一致検索のシナリオをいくつか見てきましたので、次はベクトルを使った類似検索を試してみましょう。今回は、コサイン距離を用いて、単語またはフレーズに類似するホテル名を検索します。
サンプルコードでは、「ビーチ」という用語を使用しています。この用語はベクトル化され、すべてのホテル名と比較することでベクトル距離スコアが計算されます。
string hotelNameSearchStr = "beach";
var nameEmbedding = await GenerateEmbeddingAsync(ds, hotelNameSearchStr);
// Specify the search option for hotel name.
VectorSearchOptions<Hotel> nameOptions = new() { VectorProperty = r => r.NameEmbedding };
IAsyncEnumerable<VectorSearchResult<Hotel>> namesVectorSearch = collection.SearchAsync(nameEmbedding, top: 3, nameOptions);
int rank = 1;
Console.WriteLine($"Hotel name similarity search with \"{hotelNameSearchStr}\".");
Console.WriteLine("===============================================================================");
await foreach (VectorSearchResult<Hotel> searchResult in namesVectorSearch)
{
Console.WriteLine(rank + $". {searchResult.Record.HotelName}");
Console.WriteLine($"Score : {searchResult.Score}");
Console.WriteLine();
rank++;
}
コンソール出力には上位3つの一致がランク付けされます。スコアが低いほど類似度が高いことを示します。

hotelNameSearchStr
類似性検索をさらに詳しく調べるには、別の用語またはフレーズで値を変更することもできます。
最後に、ホテルの説明に対してユークリッド距離指標を用いた類似度検索を行います。「自然アクティビティのあるホテルが欲しい」という文をクエリとして入力し、これをベクトル化して、すべてのホテルの説明と比較することでベクトル距離スコアを生成します。
string descriptionSearchStr = "I want a hotel with nature activities.";
var descriptionEmbedding = await GenerateEmbeddingAsync(ds, descriptionSearchStr);
// Specify the search option for hotel description.
VectorSearchOptions<Hotel> descriptionOptions = new() { VectorProperty = r => r.DescriptionEmbedding };
IAsyncEnumerable<VectorSearchResult<Hotel>> descriptionVectorSearch = collection.SearchAsync(descriptionEmbedding, top: 3, descriptionOptions);
rank = 1;
Console.WriteLine($"Hotel description similarity search with \"{descriptionSearchStr}\".");
Console.WriteLine("===============================================================================");
await foreach (VectorSearchResult<Hotel> searchResult in descriptionVectorSearch)
{
Console.WriteLine(rank + $". {searchResult.Record.HotelName}");
Console.WriteLine($"Score : {searchResult.Score}");
Console.WriteLine($"Description: {searchResult.Record.Description}");
Console.WriteLine();
rank++;
}
コンソール出力には、上位3つの一致がランク付けされています。以前と同様に、スコアが低いほど類似度が高いことを示します。

類似性検索をさらに詳しく調べるためにdescriptionSearchStr 値を変更することができます。
検索テキストを変更して結果とスコアを変更するだけでなく、ホテル名と説明に使用されるベクトル距離関数を変更することもできます。類似度検索距離関数はそれぞれ異なる数学的特性を持ち、類似度スコアと結果の順位を変更できます。また、データをベクトル化するトランスフォーマーモデルを切り替えることも可能です。
Oracleコネクタをお試しください。開発に関するご意見・ご感想をぜひお聞かせください。ご意見、バグ報告、機能リクエストなど、ご感想やご質問はOracle .NETディスカッションフォーラムまたはGitHubまでお寄せください。
次は何?
次のステップとして、Oracle Database Vector Store Connector for Semantic Kernel を GitHub でオープンソース化する予定です。
また、次のコネクタ バージョンに向けてさらに多くの機能を開発中です。
Java および Python 開発者向けに、Maven リポジトリおよび PyPI での今後の Semantic Kernel リリースには、バンドルされた Oracle データベース コネクタが含まれる予定です。
Oracleデータベースは、開発者に広範なAIベクトル検索機能を提供します。セマンティック・カーネルをサポートすることで、Oracleはこれらの機能を、より高レベルでより独自のAIアプローチと組み合わせたいと考えている企業や開発者に開放します。
補遺: 代替データベース設定
ADBでADMINユーザーを使用していない場合は、Oracleデータベース・トランスフォーマー・モデルのセットアップに若干の違いがあります。手順は以下のとおりです。
1. ONNX モデル ファイルをダウンロードして解凍します。
2. SYSDBAなどの管理者権限を持つユーザーとしてデータベースインスタンスにログインします。.NETアプリが接続するプラガブルデータベース(PDB)にセッションを設定します。
alter session set container=<pdb>;
3. 以下の必要な権限を付与し、解凍された ONNX モデル ディレクトリの場所へのパスを定義します。
GRANT DB_DEVELOPER_ROLE, CREATE MINING MODEL TO <schema user>;
CREATE OR REPLACE DIRECTORY DM_DUMP AS '<ONNX model directory path>';
GRANT READ ON DIRECTORY DM_DUMP TO <schema user>;
GRANT WRITE ON DIRECTORY DM_DUMP TO <schema user>;
4. アプリのユーザー スキーマにログインします。
ONNXモデルをロードします。データベース内に同じ名前のモデルが既に存在する場合は、まず既存のモデルを削除します。
exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'ALL_MINILM_L12_V2', force => true);
BEGIN
DBMS_VECTOR.LOAD_ONNX_MODEL(
directory => 'DM_DUMP',
file_name => 'all_MiniLM_L12_v2.onnx',
model_name => 'ALL_MINILM_L12_V2');
END;
/
インポートされると、アプリはこの ONNX モデルから埋め込みを生成します。
コメント
コメントを投稿