Freigeben über


Definieren des Speicherschemas mithilfe einer Datensatzdefinition (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 und ermöglichen das Kommentieren von Datenmodellen mit Informationen, die zum Erstellen von Indizes oder zum Zuordnen von Daten zum Datenbankschema erforderlich sind.

Eine weitere Möglichkeit, diese Informationen bereitzustellen, ist über Datensatzdefinitionen, die separat für das Datenmodell definiert und bereitgestellt werden können. Dies kann in mehreren Szenarien nützlich sein:

  • Es kann vorkommen, dass ein Entwickler dasselbe Datenmodell mit mehr als einer Konfiguration verwenden möchte.
  • Es kann vorkommen, dass der Entwickler Daten mit einem sehr anderen Schema für das Modell speichern möchte und einen benutzerdefinierten Mapper für die Konvertierung zwischen dem Datenmodell und dem Speicherschema bereitstellen möchte.
  • Es kann ein Fall geben, in dem ein Entwickler einen integrierten Typ verwenden möchte, z. B. ein Diktat oder ein optimiertes Format wie ein Dataframe und dennoch die Funktionalität des Vektorspeichers nutzen möchte.

Hier ist ein Beispiel zum Erstellen einer Datensatzdefinition.

using Microsoft.Extensions.VectorData;

var hotelDefinition = new VectorStoreRecordDefinition
{
    Properties = new List<VectorStoreRecordProperty>
    {
        new VectorStoreRecordKeyProperty("HotelId", typeof(ulong)),
        new VectorStoreRecordDataProperty("HotelName", typeof(string)) { IsFilterable = true },
        new VectorStoreRecordDataProperty("Description", typeof(string)) { IsFullTextSearchable = true },
        new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 4, DistanceFunction = DistanceFunction.CosineDistance, IndexKind = IndexKind.Hnsw },
    }
};

Beim Erstellen einer Definition müssen Sie immer einen Namen und Typ für jede Eigenschaft in Ihrem Schema angeben, da dies für die Indexerstellung und die Datenzuordnung erforderlich ist.

Um die Definition zu verwenden, übergeben Sie sie an die GetCollection-Methode.

var collection = vectorStore.GetCollection<ulong, Hotel>("skhotels", hotelDefinition);

Konfigurationsklassen für Datensatzeigenschaften

VectorStoreRecordKeyProperty

Verwenden Sie diese Klasse, um anzugeben, dass Ihre Eigenschaft der Schlüssel des Datensatzes ist.

new VectorStoreRecordKeyProperty("HotelId", typeof(ulong)),

VectorStoreRecordKeyProperty-Konfigurationseinstellungen

Parameter Erforderlich Beschreibung
DataModelPropertyName Ja Der Name der Eigenschaft für das Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
PropertyType Ja Der Typ der Eigenschaft für das Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
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.

VectorStoreRecordDataProperty

Verwenden Sie diese Klasse, um anzugeben, dass Ihre Eigenschaft allgemeine Daten enthält, die kein Schlüssel oder ein Vektor sind.

new VectorStoreRecordDataProperty("HotelName", typeof(string)) { IsFilterable = true },

VectorStoreRecordDataProperty-Konfigurationseinstellungen

Parameter Erforderlich Beschreibung
DataModelPropertyName Ja Der Name der Eigenschaft für das Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
PropertyType Ja Der Typ der Eigenschaft für das Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
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.

VectorStoreRecordVectorProperty

Verwenden Sie diese Klasse, um anzugeben, dass Ihre Eigenschaft einen Vektor enthält.

new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 4, DistanceFunction = DistanceFunction.CosineDistance, IndexKind = IndexKind.Hnsw },

VectorStoreRecordVectorProperty-Konfigurationseinstellungen

Parameter Erforderlich Beschreibung
DataModelPropertyName Ja Der Name der Eigenschaft für das Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
PropertyType Ja Der Typ der Eigenschaft für das Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
Maße 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.

Tipp

Weitere Informationen dazu, welche Connectors StoragePropertyName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.

Hier ist ein Beispiel für das Erstellen einer Datensatzdefinition für die Verwendung mit einem Pandas DataFrame.

Hinweis

Die gleichen Felder wie in der Datenmodelldefinition werden hier für ein Datenmodell verwendet, das sie als Anmerkungen hinzugefügt werden, hier als Diktat mit dem Namen.

Es gibt ein paar wichtige Dinge zu beachten, andere dann die Felder definitionen selbst. Der erste ist der container_mode Parameter. Bei Festlegung auf "True" gibt dies an, dass das Datenmodell ein Containertyp ist, z. B. ein DataFrame, und dass das Datenmodell daher ein Container mit Datensätzen anstelle eines einzelnen Datensatzes ist, kann ein Containerdatensatz auf die gleiche Weise verwendet werden. Der Hauptunterschied besteht darin, dass get und get_batch derselbe Datentyp zurückgegeben wird, mit einem einzelnen Datensatz für einen get und einen oder mehrere für ein get_batch. Wenn Sie einen Upsert ausführen möchten und upsert_batch austauschbar verwendet werden können, upsert d. h. das Übergeben eines Containers führt zu upsert mehreren Upserts anstelle eines einzigen.

