Compartilhar via


Usando o conector do Repositório de Vetores do Banco de Dados Oracle (versão prévia)

Aviso

A funcionalidade do Repositório de Vetores do Banco de Dados Oracle está em versão prévia e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Aviso

A funcionalidade semântica do Repositório de Vetores kernel está em versão prévia e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Aviso

A funcionalidade semântica do Repositório de Vetores kernel está em versão prévia e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Visão geral

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

Área de recurso Support
A coleção é mapeada para Tabela do banco de dados Oracle
Tipos de propriedade de chave com suporte
  • short
  • int
  • long
  • cadeia
  • Guid
Tipos de propriedade de dados com suporte
  • bool
  • byte
  • short
  • int
  • decimal
  • long
  • derivar
  • duplo
  • DateTime
  • DateTimeOffset
  • TimeSpan
  • char
  • char[]
  • byte[]
  • String
  • Guid
  • e tipo anulável dos tipos acima
Tipos de propriedade de vetor com suporte
  • Float ReadOnlyMemory<>
  • Inserindo<float>
  • float[]
  • ReadOnlyMemory<double>
  • Inserindo<duplo>
  • double[]
  • ReadOnlyMemory<short>
  • Inserindo<curto>
  • short[]
  • Byte ReadOnlyMemory<>
  • Bytes de inserção<>
  • byte[]
  • BitArray
  • BinaryEmbedding
Tipos de índice com suporte
  • Simples (padrão)
  • HNSW
  • FIV
Funções de distância com suporte
  • CosineDistance
    • padrão de vetor FLOAT32, FLOAT64 e INT8
  • CosineSimilaridade
  • DotProductSimilarity
  • NegativeDotProductSimilarity
  • EuclideanDistance
  • EuclideanSquaredDistance
  • HammingDistance
    • Padrão de vetor BINARY
  • ManhattanDistance
  • JaccardSimilarity
    Para usar a similaridade de Jaccard, configure a string DistanceFunction como "JACCARD" ou "JACCARDSIMILARITY" (por exemplo, DistanceFunction = "JACCARDSIMILARITY"). Esse valor diferencia maiúsculas de minúsculas. A similaridade de Jaccard requer vetores de formato numérico BINARY.
Cláusulas de filtro com suporte
  • ==
  • !=
  • <
  • <=
  • >
  • >=
  • List.Contains()
    • Somente ao verificar se a propriedade do modelo está na lista
Dá suporte a zero, um ou vários vetores em um registro Yes
Há suporte para IsIndexed? Yes
Há suporte para o IsFullTextSearchable? Não
StorageName com suporte? Yes
Suporte ao HybridSearch? Não

Importante

As pesquisas de dados de vetor exigem 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 recurso Support
A coleção é mapeada para Uma tabela do Oracle Database
Tipos de propriedade de chave com suporte
  • Str
  • int
  • uuid.UUID
Tipos de propriedade de dados com suporte
  • Str
  • int
  • long
  • derivar
  • bool
  • decimal
  • byte
  • bytes
  • uuid.UUID
  • datetime.date
  • datetime.datetime
  • datetime.timedelta
  • lista[str]
  • dict[str, Any]
  • list[dict[str, Any]]
Tipos de propriedade de vetor com suporte
  • list[float]
  • array numpy
Tipos de índice com suporte
  • HNSW
  • FIV
Funções de distância com suporte
  • COSINE_DISTANCE
  • DISTÂNCIA EUCLIDIANA
  • DISTÂNCIA_EUCLIDIANA_QUADRADA
  • DOT_PROD
  • Hamming
  • MANHATTAN
  • DEFAULT
Cláusulas de filtro com suporte Lambdas do Python com comparações, operadores booleanos, métodos de strings (startswith, endswith), entre, e datetime, traduzidos para SQL com variáveis de bind
Há suporte para IsIndexed? Yes
Há suporte para o IsFullTextSearchable? Não
StoragePropertyName com suporte? Yes
Suporte ao HybridSearch? Não

Importante

As pesquisas de dados de vetor exigem o Oracle Database 23ai ou posterior. Todos os outros recursos do conector Oracle estão disponíveis usando o Oracle Database 19c ou posterior. Além disso, o python-oracledb 3.3 ou posterior é necessário.

Área de recurso Support
Cláusulas de filtro com suporte
  • AnyTagEqualTo
  • EqualTo
