Utilizar o conector do Vector Store do Oracle Database (Pré-visualização)

Advertência

A funcionalidade Oracle Database Vetor Store está em pré-visualização, e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Advertência

A funcionalidade Kernel Semântico Vetor Store está em pré-visualização, e melhorias que exigem alterações de quebra ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Advertência

A funcionalidade Kernel Semântico Vetor Store está em pré-visualização, e melhorias que exigem alterações de quebra ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Visão geral

O Oracle Database Vetor Store Connector pode ser usado para acessar e gerenciar dados no Oracle Database. O conector tem as seguintes características.

Área de funcionalidades Support
Coleção corresponde a Tabela de banco de dados Oracle
Tipos de propriedades-chave suportados
  • short
  • int
  • long
  • cadeia (de caracteres)
  • Guia
Tipos de propriedade de dados suportados
  • bool
  • byte
  • short
  • int
  • decimal
  • long
  • float
  • duplo
  • DateTime
  • DateTimeOffset
  • TimeSpan
  • char
  • char[]
  • byte[]
  • Cordão
  • Guia
  • e tipo anulável dos tipos acima
Tipos de propriedade vetorial suportados
  • ReadOnlyMemory<float>
  • Incorporação<float>
  • flutuar[]
  • ReadOnlyMemory<duplo>
  • Embedding<double>
  • duplo[]
  • ReadOnlyMemory<short>
  • Incorporação<curta>
  • short[]
  • ReadOnlyMemory<byte>
  • Byte de incorporação<>
  • byte[]
  • BitArray
  • BinaryEmbedding
Tipos de índice suportados
  • Plano (padrão)
  • HNSW
  • FIV
Funções de distância suportadas
  • CosineDistância
    • FLOAT32, FLOAT64 e padrão do vetor INT8
  • CossenoSimilaridade
  • DotProductSimilarity
  • NegativeDotProductSimilarity
  • Distância Euclidiana
  • Distância Euclidiana ao Quadrado
  • distância de Hamming
    • Predefinição do vetor BINARY
  • distância de Manhattan
  • Similaridade de Jaccard
    Para usar a semelhança de Jaccard, defina a cadeia de caracteres DistanceFunction como "JACCARD" ou "JACCARDSIMILARITY" (por exemplo, DistanceFunction = "JACCARDSIMILARITY"). Esse valor diferencia maiúsculas de minúsculas. A semelhança de Jaccard requer vetores de formato numérico binário.
Cláusulas de filtro suportadas
  • ==
  • !=
  • <
  • <=
  • >
  • >=
  • List.Contém()
    • Apenas ao verificar se a propriedade do modelo está na lista
Suporta zero, um ou vários vetores em um registro Yes
IsIndexed é suportado? Yes
IsFullTextSearchable é suportado? Não
O StorageName é suportado? Yes
O HybridSearch é suportado? Não

Importante

As pesquisas de dados vetoriais requerem o Oracle Database 23ai ou superior. Todos os outros recursos do conector Oracle estão disponíveis usando o Oracle Database 19c ou superior.

Área de funcionalidades Support
A coleção corresponde a Uma tabela de Base de Dados Oracle
Tipos de propriedade de chave suportados
  • str
  • int
  • uuid.UUID
Tipos de propriedade de dados suportados
  • str
  • int
  • long
  • float
  • bool
  • decimal
  • byte
  • bytes
  • uuid.UUID
  • datetime.date
  • datetime.datetime
  • datetime.timedelta
  • lista[str]
  • dict[str, Qualquer]
  • lista[dicionário[chave de tipo string, qualquer tipo]]
Tipos de propriedade vetorial suportados
  • list[float]
  • Matriz numpy
Tipos de índice suportados
  • HNSW
  • FIV
Funções de distância suportadas
  • COSINE_DISTANCE
  • Distância Euclidiana
  • Distância_Euclidiana_ao_Quadrado
  • DOT_PROD
  • HAMMING
  • MANHATTAN
  • DEFAULT
Cláusulas de filtro suportadas Lambdas em Python com comparações, operadores booleanos, métodos de string (startswith, endswith), between e datetime, traduzidos para SQL com variáveis de ligação
O IsIndexed é suportado? Yes
IsFullTextSearchable é suportado? Não
StoragePropertyName suportado? Yes
HybridSearch é suportado? Não