Die zweite ist das Hinzufügen der to_dict Methoden und from_dict Methoden, die zum Konvertieren zwischen dem Datenmodell und dem Speicherschema verwendet werden. In diesem Fall wird die to_dict Methode verwendet, um den DataFrame in eine Liste von Datensätzen zu konvertieren, und die from_dict Methode wird verwendet, um eine Liste von Datensätzen in einen DataFrame zu konvertieren. Es kann auch eine und deserialize eine serialize Methode (nicht im folgenden Beispiel gezeigt) geben, um details zu dem Unterschied zwischen diesen informationen finden Sie in der Serialisierungsdokumentation.

from semantic_kernel.data import (
    VectorStoreRecordDataField,
    VectorStoreRecordDefinition,
    VectorStoreRecordKeyField,
    VectorStoreRecordVectorField,
)

hotel_definition = VectorStoreRecordDefinition(
    fields={
        "hotel_id": VectorStoreRecordKeyField(property_type="str"),
        "hotel_name": VectorStoreRecordDataField(property_type="str", is_filterable=True),
        "description": VectorStoreRecordDataField(
            property_type="str", has_embedding=True, embedding_property_name="description_embedding"
        ),
        "description_embedding": VectorStoreRecordVectorField(property_type="list[float]"),
    },
    container_mode=True,
    to_dict=lambda record, **_: record.to_dict(orient="records"),
    from_dict=lambda records, **_: DataFrame(records),
)

Beim Erstellen einer Definition müssen Sie immer einen Namen (als Schlüssel im fields Diktieren) und den Typ für jede Eigenschaft in Ihrem Schema angeben, da dies für die Indexerstellung und die Datenzuordnung erforderlich ist.

Um die Definition zu verwenden, übergeben Sie sie zusammen mit dem Datentyp an die GetCollection-Methode oder einen Sammlungskonstruktor.

collection = vector_store.get_collection(
    collection_name="skhotels", 
    data_model_type=pd.DataFrame, 
    data_model_definition=hotel_definition,
)

Hier ist ein Beispiel zum Erstellen einer Datensatzdefinition.

var hotelDefinition = VectorStoreRecordDefinition.fromFields(
    Arrays.asList(
        VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),
        VectorStoreRecordDataField.builder()
            .withName("name")
            .withFieldType(String.class)
            .isFilterable(true).build(),
        VectorStoreRecordDataField.builder()
            .withName("description")
            .withFieldType(String.class)
            .isFullTextSearchable(true).build(),
        VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
            .withDimensions(4)
            .withIndexKind(IndexKind.HNSW)
            .withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
            .withFieldType(List.class).build()
    )
);

Beim Erstellen einer Definition müssen Sie immer einen Namen und Typ für jedes Feld in Ihrem Schema angeben, da dies für die Indexerstellung und die Datenzuordnung erforderlich ist.

Um die Definition zu verwenden, übergeben Sie sie an die GetCollection-Methode.

var collection = vectorStore.getCollection("skhotels",
        JDBCVectorStoreRecordCollectionOptions.builder()
            .withRecordDefinition(hotelDefinition)
            .build()
    );

Datensatzfeldkonfigurationsklassen

VectorStoreRecordKeyField

Verwenden Sie diese Klasse, um anzugeben, dass Ihr Feld der Schlüssel des Datensatzes ist.

VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),

VectorStoreRecordKeyField-Konfigurationseinstellungen

Parameter Erforderlich Beschreibung
name Ja Der Name des Felds im Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
fieldType Ja Der Typ des Felds im Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
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.

VectorStoreRecordDataField

Verwenden Sie diese Klasse, um anzugeben, dass Ihre Eigenschaft allgemeine Daten enthält, die kein Schlüssel oder ein Vektor sind.

VectorStoreRecordDataField.builder()
    .withName("name")
    .withFieldType(String.class)
    .isFilterable(true).build(),

VectorStoreRecordDataField-Konfigurationseinstellungen

Parameter Erforderlich Beschreibung
name Ja Der Name des Felds im Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
fieldType Ja Der Typ des Felds im Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
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.

VectorStoreRecordVectorField

Verwenden Sie diese Klasse, um anzugeben, dass Ihr Feld einen Vektor enthält.

VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
    .withDimensions(4)
    .withIndexKind(IndexKind.HNSW)
    .withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
    .withFieldType(List.class).build(),

VectorStoreRecordVectorField-Konfigurationseinstellungen

Parameter Erforderlich Beschreibung
name Ja Der Name des Felds im Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
fieldType Ja Der Typ des Felds im Datenmodell. Wird von den integrierten Mappern verwendet, um automatisch zwischen dem Speicherschema und dem Datenmodell und zum Erstellen von Indizes zuzuordnen.
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.

Tipp

Weitere Informationen dazu, welche Connectors storageName unterstützen und welche Alternativen verfügbar sind, finden Sie in der Dokumentation für jeden Connector.