Partager via


Utilisation du connecteur Oracle Database Vector Store (préversion)

Avertissement

La fonctionnalité oracle Database Vector Store est en préversion et des améliorations nécessitant des modifications cassants peuvent toujours se produire dans des circonstances limitées avant la mise en production.

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion et des améliorations nécessitant des modifications cassants peuvent toujours se produire dans des circonstances limitées avant la mise en production.

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion et des améliorations nécessitant des modifications cassants peuvent toujours se produire dans des circonstances limitées avant la mise en production.

Aperçu

Le connecteur du magasin de vecteurs Oracle Database peut être utilisé pour accéder aux données et les gérer dans Oracle Database. Le connecteur présente les caractéristiques suivantes.

Zone Fonctionnalités Support
Mappages de collection à Table de base de données Oracle
Types de propriétés de clé pris en charge
  • short
  • int
  • long
  • ficelle
  • GUID
Types de propriétés de données pris en charge
  • bool
  • byte
  • short
  • int
  • décimal
  • long
  • flotter
  • double
  • Date et heure
  • DateTimeOffset
  • TimeSpan
  • car
  • char[]
  • byte[]
  • Chaîne
  • GUID
  • et type nullable des types ci-dessus
Types de propriétés vectorielles pris en charge
  • Float ReadOnlyMemory<>
  • Float d’incorporation<>
  • float[]
  • ReadOnlyMemory<double>
  • Incorporation double<>
  • double[]
  • ReadOnlyMemory<short>
  • <Incorporation courte>
  • short[]
  • Octet ReadOnlyMemory<>
  • Incorporation d’octets<>
  • byte[]
  • BitArray
  • BinaryEmbedding
Types d’index pris en charge
  • Plat (par défaut)
  • HNSW
  • IVF
Fonctions de distance prises en charge
  • CosineDistance
    • FLOAT32, FLOAT64 et vecteur INT8 par défaut
  • CosineSimilarity
  • DotProductSimilarity
  • NegativeDotProductSimilarity
  • EuclideanDistance
  • EuclideanSquaredDistance
  • HammingDistance
    • Valeur par défaut du vecteur BINARY
  • ManhattanDistance
  • JaccardSimilarity
    Pour utiliser la similarité Jaccard, définissez la chaîne DistanceFunction sur « JACCARD » ou « JACCARDSIMILARITY » (par exemple, DistanceFunction = « JACCARDSIMILARITY »). Cette valeur respecte la casse. La similarité Jaccard nécessite des vecteurs de format numérique BINARY.
Clauses de filtre prises en charge
  • ==
  • !=
  • <
  • <=
  • >
  • >=
  • List.Contains()
    • Uniquement lorsque vous vérifiez si la propriété du modèle se trouve dans la liste
Prend en charge zéro, un ou plusieurs vecteurs dans un enregistrement Oui
Est-ce queIndexed est pris en charge ? Oui
IsFullTextSearchable pris en charge ? Non
StorageName pris en charge ? Oui
HybridSearch pris en charge ? Non

Important

Les recherches de données vectorielles nécessitent Oracle Database 23ai ou version ultérieure. Toutes les autres fonctionnalités du connecteur Oracle sont disponibles à l’aide d’Oracle Database 19c ou version ultérieure.

Zone Fonctionnalités Support
Mappages de collection à Table d'une base de données Oracle
Types de propriétés de clé pris en charge
  • str
  • int
  • uuid.UUID
Types de propriétés de données pris en charge
  • str
  • int
  • long
  • flotter
  • bool
  • décimal
  • byte
  • bytes
  • uuid.UUID
  • datetime.date
  • datetime.datetime
  • datetime.timedelta
  • liste[str]
  • dict[str, Any]
  • list[dict[str, Any]]
Types de propriétés vectorielles pris en charge
  • list[float]
  • tableau numpy
Types d’index pris en charge
  • HNSW
  • IVF
Fonctions de distance prises en charge
  • COSINE_DISTANCE
  • Distance Euclidienne
  • DISTANCE_CARRÉE_EUCLIDIENNE
  • DOT_PROD
  • HAMMING
  • MANHATTAN
  • DÉFAUT
