Definizione del modello di dati (anteprima)
Avviso
La funzionalità di archiviazione vettoriale del kernel semantico è in anteprima e i miglioramenti che richiedono modifiche di rilievo possono ancora verificarsi in circostanze limitate prima del rilascio.
Panoramica
I connettori dell'archivio vettoriale del kernel semantico usano un approccio basato sul modello per interagire con i database.
Tutti i metodi per eseguire l'upsert o ottenere i record usano classi di modelli fortemente tipizzato. Le proprietà di queste classi sono decorate con attributi che indicano lo scopo di ogni proprietà.
Suggerimento
Per un'alternativa all'uso degli attributi, fare riferimento alla definizione dello schema con una definizione di record.
Suggerimento
Per un'alternativa alla definizione del proprio modello di dati, fare riferimento all'uso delle astrazioni di Vector Store senza definire il proprio modello di dati.
Di seguito è riportato un esempio di modello decorato con questi attributi.
using Microsoft.Extensions.VectorData;
public class Hotel
{
[VectorStoreRecordKey]
public ulong HotelId { get; set; }
[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }
[VectorStoreRecordData(IsFullTextSearchable = true)]
public string Description { get; set; }
[VectorStoreRecordVector(4, DistanceFunction.CosineDistance, IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
[VectorStoreRecordData(IsFilterable = true)]
public string[] Tags { get; set; }
}
Attributi
VectorStoreRecordKeyAttribute
Utilizzare questo attributo per indicare che la proprietà è la chiave del record.
[VectorStoreRecordKey]
public ulong HotelId { get; set; }
Parametri VectorStoreRecordKeyAttribute
Parametro | Richiesto | Descrizione |
---|---|---|
StoragePropertyName | No | Può essere utilizzato per specificare un nome alternativo per la proprietà nel database. Si noti che questo parametro non è supportato da tutti i connettori, ad esempio se le alternative come JsonPropertyNameAttribute sono supportate. |
Suggerimento
Per altre informazioni sui connettori che supportano StoragePropertyName e sulle alternative disponibili, vedere la documentazione per ogni connettore.
VectorStoreRecordDataAttribute
Utilizzare questo attributo per indicare che la proprietà contiene dati generali che non sono una chiave o un vettore.
[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }
Parametri VectorStoreRecordDataAttribute
Parametro | Richiesto | Descrizione |
---|---|---|
IsFilterable | No | Indica se la proprietà deve essere indicizzata per il filtro nei casi in cui un database richiede il consenso esplicito per l'indicizzazione per proprietà. Il valore predefinito è false. |
IsFullTextSearchable | No | Indica se la proprietà deve essere indicizzata per la ricerca full-text per i database che supportano la ricerca full-text. Il valore predefinito è false. |
StoragePropertyName | No | Può essere utilizzato per specificare un nome alternativo per la proprietà nel database. Si noti che questo parametro non è supportato da tutti i connettori, ad esempio se le alternative come JsonPropertyNameAttribute sono supportate. |
Suggerimento
Per altre informazioni sui connettori che supportano StoragePropertyName e sulle alternative disponibili, vedere la documentazione per ogni connettore.
VectorStoreRecordVectorAttribute
Utilizzare questo attributo per indicare che la proprietà contiene un vettore.
[VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance, IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
Parametri VectorStoreRecordVectorAttribute
Parametro | Richiesto | Descrizione |
---|---|---|
Dimensioni | Sì per la creazione della raccolta, facoltativo in caso contrario | Numero di dimensioni del vettore. Questa operazione è in genere necessaria quando si crea un indice vettoriale per una raccolta. |
IndexKind | No | Tipo di indice con cui indicizzare il vettore. Il valore predefinito varia in base al tipo di archivio vettoriale. |
DistanceFunction | No | Tipo di funzione di distanza da usare quando si esegue il confronto tra vettori durante la ricerca vettoriale su questo vettore. Il valore predefinito varia in base al tipo di archivio vettoriale. |
StoragePropertyName | No | Può essere utilizzato per specificare un nome alternativo per la proprietà nel database. Si noti che questo parametro non è supportato da tutti i connettori, ad esempio se le alternative come JsonPropertyNameAttribute sono supportate. |
I tipi di funzione di indice e di distanza comuni vengono forniti come valori statici nelle Microsoft.SemanticKernel.Data.IndexKind
classi e Microsoft.SemanticKernel.Data.DistanceFunction
.
Le singole implementazioni di Vector Store possono anche usare i propri tipi di indice e funzioni di distanza, in cui il database supporta tipi insoliti.
Suggerimento
Per altre informazioni sui connettori che supportano StoragePropertyName e sulle alternative disponibili, vedere la documentazione per ogni connettore.
Tutti i metodi per eseguire l'upsert o ottenere i record usano una classe e una definizione di record dell'archivio vettoriale.
Questa operazione può essere eseguita definendo la propria classe con annotazioni per i campi o usando una classe/tipo in combinazione con una definizione di record. Due cose devono essere eseguite per una classe, la prima consiste nell'aggiungere le annotazioni con i tipi di campo, la seconda consiste nel decorare la classe con l'elemento vectorstoremodel
decorator.
Suggerimento
Per l'approccio alternativo usando una definizione di record, fare riferimento alla definizione dello schema con una definizione di record.
Di seguito è riportato un esempio di modello decorato con queste annotazioni.
from dataclasses import dataclass, field
from typing import Annotated
from semantic_kernel.data import (
DistanceFunction,
IndexKind,
VectorStoreRecordDataField,
VectorStoreRecordDefinition,
VectorStoreRecordKeyField,
VectorStoreRecordVectorField,
vectorstoremodel,
)
@vectorstoremodel
@dataclass
class Hotel:
hotel_id: Annotated[str, VectorStoreRecordKeyField()] = field(default_factory=lambda: str(uuid4()))
hotel_name: Annotated[str, VectorStoreRecordDataField(is_filterable=True)]
description: Annotated[str, VectorStoreRecordDataField(is_full_text_searchable=True)]
description_embedding: Annotated[list[float], VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)]
tags: Annotated[list[str], VectorStoreRecordDataField(is_filterable=True)]
Suggerimento
La definizione di una classe con queste annotazioni può essere eseguita in diversi modi, uno dei quali usa il dataclasses
modulo in Python, illustrato di seguito. Questo esempio mostra anche altri approcci (usando le classi BaseModel pydantic e python di vaniglia).
Annotazioni
Esistono tre tipi di annotazioni da usare e hanno una classe base comune.
VectorStoreRecordField
Questa è la classe base per tutte le annotazioni, non deve essere usata direttamente.
Parametri VectorStoreRecordField
Parametro | Richiesto | Descrizione |
---|---|---|
name | No | Può essere aggiunto direttamente, ma verrà impostato durante l'analisi del modello. |
property_type | No | Deve essere una stringa, verrà anche derivata durante l'analisi. |
Suggerimento
Le annotazioni vengono analizzate dall'elemento vectorstoremodel
Decorator e una delle operazioni eseguite consiste nel creare una definizione di record per la classe, pertanto non è necessario creare un'istanza di una classe di campo quando non vengono impostati parametri, il campo può essere annotato con solo la classe , come illustrato di seguito:
hotel_id: Annotated[str, VectorStoreRecordKeyField]
VectorStoreRecordKeyField
Utilizzare questa annotazione per indicare che questo attributo è la chiave del record.
VectorStoreRecordKeyField()
Parametri VectorStoreRecordKeyField
Non sono definiti altri parametri all'esterno della classe di base.
VectorStoreRecordDataField
Usare questa annotazione per indicare che l'attributo contiene dati generali che non sono una chiave o un vettore.
VectorStoreRecordDataField(is_filterable=True)
Parametri VectorStoreRecordDataField
Parametro | Richiesto | Descrizione |
---|---|---|
has_embedding | No | Indica se alla proprietà è associato un incorporamento, il valore predefinito è Nessuno. |
embedding_property_name | No | Il nome della proprietà che contiene l'incorporamento, il valore predefinito è Nessuno. |
is_filterable | No | Indica se la proprietà deve essere indicizzata per il filtro nei casi in cui un database richiede il consenso esplicito per l'indicizzazione per proprietà. Il valore predefinito è false. |
is_full_text_searchable | No | Indica se la proprietà deve essere indicizzata per la ricerca full-text per i database che supportano la ricerca full-text. Il valore predefinito è false. |
VectorStoreRecordVectorField
Usare questa annotazione per indicare che l'attributo contiene un vettore.
VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)
Parametri VectorStoreRecordVectorField
Parametro | Richiesto | Descrizione |
---|---|---|
dimensioni | Sì per la creazione della raccolta, facoltativo in caso contrario | Numero di dimensioni del vettore. Questa operazione è in genere necessaria quando si crea un indice vettoriale per una raccolta. |
index_kind | No | Tipo di indice con cui indicizzare il vettore. Il valore predefinito varia in base al tipo di archivio vettoriale. |
distance_function | No | Tipo di funzione di distanza da usare quando si esegue il confronto tra vettori durante la ricerca vettoriale su questo vettore. Il valore predefinito varia in base al tipo di archivio vettoriale. |
local_embedding | No | Indica se alla proprietà è associato un incorporamento locale, il valore predefinito è Nessuno. |
embedding_settings | No | Le impostazioni per l'incorporamento, sotto forma di dict con service_id come chiave e PromptExecutionSettings come valore, il valore predefinito è Nessuno. |
serialize_function | No | Funzione da usare per serializzare il vettore, se il tipo non è un elenco[float | int] questa funzione è necessaria o l'intero modello deve essere serializzato. |
deserialize_function | No | Funzione da usare per deserializzare il vettore, se il tipo non è un elenco[float | int] questa funzione è necessaria o l'intero modello deve essere deserializzato. |
I tipi di funzione di indice e di distanza comuni vengono forniti come valori statici nelle semantic_kernel.data.IndexKind
classi e semantic_kernel.data.DistanceFunction
.
Le singole implementazioni di Vector Store possono anche usare i propri tipi di indice e funzioni di distanza, in cui il database supporta tipi insoliti.
Tutti i metodi per eseguire l'upsert o ottenere i record usano classi di modelli fortemente tipizzato. I campi di queste classi sono decorati con annotazioni che indicano lo scopo di ogni campo.
Suggerimento
Per un'alternativa all'uso degli attributi, fare riferimento alla definizione dello schema con una definizione di record.
Di seguito è riportato un esempio di modello decorato con queste annotazioni. Per impostazione predefinita, la maggior parte degli archivi vettoriali predefiniti usa Jackson, quindi è una procedura consigliata per garantire che l'oggetto modello possa essere serializzato da Jackson, ovvero la classe è visibile, ha getter, costruttore, annotazioni e così via.
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordData;
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordKey;
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordVector;
import com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction;
import com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind;
import java.util.List;
public class Hotel {
@VectorStoreRecordKey
private String hotelId;
@VectorStoreRecordData(isFilterable = true)
private String name;
@VectorStoreRecordData(isFullTextSearchable = true)
private String description;
@VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
private List<Float> descriptionEmbedding;
@VectorStoreRecordData(isFilterable = true)
private List<String> tags;
public Hotel() { }
public Hotel(String hotelId, String name, String description, List<Float> descriptionEmbedding, List<String> tags) {
this.hotelId = hotelId;
this.name = name;
this.description = description;
this.descriptionEmbedding = descriptionEmbedding;
this.tags = tags;
}
public String getHotelId() { return hotelId; }
public String getName() { return name; }
public String getDescription() { return description; }
public List<Float> getDescriptionEmbedding() { return descriptionEmbedding; }
public List<String> getTags() { return tags; }
}
Annotazioni
VectorStoreRecordKey
Utilizzare questa annotazione per indicare che il campo è la chiave del record.
@VectorStoreRecordKey
private String hotelId;
Parametri VectorStoreRecordKey
Parametro | Richiesto | Descrizione |
---|---|---|
storageName | No | Può essere usato per specificare un nome alternativo per il campo nel database. Si noti che questo parametro non è supportato da tutti i connettori, ad esempio in cui viene usato Jackson, in tal caso il nome di archiviazione può essere specificato usando le annotazioni Jackson. |
Suggerimento
Per altre informazioni sui connettori che supportano storageName e sulle alternative disponibili, vedere la documentazione per ogni connettore.
VectorStoreRecordData
Usare questa annotazione per indicare che il campo contiene dati generali che non sono una chiave o un vettore.
@VectorStoreRecordData(isFilterable = true)
private String name;
Parametri VectorStoreRecordData
Parametro | Richiesto | Descrizione |
---|---|---|
isFilterable | No | Indica se il campo deve essere indicizzato per filtrare nei casi in cui un database richiede il consenso esplicito per l'indicizzazione per campo. Il valore predefinito è false. |
isFullTextSearchable | No | Indica se il campo deve essere indicizzato per la ricerca full-text per i database che supportano la ricerca full-text. Il valore predefinito è false. |
storageName | No | Può essere usato per specificare un nome alternativo per il campo nel database. Si noti che questo parametro non è supportato da tutti i connettori, ad esempio in cui viene usato Jackson, in tal caso il nome di archiviazione può essere specificato usando le annotazioni Jackson. |
Suggerimento
Per altre informazioni sui connettori che supportano storageName e sulle alternative disponibili, vedere la documentazione per ogni connettore.
VectorStoreRecordVector
Usare questa annotazione per indicare che il campo contiene un vettore.
@VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
private List<Float> descriptionEmbedding;
Parametri VectorStoreRecordVector
Parametro | Richiesto | Descrizione |
---|---|---|
dimensioni | Sì per la creazione della raccolta, facoltativo in caso contrario | Numero di dimensioni del vettore. Questa operazione è in genere necessaria quando si crea un indice vettoriale per una raccolta. |
indexKind | No | Tipo di indice con cui indicizzare il vettore. Il valore predefinito varia in base al tipo di archivio vettoriale. |
distanceFunction | No | Tipo di funzione di distanza da usare quando si esegue il confronto tra vettori durante la ricerca vettoriale su questo vettore. Il valore predefinito varia in base al tipo di archivio vettoriale. |
storageName | No | Può essere usato per specificare un nome alternativo per il campo nel database. Si noti che questo parametro non è supportato da tutti i connettori, ad esempio in cui viene usato Jackson, in tal caso il nome di archiviazione può essere specificato usando le annotazioni Jackson. |
I tipi di funzione di indice e di distanza comuni vengono forniti nelle com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind
enumerazioni e com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction
.
Le singole implementazioni di Vector Store possono anche usare i propri tipi di indice e funzioni di distanza, in cui il database supporta tipi insoliti.
Suggerimento
Per altre informazioni sui connettori che supportano storageName e sulle alternative disponibili, vedere la documentazione per ogni connettore.
Altre informazioni saranno presto disponibili.