使用 Oracle 数据库矢量存储连接器 (预览版)

警告

Oracle 数据库向量存储功能处于预览状态,需要中断性变更的改进可能仍发生在发布前的有限情况下。

警告

语义内核向量存储功能处于预览状态,需要中断性变更的改进可能仍发生在发布前的有限情况下。

警告

语义内核向量存储功能处于预览状态,需要中断性变更的改进可能仍发生在发布前的有限情况下。

概述

Oracle 数据库矢量存储连接器可用于访问和管理 Oracle 数据库中的数据。 连接器具有以下特征。

功能区域 Support
集合映射到 Oracle 数据库表
支持的键属性类型
  • short
  • int
  • long
  • 字符串
  • Guid
支持的数据属性类型
  • 布尔
  • 字节
  • short
  • int
  • 十进制
  • long
  • float
  • 翻倍
  • 日期时间
  • DateTimeOffset
  • TimeSpan
  • 字符型
  • char[]
  • byte[]
  • String
  • Guid
  • 上述类型的可为 null 类型
支持的向量属性类型
  • 只读内存<float>
  • <嵌入浮点>
  • float[]
  • 只读内存
  • <嵌入双精度>
  • double[]
  • ReadOnlyMemory(只读内存)<short(短整型)>
  • <嵌入短>
  • short[]
  • ReadOnlyMemory<字节>
  • <嵌入字节>
  • byte[]
  • BitArray
  • BinaryEmbedding
支持的索引类型
  • 平面 (默认值)
  • HNSW
  • IVF
支持的距离函数
  • CosineDistance
    • FLOAT32、FLOAT64 和 INT8 矢量默认值
  • CosineSimilarity
  • DotProductSimilarity
  • NegativeDotProductSimilarity
  • EuclideanDistance
  • EuclideanSquaredDistance
  • HammingDistance
    • BINARY 向量默认值
  • 曼哈顿
  • JaccardSimilarity
    若要使用 Jaccard 相似性,请将 DistanceFunction 字符串设置为“JACCARD”或“JACCARDSIMILARITY”(例如 DistanceFunction = “JACCARDSIMILARITY”)。 此值区分大小写。 Jaccard 相似性需要二进制数值格式的向量。
支持的筛选器子句
  • ==
  • !=
  • <
  • <=
  • >
  • >=
  • List.Contains()
    • 仅当检查模型属性是否在列表中时
支持记录中的零、一个或多个向量 是的
是否支持 IsIndexed? 是的
是否支持FullTextSearchable?
支持 StorageName? 是的
支持 HybridSearch?

重要

矢量数据搜索需要 Oracle Database 23ai 或更高版本。 所有其他 Oracle 连接器功能都可使用 Oracle Database 19c 或更高版本。

更多信息即将推出。

功能区域 Support
支持的筛选器子句
  • AnyTagEqualTo
  • EqualTo
集合映射到 SQL 数据库表
支持的键属性类型
  • 短/短整型
  • int/Integer
  • long/Long
  • String
  • 唯一通用识别码 (UUID)
支持的数据属性类型
  • 字节/Byte
  • 短/短整型
  • int/Integer
  • long/Long
  • float/Float (浮点数/浮点型)
  • 双精度
  • 十进制/Decimal
  • 日期时间
  • 偏移数据时间
  • 时间戳
  • String
  • 唯一通用识别码 (UUID)
  • 列表<of all above types>
支持的向量属性类型
  • String
  • 集合<Float>
  • 列表<Float>
  • Float[]
  • float[]
支持的索引类型
  • HNSW
  • IVF
支持的距离函数
  • DOT_PRODUCT
  • 余弦相似度
  • 余弦距离
  • 欧几里得距离
支持记录中的多个向量 是的
是否支持Indexed? 是的
是否支持FullTextSearchable?
StoragePropertyName 是否支持? 否,请改用@JsonProperty
支持 HybridSearch?

入门指南

将 Oracle 数据库矢量存储连接器 NuGet 包添加到项目。

dotnet add package Oracle.VectorData --prerelease

可以使用语义内核提供的扩展方法将向量存储 IServiceCollection 添加到依赖项注入容器。 在这种情况下,类的 Oracle.VectorData.OracleVectorStore 实例也会向容器注册。

using Microsoft.SemanticKernel;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;

// Using Kernel Builder.
var builder = Kernel.CreateBuilder();
builder.Services.AddOracleVectorStore("<connection string>");
using Microsoft.AspNetCore.Builder;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOracleVectorStore("<connection string>");

不带参数的扩展方法也可用。 这些要求将类的 Oracle.ManagedDataAccess.Client.OracleDataSource 实例单独注册到依赖项注入容器。

using Microsoft.SemanticKernel;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;
using Oracle.ManagedDataAccess.Client;

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
builder.Services.AddSingleton<OracleDataSource>(sp =>
{
    OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");  
    return dataSourceBuilder.Build();
});