Clauses de filtre prises en charge Lambdas Python avec comparaisons, opérateurs booléens, méthodes de chaîne (startswith, endswith), entre et datetime, traduites en SQL avec des variables de liaison
Est-ce queIndexed est pris en charge ? Oui
IsFullTextSearchable pris en charge ? Non
StoragePropertyName est-il pris en charge ? Oui
HybridSearch pris en charge ? Non

Important

Les recherches de données vectorielles nécessitent Oracle Database 23ai ou version ultérieure. Toutes les autres fonctionnalités du connecteur Oracle sont disponibles à l’aide d’Oracle Database 19c ou version ultérieure. En outre, python-oracledb 3.3 ou version ultérieure est requis.

Zone Fonctionnalités Support
Clauses de filtre prises en charge
  • AnyTagEqualTo
  • EqualTo
Mappages de collection à Table de base de données SQL
Types de propriétés de clé pris en charge
  • short/Short
  • int/Integer
  • long/long
  • Chaîne
  • UUID (Identifiant Unique Universel)
Types de propriétés de données pris en charge
  • octet/Octet
  • short/Short
  • int/Integer
  • long/long
  • float/nombre flottant
  • double/double
  • décimal/décimal
  • Date et heure
  • OffsetDataTime
  • Timestamp
  • Chaîne
  • UUID (Identifiant Unique Universel)
  • Liste<of all above types>
Types de propriétés vectorielles pris en charge
  • Chaîne
  • Collection<Float>
  • Liste<Float>
  • Float[]
  • float[]
Types d’index pris en charge
  • HNSW
  • IVF
Fonctions de distance prises en charge
  • DOT_PRODUCT
  • SIMILARITÉ COSINUS
  • COSINE_DISTANCE
  • Distance Euclidienne
Prend en charge plusieurs vecteurs dans un enregistrement Oui
Prise en charge de IsIndexed ? Oui
IsFullTextSearchable pris en charge ? Non
StoragePropertyName est-il pris en charge ? Non, utilisez @JsonProperty à la place
HybridSearch pris en charge ? Non

Mise en route

Ajoutez le package NuGet du connecteur Oracle Database Vector Store à votre projet.

dotnet add package Oracle.VectorData --prerelease

Vous pouvez ajouter le magasin de vecteurs au conteneur d’injection de dépendances à l’aide IServiceCollection de méthodes d’extension fournies par le noyau sémantique. Dans ce cas, une instance de la Oracle.VectorData.OracleVectorStore classe est également inscrite auprès du conteneur.

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

Les méthodes d’extension qui ne prennent aucun paramètre ne sont également disponibles. Celles-ci nécessitent qu’une instance de la Oracle.ManagedDataAccess.Client.OracleDataSource classe soit inscrite séparément auprès du conteneur d’injection de dépendances.

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

Vous pouvez construire une instance Oracle Database Vector Store directement avec une source de données personnalisée ou avec une chaîne de connexion.

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

Il est possible de construire une référence directe à une collection nommée avec une source de données personnalisée ou avec une chaîne de connexion.

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

Mise en route

Installez le connecteur Oracle Database Vector Store :

pip install semantic-kernel[oracledb]

Importez les classes OracleSettings, OracleStore et OracleCollection.

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

La classe OracleSettings contient la configuration requise pour créer une connexion asynchrone à Oracle Database. La classe OracleStore est utilisée pour stocker et récupérer des données, tandis que la classe OracleCollection gère et recherche des enregistrements dans une collection. Utilisez ces classes pour configurer 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()

Mise en route

Configurez le connecteur Oracle Database Vector 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();

    }

}

Mappage de données

Le connecteur Oracle Database Vector Store fournit un mappeur par défaut lors du mappage des données du modèle de données au stockage. Ce mappeur effectue une conversion directe de la liste des propriétés du modèle de données vers les colonnes de base de données Oracle à convertir en schéma de stockage.

Le connecteur Oracle Database Vector Store prend en charge les annotations de modèle de données et les définitions d’enregistrements. À l’aide d’annotations, les informations peuvent être fournies au modèle de données pour créer des index et un mappage de colonnes de base de données. À l’aide de définitions d’enregistrements, les informations peuvent être définies et fournies séparément du modèle de données.