Importante

As pesquisas de dados vetoriais requerem o Oracle Database 23ai ou versões posteriores. Todas as outras funcionalidades do conector Oracle estão disponíveis usando o Oracle Database 19c ou posterior. Além disso, é necessário python-oracledb 3.3 ou posterior.

Área de funcionalidades Support
Cláusulas de filtro suportadas
  • AnyTagEqualTo
  • EqualTo
A coleção é mapeada para Tabela do banco de dados SQL
Tipos de propriedades-chave suportados
  • curto/Curto
  • int/inteiro
  • longo/longo
  • Cordão
  • Identificador Único Universal (UUID)
Tipos de propriedade de dados suportados
  • byte/byte
  • curto/Curto
  • int/inteiro
  • longo/longo
  • ponto flutuante/float
  • duplo/duplo
  • decimal/decimal
  • DateTime
  • OffsetDataTime
  • Data e Hora
  • Cordão
  • Identificador Único Universal (UUID)
  • Lista<of all above types>
Tipos de propriedade vetorial suportados
  • Cordão
  • Coleção<Float>
  • Lista<Float>
  • Flutuar[]
  • flutuar[]
Tipos de índice suportados
  • HNSW
  • FIV
Funções de distância suportadas
  • DOT_PRODUCT
  • COSINE_SIMILARITY
  • COSINE_DISTANCE
  • Distância Euclidiana
Suporta vários vetores em um registro Yes
Suporte para IsIndexed? Yes
IsFullTextSearchable é suportado? Não
StoragePropertyName suportado? Não, use @JsonProperty em vez disso
O HybridSearch é suportado? Não

Como Começar

Adicione o pacote NuGet do conector do Oracle Database Vetor Store ao seu projeto.

dotnet add package Oracle.VectorData --prerelease

Pode adicionar o armazenamento vetorial ao IServiceCollection contentor de injeção de dependências usando métodos de extensão fornecidos pelo pacote conector. Nesse caso, uma instância da Oracle.VectorData.OracleVectorStore classe também é registrada com o contêiner.

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>");

Métodos de extensão que não usam parâmetros também estão disponíveis. Isso requer que uma instância da Oracle.ManagedDataAccess.Client.OracleDataSource classe seja registrada separadamente com o contêiner de injeção de dependência.

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();

Você pode construir uma instância do Oracle Database Vetor Store diretamente com uma fonte de dados personalizada ou com uma cadeia de conexão.

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>");

É possível construir uma referência direta a uma coleção nomeada com uma fonte de dados personalizada ou com uma cadeia de conexão.

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");

Como Começar

Instale o conector Oracle Database Vector Store:

pip install semantic-kernel[oracledb]

Importa as classes OracleSettings, OracleStore e OracleCollection.

from semantic_kernel.connectors.oracle import OracleSettings, OracleStore, OracleCollection

A classe OracleSettings detém a configuração necessária para criar uma ligação assíncrona à Oracle Database. A classe OracleStore é usada para armazenar e recuperar dados, enquanto a classe OracleCollection gere e pesquisa registos dentro de uma coleção. Utilize estas classes para configurar o Oracle Vector Store.

# Read the environment settings
oracle_settings = OracleSettings()

# Create a connection pool
pool = await oracle_settings.create_connection_pool(
    wallet_location=<wallet_location>,
    wallet_password=<wallet_password>)

# Create an Oracle Vector Store
store = OracleStore(
    connection_pool=pool,
)

# Get a collection
collection = await store.get_collection(
    record_type=HotelSample,
    collection_name=Hotel,
    embedding_generator=text_embedding)

# Create a collection if it does not exist
await collection.ensure_collection_exists()

Como Começar

Configure o conector do Oracle Database Vetor Store.

// 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();

    }

}

Mapeamento de dados

O conector Oracle Database Vetor Store fornece um mapeador padrão ao mapear dados do modelo de dados para o armazenamento. Esse mapeador faz uma conversão direta da lista de propriedades do modelo de dados para as colunas do banco de dados Oracle para converter no esquema de armazenamento.