builder.Services.AddOracleVectorStore();
using Microsoft.AspNetCore.Builder;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;
using Oracle.ManagedDataAccess.Client;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<OracleDataSource>(sp =>
{
    OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");  
    return dataSourceBuilder.Build();
});

builder.Services.AddOracleVectorStore();

可以使用自定义数据源或连接字符串直接构造 Oracle 数据库矢量存储实例。

using Oracle.VectorData;
using Oracle.ManagedDataAccess.Client;

OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");
var dataSource = dataSourceBuilder.Build();

var connection = new OracleVectorStore(dataSource);
using Oracle.VectorData;

var connection = new OracleVectorStore("<connection string>");

可以使用自定义数据源或连接字符串构造对命名集合的直接引用。

using Oracle.VectorData;
using Oracle.ManagedDataAccess.Client;

OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");
var dataSource = dataSourceBuilder.Build();

var collection = new OracleCollection<string, Hotel>(dataSource, "skhotels");
using Oracle.VectorData;

var collection = new OracleCollection<string, Hotel>("<connection string>", "skhotels");

入门指南

更多信息即将推出。

入门指南

设置 Oracle 数据库矢量存储连接器。

// Copyright (c) Microsoft. All rights reserved.
package com.microsoft.semantickernel.samples.syntaxexamples.memory;

import com.microsoft.semantickernel.data.jdbc.JDBCVectorStore;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreOptions;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollection;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollectionOptions;
import com.microsoft.semantickernel.data.jdbc.oracle.OracleVectorStoreQueryProvider;
import com.microsoft.semantickernel.data.vectorstorage.VectorStoreRecordCollection;
import com.microsoft.semantickernel.samples.documentationexamples.data.index.Hotel;
import java.sql.SQLException;
import java.util.Collections;
import oracle.jdbc.datasource.impl.OracleDataSource;

public class VectorStoreWithOracle {

    public static void main(String[] args) throws SQLException {
        System.out.println("==============================================================");
        System.out.println("============== Oracle Vector Store Example ===================");
        System.out.println("==============================================================");

        // Configure the data source
        OracleDataSource dataSource = new OracleDataSource();
        dataSource.setURL("jdbc:oracle:thin:@localhost:1521/FREEPDB1");
        dataSource.setUser("scott");
        dataSource.setPassword("tiger");

        // Build a query provider
        OracleVectorStoreQueryProvider queryProvider = OracleVectorStoreQueryProvider.builder()
            .withDataSource(dataSource)
            .build();

        // Build a vector store
        JDBCVectorStore vectorStore = JDBCVectorStore.builder()
            .withDataSource(dataSource)
            .withOptions(JDBCVectorStoreOptions.builder()
                .withQueryProvider(queryProvider)
                .build())
            .build();

        // Get a collection from the vector store
        VectorStoreRecordCollection<String, Hotel> collection = vectorStore.getCollection(
            "skhotels",
            JDBCVectorStoreRecordCollectionOptions.<Hotel>builder()
                .withRecordClass(Hotel.class)
                .build());

        // Create the collection if it doesn't exist yet.
        collection.createCollectionAsync().block();

        collection.upsertAsync(new Hotel("1",
            "HotelOne",
            "Desc for HotelOne",
            Collections.emptyList(), Collections.emptyList()),
            null)
            .block();

    }

}

数据映射

将数据从数据模型映射到存储时,Oracle 数据库向量存储连接器提供默认映射器。 此映射器将数据模型属性列表直接转换为 Oracle 数据库列以转换为存储架构。

Oracle 数据库矢量存储连接器支持数据模型注释和记录定义。可以使用批注向数据模型提供信息,以便创建索引和数据库列映射。 使用 记录定义,可以独立于数据模型定义和提供信息。

下表显示了 Oracle 数据库和 C# 之间的默认主键数据类型映射:

C# 数据类型 数据库类型
short/int16 数字(5)
int/int32 NUMBER(10)
long/int64 数字(19)
字符串 NVARCHAR2(2000)
Guid RAW(16)

下表显示了默认数据属性类型映射,包括可为 null 的类型:

C# 数据类型 数据库类型
布尔 Oracle Database 23ai 和更高版本的 BOOLEAN
早期版本的 NUMBER(1)
字节 数字(3)
short/int16 数字(5)
int/int32 NUMBER(10)
十进制 数字(18,2)
long/int64 数字(19)
float BINARY_FLOAT
翻倍 BINARY_DOUBLE
日期时间 TIMESTAMP(7)
DateTimeOffset TIMESTAMP(7) WITH TIME ZONE
TimeSpan 间隔日(8) 至秒(7)
字符型 NVARCHAR2(1)
char[] NVARCHAR2(2000)
byte[] RAW(2000)
字符串 NVARCHAR2(2000)
Guid RAW(16)