Le tableau suivant montre le mappage de type de données de clé primaire par défaut entre Oracle Database et C# :

Type de données C# Type de base de données
short/int16 NUMBER(5)
int/int32 NUMBER(10)
long/int64 NUMBER(19)
ficelle NVARCHAR2(2000)
GUID RAW(16)

Le tableau suivant montre le mappage de type de propriété de données par défaut, y compris les types nullables :

Type de données C# Type de base de données
bool BOOLEAN pour Oracle Database 23ai et versions ultérieures
NUMBER(1) pour les versions antérieures
byte NUMBER(3)
short/int16 NUMBER(5)
int/int32 NUMBER(10)
décimal NUMBER(18,2)
long/int64 NUMBER(19)
flotter BINARY_FLOAT
double BINARY_DOUBLE
Date et heure TIMESTAMP(7)
DateTimeOffset TIMESTAMP(7) AVEC FUSEAU HORAIRE
TimeSpan INTERVALLE JOUR(8) À SECOND(7)
car NVARCHAR2(1)
char[] NVARCHAR2(2000)
byte[] RAW(2000)
ficelle NVARCHAR2(2000)
GUID RAW(16)

À compter d’Oracle Database 23ai, les vecteurs de base de données peuvent être mappés à .NET. types de données. Plusieurs colonnes vectorielles sont prises en charge. Le tableau suivant montre le mappage de type de propriété vectorielle par défaut, y compris les types nullables :

Type de données C# Type de base de données
  • Octet ReadOnlyMemory<>
  • Incorporation de<System.Byte>
  • BinaryEmbedding
  • Incorporation d’octets<>
  • byte[]
  • System.Byte[]
  • BitArray
VECTOR(dimensions, BINAIRE)
  • ReadOnlyMemory<short>
  • ReadOnlyMemory<System.Int16>
  • <Incorporation courte>
  • Incorporation de<System.Int16>
  • short[]
  • System.Int16[]
VECTOR(dimensions, INT8)
  • ReadOnlyMemory<double>
  • ReadOnlyMemory<System.Double>
  • Incorporation de<System.Double>
  • Incorporation double<>
  • double[]
  • System.Double[]
VECTOR(dimensions, FLOAT64)
  • Float ReadOnlyMemory<>
  • ReadOnlyMemory<System.Float>
  • Float d’incorporation<>
  • Incorporation de<System.Float>
  • float[]
  • System.Float[]
VECTEUR(dimensions, FLOAT32)

Remplacement du nom de propriété

Pour les propriétés de données et les propriétés vectorielles, vous pouvez remplacer les noms à utiliser dans le stockage qui sont différents des noms de propriétés du modèle de données. Le remplacement du nom de propriété se produit lors de la définition de l’option StorageName dans les propriétés du modèle de données ou la définition d’enregistrement.

Voici un modèle de données avec StorageName un exemple de code défini et comment cela sera représenté dans une commande 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" )
);

En savoir plus

Pour en savoir plus, consultez les ressources de connecteur Oracle Database Vector Store suivantes :

Mappage des données

Le connecteur Oracle Database Vector Store fournit un mappeur par défaut lors du mappage du modèle de données au stockage. Ce mappeur effectue une conversion directe de la liste des propriétés du modèle de données vers les colonnes Oracle Database à convertir en schéma de stockage.

Le connecteur Oracle Database Vector Store prend en charge les annotations de modèle de données et les définitions d’enregistrements. À l’aide d’annotations, les informations peuvent être fournies au modèle de données pour créer des index et un mappage de colonnes de base de données. À l’aide de définitions d’enregistrements, les informations peuvent être définies et fournies séparément du modèle de données.

Le tableau suivant montre le mappage de type de données de clé primaire par défaut entre Oracle Database et Python :