O conector de armazenamento vetorial do Oracle Database suporta anotações de modelo de dados e definições de registo. Utilizando anotações, as informações podem ser fornecidas ao modelo de dados para a criação de índices e para o mapeamento de colunas da base de dados. Usando definições de registro, as informações podem ser definidas e fornecidas separadamente do modelo de dados.

A tabela a seguir mostra o mapeamento padrão do tipo de dados de chave primária entre o Oracle Database e o C#:

Tipo de dados C# Tipo de banco de dados
short/int16 NÚMERO(5)
int/int32 NÚMERO(10)
long/int64 NÚMERO(19)
cadeia (de caracteres) NVARCHAR2(2000)
Guia RAW(16)

A tabela a seguir mostra o mapeamento de tipo de propriedade de dados padrão, incluindo tipos anuláveis:

Tipo de dados C# Tipo de banco de dados
bool BOOLEAN para Oracle Database 23ai e versões posteriores
NÚMERO(1) para versões anteriores
byte NÚMERO(3)
short/int16 NÚMERO(5)
int/int32 NÚMERO(10)
decimal NÚMERO(18,2)
long/int64 NÚMERO(19)
float BINARY_FLOAT
duplo BINARY_DOUBLE
DateTime TIMESTAMP(7)
DateTimeOffset TIMESTAMP(7) COM FUSO HORÁRIO
TimeSpan INTERVALO DIA(8) A SEGUNDO(7)
char NVARCHAR2(1)
char[] NVARCHAR2(2000)
byte[] RAW(2000)
cadeia (de caracteres) NVARCHAR2(2000)
Guia RAW(16)

A partir do Oracle Database 23ai, os vetores de banco de dados podem ser mapeados para .NET. tipos de dados. Várias colunas vetoriais são suportadas. A tabela a seguir mostra o mapeamento de tipo de propriedade vetorial padrão, incluindo tipos anuláveis:

Tipo de dados C# Tipo de banco de dados
  • ReadOnlyMemory<byte>
  • Embedding<System.Byte>
  • BinaryEmbedding
  • Byte de incorporação<>
  • byte[]
  • System.Byte[]
  • BitArray
VETOR(dimensões, BINÁRIO)
  • ReadOnlyMemory<short>
  • ReadOnlyMemory<System.Int16>
  • Incorporação<curta>
  • Embedding<System.Int16>
  • short[]
  • System.Int16[]
VETOR(dimensões, INT8)
  • ReadOnlyMemory<duplo>
  • ReadOnlyMemory<System.Double>
  • Incorporação<System.Double>
  • Incorporação<double>
  • duplo[]
  • System.Double[]
VETOR(dimensões, FLOAT64)
  • ReadOnlyMemory<float>
  • ReadOnlyMemory<System.Float>
  • Incorporação<float>
  • Incorporação<System.Float>
  • flutuar[]
  • System.Float[]
VETOR(dimensões, FLOAT32)

Substituição do nome da propriedade

Para propriedades de dados e propriedades de vetor, pode substituir os nomes a utilizar no armazenamento por nomes diferentes dos nomes das propriedades do modelo de dados. A substituição do nome da propriedade ocorre ao definir a StorageName opção nas propriedades do modelo de dados ou na definição do registro.

Aqui está um modelo de dados com StorageName exemplo de código definido e como isso será representado em um comando 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" )
);

Saiba mais

Consulte os seguintes recursos do conector do Oracle Database Vetor Store para saber mais:

Mapeamento de dados

O conector Oracle Database Vector Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Este mapeador faz uma conversão direta da lista de propriedades no modelo de dados para as colunas Oracle Database para converter no esquema de armazenamento.

O conector Oracle Database Vector Store suporta anotações de modelos de dados e definições de registos. Usando anotações, a informação pode ser fornecida ao modelo de dados para criar índices e mapeamento de colunas na base de dados. Usando definições de registro, as informações podem ser definidas e fornecidas separadamente do modelo de dados.

A tabela seguinte mostra o mapeamento padrão de tipos de dados da chave primária entre Oracle Database e Python:

Tipo Python Tipo Oracle SQL
str VARCHAR(n), Usando str(n) na opção de tipo, define o comprimento Oracle VARCHAR como n. Se n não for especificado, o comprimento padrão é 4000.
int NÚMERO(10)
byte NÚMERO(3)
long NÚMERO(19)
decimal NÚMERO
float BINARY_FLOAT
duplo BINARY_DOUBLE
bool BOOLEAN
Identificador Único Universal (UUID) RAW(16)
date DATE
datetime.datetime DATA E HORA
datetime.timedelta INTERVALO DIA A SEGUNDO
CLOB CLOB, pode ser especificado explicitamente, não é um tipo nativo de Python
blob BLOB, pode ser especificado explicitamente, não é um tipo nativo de Python
list[str], dict[str, qualquer] JSON
lista[dicionário[chave de tipo string, qualquer tipo]] JSON
bytes RAW(2000)

A partir do Oracle Database 23ai, os vetores de base de dados podem ser mapeados para tipos de dados em Python. Várias colunas vetoriais são suportadas. A tabela a seguir mostra o mapeamento de tipo de propriedade vetorial padrão:

Tipo Python Tipo de banco de dados
uint8 BINARY
int8 INT8
float FLOAT64
float32 FLOAT32
float64 FLOAT64
binário BINARY

Saiba mais

Consulte os seguintes recursos para saber mais:

Mapeamento de dados

O conector Oracle Database Vetor Store fornece um mapeador padrão ao mapear dados do modelo de dados para o armazenamento. Esse mapeador faz uma conversão direta da lista de propriedades do modelo de dados para as colunas do banco de dados Oracle para converter no esquema de armazenamento.

O conector Oracle Database Vector Store suporta anotações do modelo de dados e definições de registos. Através de anotações, as informações podem ser fornecidas ao modelo de dados para a criação de índices e o mapeamento de colunas da base de dados. Usando definições de registro, as informações podem ser definidas e fornecidas separadamente do modelo de dados.

A tabela a seguir mostra o mapeamento padrão do tipo de dados de chave primária entre o Oracle Database e o Java, juntamente com os métodos correspondentes para recuperar dados de um ResultSet:

Tipo Java Tipo de banco de dados Método de Obtenção de ResultSet
byte/byte NÚMERO(3) resultSet.getByte(name)
curto/Curto NÚMERO(5) resultSet.getShort(name)
int/inteiro NÚMERO(10) resultSet.getInt(name)
longo/longo NÚMERO(19) resultSet.getLong(name)
Cordão NVARCHAR2(2000) resultSet.getString(name)
Identificador Único Universal (UUID) RAW(16) resultSet.getObject(name, java_type)

A tabela a seguir mostra o mapeamento de tipo de propriedade de dados padrão juntamente com os métodos correspondentes para recuperar dados de um ResultSet:

Tipo Java Tipo de banco de dados Método de Obtenção de ResultSet
Booleano BOOLEAN resultSet.getByte(name)
byte/byte NÚMERO(3) resultSet.getByte(name)
byte[] RAW(2000) resultSet.getBytes(name)
curto/Curto NÚMERO(5) resultSet.getShort(name)
int/inteiro NÚMERO(10) resultSet.getInt(name)
longo/longo NÚMERO(19) resultSet.getLong(name)
ponto flutuante/float BINARY_FLOAT resultSet.getFloat(name)
duplo/duplo BINARY_DOUBLE resultSet.getDouble(name)
BigDecimal NÚMERO(18,2) resultSet.getBigDecimal(name)
OffsetDateTime TIMESTAMP(7) COM FUSO HORÁRIO resultSet.getTIMESTAMPTZ(name).offsetDateTimeValue()
Cordão CLOB/NVARCHAR2(%s) resultSet.getString(name)
Identificador Único Universal (UUID) RAW(16) resultSet.getObject(name, java_type)
Lista<T> JSON resultSet.getObject(name, java_type) Usando ojdbc-extensions-jackson-oson

A partir do Oracle Database 23ai, os vetores de banco de dados podem ser mapeados para tipos de dados Java. Várias colunas vetoriais são suportadas. A tabela a seguir mostra o mapeamento de tipo de propriedade vetorial padrão:

Tipo Java Tipo de banco de dados
Cordão VETOR(%d, FLOAT32)
Coleção<Float> VETOR(%d, FLOAT32)
Lista<Float> VETOR(%d, FLOAT32)
Flutuar[] VETOR(%d, FLOAT32)
flutuar[] VETOR(%d, FLOAT32)