从 Oracle Database 23ai 开始,数据库向量可以映射到 .NET。 数据类型。 支持多个向量列。 下表显示了默认矢量属性类型映射,包括可为 null 的类型:

C# 数据类型 数据库类型
  • ReadOnlyMemory<字节>
  • <嵌入 System.Byte>
  • BinaryEmbedding
  • <嵌入字节>
  • byte[]
  • System.Byte[]
  • BitArray
VECTOR(维度、二进制)
  • ReadOnlyMemory(只读内存)<short(短整型)>
  • ReadOnlyMemory<System.Int16>
  • <嵌入短>
  • <嵌入 System.Int16>
  • short[]
  • System.Int16[]
VECTOR(维度,INT8)
  • 只读内存
  • ReadOnlyMemory<System.Double>
  • <嵌入 System.Double>
  • <嵌入双精度>
  • double[]
  • System.Double[]
VECTOR(维度、FLOAT64)
  • ReadOnlyMemory<float>
  • ReadOnlyMemory<System.Float>
  • <嵌入浮点>
  • <嵌入 System.Float>
  • float[]
  • System.Float[]
VECTOR(维度,FLOAT32)

属性名称重写

对于数据属性和向量属性,可以重写名称,以便在与数据模型属性名称不同的存储中使用。 在数据模型属性或记录定义中设置 StorageName 选项时,会发生属性名称重写。

下面是一个包含 StorageName 设置代码示例的数据模型,以及如何在 Oracle SQL 命令中表示这些数据模型。

using Microsoft.Extensions.VectorData;

public class Hotel
{
    [VectorStoreKey]
    public long HotelId { get; set; }

    [VectorStoreData(StorageName = "hotel_name")]
    public string? HotelName { get; set; }

    [VectorStoreData(StorageName = "hotel_description")]
    public string? Description { get; set; }

    [VectorStoreVector(Dimensions: 384, DistanceFunction = DistanceFunction.CosineDistance)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE "MYSCHEMA"."Hotels"
  ("HotelId" NUMBER(10),
   "hotel_name" NVARCHAR2(2000),
   "hotel_description" NVARCHAR2(2000),
   "DescriptionEmbedding" VECTOR(384, FLOAT32),
   PRIMARY KEY ( "HotelId" )
);

了解详细信息

若要了解详细信息,请参阅以下 Oracle 数据库矢量存储连接器资源:

数据映射

将数据从数据模型映射到存储时,Oracle 数据库向量存储连接器提供默认映射器。 此映射器将数据模型属性列表直接转换为 Oracle 数据库列以转换为存储架构。

Oracle 数据库矢量存储连接器支持数据模型注释和记录定义。可以使用批注向数据模型提供信息,以便创建索引和数据库列映射。 使用 记录定义,可以独立于数据模型定义和提供信息。

下表显示了 Oracle 数据库和 Java 之间的默认主键数据类型映射,以及从中 ResultSet检索数据的相应方法:

Java 类型 数据库类型 ResultSet 获取方法
字节/Byte 数字(3) resultSet.getByte(name)
短/短整型 数字(5) resultSet.getShort(name)
int/Integer NUMBER(10) resultSet.getInt(name)
long/Long 数字(19) resultSet.getLong(name)
String NVARCHAR2(2000) resultSet.getString(name)
唯一通用识别码 (UUID) RAW(16) resultSet.getObject(name, java_type)

下表显示了默认数据属性类型映射以及从中 ResultSet检索数据的相应方法:

Java 类型 数据库类型 ResultSet 获取方法
布尔 BOOLEAN resultSet.getByte(name)
字节/Byte 数字(3) resultSet.getByte(name)
byte[] RAW(2000) resultSet.getBytes(name)
短/短整型 数字(5) resultSet.getShort(name)
int/Integer NUMBER(10) resultSet.getInt(name)
long/Long 数字(19) resultSet.getLong(name)
float/Float (浮点数/浮点型) BINARY_FLOAT resultSet.getFloat(name)
双精度 BINARY_DOUBLE resultSet.getDouble(name)
BigDecimal 数字(18,2) resultSet.getBigDecimal(name)
带偏移时区的日期时间 TIMESTAMP(7) WITH TIME ZONE resultSet.getTIMESTAMPTZ(name).offsetDateTimeValue()
String CLOB/NVARCHAR2(%s) resultSet.getString(name)
唯一通用识别码 (UUID) RAW(16) resultSet.getObject(name, java_type)
列表<T> JSON resultSet.getObject(name, java_type)ojdbc-extensions-jackson-oson

从 Oracle Database 23ai 开始,数据库向量可以映射到 Java 数据类型。 支持多个向量列。 下表显示了默认矢量属性类型映射:

Java 类型 数据库类型
String VECTOR(%d,FLOAT32)
集合<Float> VECTOR(%d,FLOAT32)
列表<Float> VECTOR(%d,FLOAT32)
Float[] VECTOR(%d,FLOAT32)
float[] VECTOR(%d,FLOAT32)