警告
Oracle 数据库向量存储功能处于预览状态,需要中断性变更的改进可能仍发生在发布前的有限情况下。
警告
语义内核向量存储功能处于预览状态,需要中断性变更的改进可能仍发生在发布前的有限情况下。
警告
语义内核向量存储功能处于预览状态,需要中断性变更的改进可能仍发生在发布前的有限情况下。
概述
Oracle 数据库矢量存储连接器可用于访问和管理 Oracle 数据库中的数据。 连接器具有以下特征。
| 功能区域 | Support |
|---|---|
| 集合映射到 | Oracle 数据库表 |
| 支持的键属性类型 |
|
| 支持的数据属性类型 |
|
| 支持的向量属性类型 |
|
| 支持的索引类型 |
|
| 支持的距离函数 |
|
| 支持的筛选器子句 |
|
| 支持记录中的零、一个或多个向量 | 是的 |
| 是否支持 IsIndexed? | 是的 |
| 是否支持FullTextSearchable? | 否 |
| 支持 StorageName? | 是的 |
| 支持 HybridSearch? | 否 |
重要
矢量数据搜索需要 Oracle Database 23ai 或更高版本。 所有其他 Oracle 连接器功能都可使用 Oracle Database 19c 或更高版本。
更多信息即将推出。
| 功能区域 | Support |
|---|---|
| 支持的筛选器子句 |
|
| 集合映射到 | SQL 数据库表 |
| 支持的键属性类型 |
|
| 支持的数据属性类型 |
|
| 支持的向量属性类型 |
|
| 支持的索引类型 |
|
| 支持的距离函数 |
|
| 支持记录中的多个向量 | 是的 |
| 是否支持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# 数据类型 | 数据库类型 |
|---|---|
|
VECTOR(维度、二进制) |
|
VECTOR(维度,INT8) |
|
VECTOR(维度、FLOAT64) |
|
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 数据库矢量存储连接器
介绍关键连接器功能、类,并使用连接器引导读者完成示例 AI 矢量搜索应用程序。 -
文档:用于语义内核 (.NET) API 的 Oracle 数据库矢量存储连接器类
包含有关 Oracle 数据库矢量存储连接器类的信息,这些类用于在 Oracle 矢量数据库中添加数据、检索数据和执行矢量搜索。 -
文档:用于 .NET 的 Oracle 数据提供程序
包含有关用于 .NET 的 Oracle 数据提供程序(ODP.NET)的信息,该 ADO.NET 用于 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) |