Definieren des Datenmodells (Vorschau)
Warnung
Die Funktionalität des semantischen Kernelvektorspeichers befindet sich in der Vorschau, und Verbesserungen, die fehlerhafte Änderungen erfordern, können unter begrenzten Umständen noch vor der Veröffentlichung auftreten.
Übersicht
Die Connectors für den semantischen Kernelvektorspeicher verwenden zunächst einen Modellansatz für die Interaktion mit Datenbanken.
Alle Methoden zum Upsertieren oder Abrufen von Datensätzen verwenden stark typierte Modellklassen. Die Eigenschaften für diese Klassen sind mit Attributen versehen, die den Zweck jeder Eigenschaft angeben.
Tipp
Eine Alternative zur Verwendung von Attributen finden Sie unter Definieren des Schemas mit einer Datensatzdefinition.
Tipp
Eine Alternative zum Definieren Ihres eigenen Datenmodells finden Sie unter Verwendung von Vector Store-Abstraktionen, ohne ihr eigenes Datenmodell zu definieren.
Hier ist ein Beispiel für ein Modell, das mit diesen Attributen versehen ist.
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; }
}
Attribute
VectorStoreRecordKeyAttribute
Verwenden Sie dieses Attribut, um anzugeben, dass Ihre Eigenschaft der Schlüssel des Datensatzes ist.
[VectorStoreRecordKey]
public ulong HotelId { get; set; }
VectorStoreRecordKeyAttribute-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
StoragePropertyName | No | Kann verwendet werden, um einen alternativen Namen für die Eigenschaft in der Datenbank anzugeben. Beachten Sie, dass dieser Parameter nicht von allen Connectors unterstützt wird, z. B. wenn Alternativen wie JsonPropertyNameAttribute unterstützt werden. |
Tipp
Weitere Informationen dazu, welche Connectors StoragePropertyName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.
VectorStoreRecordDataAttribute
Verwenden Sie dieses Attribut, um anzugeben, dass Ihre Eigenschaft allgemeine Daten enthält, bei denen es sich nicht um einen Schlüssel oder einen Vektor handelt.
[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }
VectorStoreRecordDataAttribute-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
IsFilterable | No | Gibt an, ob die Eigenschaft für die Filterung indiziert werden soll, wenn eine Datenbank die Indizierung pro Eigenschaft erfordert. Standardwert ist „falsch“. |
IsFullTextSearchable | No | Gibt an, ob die Eigenschaft für die Volltextsuche für Datenbanken indiziert werden soll, die die Volltextsuche unterstützen. Standardwert ist „falsch“. |
StoragePropertyName | No | Kann verwendet werden, um einen alternativen Namen für die Eigenschaft in der Datenbank anzugeben. Beachten Sie, dass dieser Parameter nicht von allen Connectors unterstützt wird, z. B. wenn Alternativen wie JsonPropertyNameAttribute unterstützt werden. |
Tipp
Weitere Informationen dazu, welche Connectors StoragePropertyName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.
VectorStoreRecordVectorAttribute
Verwenden Sie dieses Attribut, um anzugeben, dass Ihre Eigenschaft einen Vektor enthält.
[VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance, IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
VectorStoreRecordVectorAttribute-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
Dimensionen | Ja für sammlungserstellung, andernfalls optional | Die Anzahl der Dimensionen, die der Vektor hat. Dies ist in der Regel erforderlich, wenn ein Vektorindex für eine Auflistung erstellt wird. |
IndexKind | No | Der Indextyp, mit dem der Vektor indiziert werden soll. Der Standardwert variiert je nach Vektorspeichertyp. |
DistanceFunction | No | Der Typ der Entfernungsfunktion, die beim Vektorvergleich während der Vektorsuche über diesen Vektor verwendet werden soll. Der Standardwert variiert je nach Vektorspeichertyp. |
StoragePropertyName | No | Kann verwendet werden, um einen alternativen Namen für die Eigenschaft in der Datenbank anzugeben. Beachten Sie, dass dieser Parameter nicht von allen Connectors unterstützt wird, z. B. wenn Alternativen wie JsonPropertyNameAttribute unterstützt werden. |
Allgemeine Indextypen und Abstandsfunktionstypen werden als statische Werte für die Microsoft.SemanticKernel.Data.IndexKind
Klassen und Microsoft.SemanticKernel.Data.DistanceFunction
Klassen bereitgestellt.
Einzelne Vector Store-Implementierungen können auch eigene Indextypen und Entfernungsfunktionen verwenden, bei denen die Datenbank ungewöhnliche Typen unterstützt.
Tipp
Weitere Informationen dazu, welche Connectors StoragePropertyName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.
Alle Methoden zum Upsertieren oder Abrufen von Datensätzen verwenden eine Klasse und eine Vektorspeicherdatensatzdefinition.
Dazu können Sie eine eigene Klasse mit Anmerkungen für die Felder definieren oder eine Klasse/einen Typ in Kombination mit einer Datensatzdefinition verwenden. Zwei Dinge müssen für eine Klasse durchgeführt werden, der erste besteht darin, die Anmerkungen mit den Feldtypen hinzuzufügen, die zweite besteht darin, die Klasse mit dem vectorstoremodel
Dekorateur zu dekorieren.
Tipp
Informationen zum alternativen Ansatz mithilfe einer Datensatzdefinition finden Sie unter Definieren des Schemas mit einer Datensatzdefinition.
Hier ist ein Beispiel für ein Modell, das mit diesen Anmerkungen versehen ist.
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)]
Tipp
Das Definieren einer Klasse mit diesen Anmerkungen kann auf mehrere Arten erfolgen, von denen eines das dataclasses
Modul in Python verwendet, das hier gezeigt wird. In diesem Beispiel werden auch andere Ansätze (unter Verwendung von Pydantic BaseModels und Vanilla Python-Klassen) gezeigt.
Anmerkungen
Es gibt drei Arten von Anmerkungen, die verwendet werden sollen, und sie verfügen über eine gemeinsame Basisklasse.
VectorStoreRecordField
Dies ist die Basisklasse für alle Anmerkungen, die nicht direkt verwendet werden sollen.
VectorStoreRecordField-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
name | No | Kann direkt hinzugefügt werden, wird aber während der Analyse des Modells festgelegt. |
property_type | No | Sollte eine Zeichenfolge sein, wird auch während der Analyse abgeleitet. |
Tipp
Die Anmerkungen werden vom vectorstoremodel
Dekorateur analysiert und einer der Dinge, die es tut, besteht darin, eine Datensatzdefinition für die Klasse zu erstellen, daher ist es nicht erforderlich, eine Feldklasse zu instanziieren, wenn keine Parameter festgelegt werden, kann das Feld mit nur der Klasse kommentiert werden, wie hier:
hotel_id: Annotated[str, VectorStoreRecordKeyField]
VectorStoreRecordKeyField
Verwenden Sie diese Anmerkung, um anzugeben, dass dieses Attribut der Schlüssel des Datensatzes ist.
VectorStoreRecordKeyField()
VectorStoreRecordKeyField-Parameter
Es werden keine anderen Parameter außerhalb der Basisklasse definiert.
VectorStoreRecordDataField
Verwenden Sie diese Anmerkung, um anzugeben, dass Ihr Attribut allgemeine Daten enthält, bei denen es sich nicht um einen Schlüssel oder einen Vektor handelt.
VectorStoreRecordDataField(is_filterable=True)
VectorStoreRecordDataField-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
has_embedding | No | Gibt an, ob der Eigenschaft eine Einbettung zugeordnet ist, standardmäßig "None". |
embedding_property_name | No | Der Name der Eigenschaft, die die Einbettung enthält, ist "None". |
is_filterable | No | Gibt an, ob die Eigenschaft für die Filterung indiziert werden soll, wenn eine Datenbank die Indizierung pro Eigenschaft erfordert. Standardwert ist „falsch“. |
is_full_text_searchable | No | Gibt an, ob die Eigenschaft für die Volltextsuche für Datenbanken indiziert werden soll, die die Volltextsuche unterstützen. Standardwert ist „falsch“. |
VectorStoreRecordVectorField
Verwenden Sie diese Anmerkung, um anzugeben, dass Ihr Attribut einen Vektor enthält.
VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)
VectorStoreRecordVectorField-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
Dimensionen | Ja für sammlungserstellung, andernfalls optional | Die Anzahl der Dimensionen, die der Vektor hat. Dies ist in der Regel erforderlich, wenn ein Vektorindex für eine Auflistung erstellt wird. |
index_kind | No | Der Indextyp, mit dem der Vektor indiziert werden soll. Der Standardwert variiert je nach Vektorspeichertyp. |
distance_function | No | Der Typ der Entfernungsfunktion, die beim Vektorvergleich während der Vektorsuche über diesen Vektor verwendet werden soll. Der Standardwert variiert je nach Vektorspeichertyp. |
local_embedding | No | Gibt an, ob die Eigenschaft eine lokale Einbettung zugeordnet ist, standardmäßig "None". |
embedding_settings | No | Die Einstellungen für das Einbetten in Form eines Diktats mit service_id als Schlüssel und PromptExecutionSettings als Wert lautet "None". |
serialize_function | No | Die Funktion, die zum Serialisieren des Vektors verwendet werden soll, wenn der Typ keine Liste[float | int] ist, ist diese Funktion erforderlich, oder das gesamte Modell muss serialisiert werden. |
deserialize_function | No | Die Funktion, die zum Deserialisieren des Vektors verwendet werden soll, wenn der Typ keine Liste[float | int] ist, ist diese Funktion erforderlich, oder das gesamte Modell muss deserialisiert werden. |
Allgemeine Indextypen und Abstandsfunktionstypen werden als statische Werte für die semantic_kernel.data.IndexKind
Klassen und semantic_kernel.data.DistanceFunction
Klassen bereitgestellt.
Einzelne Vector Store-Implementierungen können auch eigene Indextypen und Entfernungsfunktionen verwenden, bei denen die Datenbank ungewöhnliche Typen unterstützt.
Alle Methoden zum Upsertieren oder Abrufen von Datensätzen verwenden stark typierte Modellklassen. Die Felder dieser Klassen sind mit Anmerkungen versehen, die den Zweck jedes Felds angeben.
Tipp
Eine Alternative zur Verwendung von Attributen finden Sie unter Definieren des Schemas mit einer Datensatzdefinition.
Hier ist ein Beispiel für ein Modell, das mit diesen Anmerkungen versehen ist. Standardmäßig verwenden die meisten out-box-Vektorspeicher Jackson, daher ist eine bewährte Methode, um sicherzustellen, dass das Modellobjekt von Jackson serialisiert werden kann, d. h. die Klasse ist sichtbar, hat Getters, Konstruktor, Anmerkungen usw.
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; }
}
Anmerkungen
VectorStoreRecordKey
Verwenden Sie diese Anmerkung, um anzugeben, dass Ihr Feld der Schlüssel des Datensatzes ist.
@VectorStoreRecordKey
private String hotelId;
VectorStoreRecordKey-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
storageName | No | Kann verwendet werden, um einen alternativen Namen für das Feld in der Datenbank anzugeben. Beachten Sie, dass dieser Parameter nicht von allen Connectors unterstützt wird, z. B. wo Jackson verwendet wird, in diesem Fall kann der Speichername mithilfe von Jackson-Anmerkungen angegeben werden. |
Tipp
Weitere Informationen dazu, welche Connectors storageName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.
VectorStoreRecordData
Verwenden Sie diese Anmerkung, um anzugeben, dass Ihr Feld allgemeine Daten enthält, bei denen es sich nicht um einen Schlüssel oder einen Vektor handelt.
@VectorStoreRecordData(isFilterable = true)
private String name;
VectorStoreRecordData-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
isFilterable | No | Gibt an, ob das Feld für die Filterung indiziert werden soll, wenn eine Datenbank die Indizierung pro Feld erfordert. Standardwert ist „falsch“. |
isFullTextSearchable | No | Gibt an, ob das Feld für die Volltextsuche für Datenbanken indiziert werden soll, die die Volltextsuche unterstützen. Standardwert ist „falsch“. |
storageName | No | Kann verwendet werden, um einen alternativen Namen für das Feld in der Datenbank anzugeben. Beachten Sie, dass dieser Parameter nicht von allen Connectors unterstützt wird, z. B. wo Jackson verwendet wird, in diesem Fall kann der Speichername mithilfe von Jackson-Anmerkungen angegeben werden. |
Tipp
Weitere Informationen dazu, welche Connectors storageName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.
VectorStoreRecordVector
Verwenden Sie diese Anmerkung, um anzugeben, dass Ihr Feld einen Vektor enthält.
@VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
private List<Float> descriptionEmbedding;
VectorStoreRecordVector-Parameter
Parameter | Erforderlich | Beschreibung |
---|---|---|
Dimensionen | Ja für sammlungserstellung, andernfalls optional | Die Anzahl der Dimensionen, die der Vektor hat. Dies ist in der Regel erforderlich, wenn ein Vektorindex für eine Auflistung erstellt wird. |
indexKind | No | Der Indextyp, mit dem der Vektor indiziert werden soll. Der Standardwert variiert je nach Vektorspeichertyp. |
distanceFunction | No | Der Typ der Entfernungsfunktion, die beim Vektorvergleich während der Vektorsuche über diesen Vektor verwendet werden soll. Der Standardwert variiert je nach Vektorspeichertyp. |
storageName | No | Kann verwendet werden, um einen alternativen Namen für das Feld in der Datenbank anzugeben. Beachten Sie, dass dieser Parameter nicht von allen Connectors unterstützt wird, z. B. wo Jackson verwendet wird, in diesem Fall kann der Speichername mithilfe von Jackson-Anmerkungen angegeben werden. |
Allgemeine Indextypen und Abstandsfunktionstypen werden für die com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind
Enumerationen und com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction
Enumerationen bereitgestellt.
Einzelne Vector Store-Implementierungen können auch eigene Indextypen und Entfernungsfunktionen verwenden, bei denen die Datenbank ungewöhnliche Typen unterstützt.
Tipp
Weitere Informationen dazu, welche Connectors storageName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.
Weitere Informationen werden in Kürze verfügbar sein.