A coleção é mapeada para Tabela do banco de dados SQL
Tipos de propriedade de chave com suporte
  • curto/curto
  • int/Integer
  • longo/Long
  • String
  • Identificador Único Universal (UUID)
Tipos de propriedade de dados com suporte
  • byte/Byte
  • curto/curto
  • int/Integer
  • longo/Long
  • float/Float
  • double/Double
  • decimal/Decimal
  • DateTime
  • OffsetDataTime
  • Timestamp
  • String
  • Identificador Único Universal (UUID)
  • Lista<of all above types>
Tipos de propriedade de vetor com suporte
  • String
  • Coleção<Float>
  • Lista<Float>
  • Float[]
  • float[]
Tipos de índice com suporte
  • HNSW
  • FIV
Funções de distância com suporte
  • DOT_PRODUCT
  • COSINE_SIMILARITY
  • COSINE_DISTANCE
  • DISTÂNCIA EUCLIDIANA
Dá suporte a vários vetores em um registro Yes
Suporte ao IsIndexed? Yes
Há suporte para o IsFullTextSearchable? Não
StoragePropertyName com suporte? Não, use @JsonProperty em vez disso
Suporte ao HybridSearch? Não

Como começar

Adicione o pacote NuGet do conector do Repositório de Vetores do Banco de Dados Oracle ao seu projeto.

dotnet add package Oracle.VectorData --prerelease

Você pode adicionar o repositório de vetores ao IServiceCollection contêiner de injeção de dependência usando métodos de extensão fornecidos pelo Kernel Semântico. 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 têm parâmetros também estão disponíveis. Isso exige 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 Repositório de Vetores do Banco de Dados Oracle 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 do Repositório de Vetores do Banco de Dados Oracle:

pip install semantic-kernel[oracledb]

Importe as classes OracleSettings, OracleStore e OracleCollection.

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

A classe OracleSettings contém a configuração necessária para criar uma conexão assíncrona com o Oracle Database. A classe OracleStore é usada para armazenar e recuperar dados, enquanto a classe OracleCollection gerencia e pesquisa registros em uma coleção. Use essas classes para configurar o Repositório de Vetores Oracle.

# 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

Configurar o conector do Repositório de Vetores do Banco de Dados 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();

    }

}

Mapeamento de dados

O conector do Repositório de Vetores do Banco de Dados Oracle 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 de banco de dados Oracle a serem convertidas no esquema de armazenamento.

O conector do Repositório de Vetores do Banco de Dados Oracle dá suporte a anotações de modelo de dados e definições de registro. Usando anotações, as informações podem ser fornecidas ao modelo de dados para criar índices e mapeamento de coluna de banco 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 de tipo de dados de chave primária padrão entre o Banco de Dados Oracle e o C#:

Tipo de dados C# Tipo de banco de dados
short/int16 NÚMERO(5)
int/int32 NÚM(10)
long/int64 NÚM(19)
cadeia NVARCHAR2(2000)
Guid 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 superior
NUMBER(1) para versões anteriores
byte NÚMERO(3)
short/int16 NÚMERO(5)
int/int32 NÚM(10)
decimal NÚMERO(18,2)
long/int64 NÚM(19)
derivar BINARY_FLOAT
duplo BINARY_DOUBLE
DateTime TIMESTAMP(7)
DateTimeOffset TIMESTAMP(7) COM FUSO HORÁRIO
TimeSpan INTERVALO DIA(8) ATÉ SEGUNDO(7)
char NVARCHAR2(1)
char[] NVARCHAR2(2000)
byte[] RAW(2000)
cadeia NVARCHAR2(2000)
Guid RAW(16)

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

Tipo de dados C# Tipo de banco de dados
  • Byte ReadOnlyMemory<>
  • Inserindo<System.Byte>
  • BinaryEmbedding
  • Bytes de inserção<>
  • byte[]
  • System.Byte[]
  • BitArray
VETOR(dimensões, BINÁRIO)
  • ReadOnlyMemory<short>
  • Sistema ReadOnlyMemory.Int16<>
  • Inserindo<curto>
  • Inserindo<System.Int16>
  • short[]
  • System.Int16[]
VECTOR(dimensions, INT8)
  • ReadOnlyMemory<double>
  • ReadOnlyMemory<System.Double>
  • Inserindo<System.Double>
  • Inserindo<duplo>
  • double[]
  • System.Double[]
VECTOR(dimensões, FLOAT64)
  • Float ReadOnlyMemory<>
  • ReadOnlyMemory<System.Float>
  • Inserindo<float>
  • Inserindo<System.Float>
  • float[]
  • System.Float[]