Python Type Oracle SQL Type
str VARCHAR(n), Utilisation de str(n) dans l’option de type définit la longueur Oracle VARCHAR sur n. Si n n’est pas spécifié, la longueur par défaut est 4 000.
int NUMBER(10)
byte NUMBER(3)
long NUMBER(19)
décimal NOMBRE
flotter BINARY_FLOAT
double BINARY_DOUBLE
bool BOOLEAN
UUID (Identifiant Unique Universel) RAW(16)
date DATE
datetime.datetime TIMESTAMP
datetime.timedelta INTERVALLE DE JOUR À SECONDE
Clob CLOB, peut être spécifié explicitement, et non pas un type Python natif
objet BLOB BLOB, peut être spécifié explicitement, et non pas un type Python natif
list[str], dict[str, Any] JSON
list[dict[str, Any]] JSON
bytes RAW(2000)

À compter d’Oracle Database 23ai, les vecteurs de base de données peuvent être mappés aux types de données Python. Plusieurs colonnes vectorielles sont prises en charge. Le tableau suivant montre le mappage de type de propriété vectorielle par défaut :

Python Type Type de base de données
uint8 BINARY
int8 INT8
flotter FLOAT64
float32 FLOAT32
float64 FLOAT64
binaire BINARY

En savoir plus

Pour en savoir plus, consultez les ressources suivantes :

Mappage de données

Le connecteur Oracle Database Vector Store fournit un mappeur par défaut lors du mappage des données du modèle de données au stockage. Ce mappeur effectue une conversion directe de la liste des propriétés du modèle de données vers les colonnes de base de données Oracle à convertir en schéma de stockage.

Le connecteur Oracle Database Vector Store prend en charge les annotations de modèle de données et les définitions d’enregistrements. À l’aide d’annotations, les informations peuvent être fournies au modèle de données pour créer des index et un mappage de colonnes de base de données. À l’aide de définitions d’enregistrements, les informations peuvent être définies et fournies séparément du modèle de données.

Le tableau suivant présente le mappage de type de données de clé primaire par défaut entre Oracle Database et Java, ainsi que les méthodes correspondantes pour récupérer des données à partir d’un ResultSet:

Java Type Type de base de données Méthode de récupération de ResultSet
octet/Octet NUMBER(3) resultSet.getByte(name)
short/Short NUMBER(5) resultSet.getShort(name)
int/Integer NUMBER(10) resultSet.getInt(name)
long/long NUMBER(19) resultSet.getLong(name)
Chaîne NVARCHAR2(2000) resultSet.getString(name)
UUID (Identifiant Unique Universel) RAW(16) resultSet.getObject(name, java_type)

Le tableau suivant présente le mappage de type de propriété de données par défaut, ainsi que les méthodes correspondantes pour récupérer des données à partir d’un ResultSet:

Java Type Type de base de données Méthode de récupération de ResultSet
boolean BOOLEAN resultSet.getByte(name)
octet/Octet NUMBER(3) resultSet.getByte(name)
byte[] RAW(2000) resultSet.getBytes(name)
short/Short NUMBER(5) resultSet.getShort(name)
int/Integer NUMBER(10) resultSet.getInt(name)
long/long NUMBER(19) resultSet.getLong(name)
float/nombre flottant BINARY_FLOAT resultSet.getFloat(name)
double/double BINARY_DOUBLE resultSet.getDouble(name)
BigDecimal NUMBER(18,2) resultSet.getBigDecimal(name)
OffsetDateTime TIMESTAMP(7) AVEC FUSEAU HORAIRE resultSet.getTIMESTAMPTZ(name).offsetDateTimeValue()
Chaîne CLOB/NVARCHAR2(%s) resultSet.getString(name)
UUID (Identifiant Unique Universel) RAW(16) resultSet.getObject(name, java_type)
Liste<T> JSON resultSet.getObject(name, java_type) Utilisant ojdbc-extensions-jackson-oson

À compter d’Oracle Database 23ai, les vecteurs de base de données peuvent être mappés aux types de données Java. Plusieurs colonnes vectorielles sont prises en charge. Le tableau suivant montre le mappage de type de propriété vectorielle par défaut :

Java Type Type de base de données
Chaîne VECTEUR(%d, FLOAT32)
Collection<Float> VECTEUR(%d, FLOAT32)
Liste<Float> VECTEUR(%d, FLOAT32)
Float[] VECTEUR(%d, FLOAT32)
float[] VECTEUR(%d, FLOAT32)