VECTOR(dimensões, FLOAT32)

Substituição do nome da propriedade

Para propriedades de dados e propriedades de vetor, você pode substituir nomes a serem usados no armazenamento que são diferentes dos nomes de propriedades do modelo de dados. A substituição do nome da propriedade ocorre ao definir a opção StorageName nas propriedades do modelo de dados ou na definição de 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 Repositório de Vetores de Banco de Dados Oracle para saber mais:

Mapeamento de dados

O conector do Repositório de Vetores do Banco de Dados Oracle fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Esse mapeador faz uma conversão direta da lista de propriedades no modelo de dados para as colunas do Banco de Dados Oracle a serem convertidas no esquema de armazenamento.

O conector do Repositório de Vetores do Banco de Dados Oracle dá suporte a anotações de modelo de dados e definições de registro. Usando anotações, as informações podem ser fornecidas ao modelo de dados para criar índices e mapeamento de coluna de banco 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 de tipo de dados de chave primária padrão entre o Banco de Dados Oracle e o Python:

Tipo de Python Tipo de SQL do Oracle
Str VARCHAR(n), Usar str(n) na opção de tipo define o comprimento do Oracle VARCHAR como n. Se n não for especificado, o comprimento padrão será 4000.
int NÚM(10)
byte NÚMERO(3)
long NÚM(19)
decimal NÚMERO
derivar BINARY_FLOAT
duplo BINARY_DOUBLE
bool BOOLEAN
Identificador Único Universal (UUID) RAW(16)
date DATE
datetime.datetime TIMESTAMP
datetime.timedelta INTERVALO DE DIA PARA SEGUNDO
Clob CLOB, pode ser especificado explicitamente, não um tipo python nativo
blob BLOB, pode ser especificado explicitamente, não um tipo python nativo
list[str], dict[str, Any] JSON
list[dict[str, Any]] JSON
bytes RAW(2000)

A partir do Oracle Database 23ai, os vetores de banco de dados podem ser mapeados para tipos de dados python. Há suporte para várias colunas de vetor. A tabela a seguir mostra o mapeamento de tipo de propriedade de vetor padrão:

Tipo de Python Tipo de banco de dados
uint8 BINÁRIO
int8 INT8
derivar FLOAT64
float32 FLOAT32
float64 FLOAT64
binário BINÁRIO

Saiba Mais

Consulte os seguintes recursos para saber mais:

Mapeamento de dados

O conector do Repositório de Vetores do Banco de Dados Oracle 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 de banco de dados Oracle a serem convertidas no esquema de armazenamento.

O conector do Repositório de Vetores do Banco de Dados Oracle dá suporte a anotações de modelo de dados e definições de registro. Usando anotações, as informações podem ser fornecidas ao modelo de dados para criar índices e mapeamento de coluna de banco 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 de tipo de dados de chave primária padrão entre o Banco de Dados Oracle e Java, juntamente com os métodos correspondentes para recuperar dados de um ResultSet:

Tipo java Tipo de banco de dados Método ResultSet Getter
byte/Byte NÚMERO(3) resultSet.getByte(name)
curto/curto NÚMERO(5) resultSet.getShort(name)
int/Integer NÚM(10) resultSet.getInt(name)
longo/Long NÚM(19) resultSet.getLong(name)
String 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 junto com os métodos correspondentes para recuperar dados de um ResultSet:

Tipo java Tipo de banco de dados Método ResultSet Getter
boolean 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/Integer NÚM(10) resultSet.getInt(name)
longo/Long NÚM(19) resultSet.getLong(name)
float/Float BINARY_FLOAT resultSet.getFloat(name)
double/Double BINARY_DOUBLE resultSet.getDouble(name)
BigDecimal NÚMERO(18,2) resultSet.getBigDecimal(name)
OffsetDateTime TIMESTAMP(7) COM FUSO HORÁRIO resultSet.getTIMESTAMPTZ(name).offsetDateTimeValue()
String 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. Há suporte para várias colunas de vetor. A tabela a seguir mostra o mapeamento de tipo de propriedade de vetor padrão:

Tipo java Tipo de banco de dados
String VECTOR(%d, FLOAT32)
Coleção<Float> VECTOR(%d, FLOAT32)
Lista<Float> VECTOR(%d, FLOAT32)
Float[] VECTOR(%d, FLOAT32)
float[] VECTOR(%d, FLOAT32)