Sdílet prostřednictvím


Definování datového modelu (Preview)

Upozorňující

Funkce sémantického úložiště vektorů jádra je ve verzi Preview a vylepšení, která vyžadují zásadní změny, se můžou vyskytovat za omezených okolností před vydáním.

Přehled

Konektory sémantického úložiště vektorů jádra používají první přístup modelu k interakci s databázemi.

Všechny metody pro přenesení nebo získání záznamů používají třídy modelu silného typu. Vlastnosti těchto tříd jsou zdobeny atributy, které označují účel každé vlastnosti.

Tip

Alternativu k použití atributů najdete v definování schématu s definicí záznamu.

Tip

Alternativu k definování vlastního datového modelu najdete v abstrakcích vektorového úložiště bez definování vlastního datového modelu.

Tady je příklad modelu, který je zdoben těmito atributy.

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; }
}

Atributy

VectorStoreRecordKeyAttribute

Tento atribut použijte k označení, že vaše vlastnost je klíčem záznamu.

[VectorStoreRecordKey]
public ulong HotelId { get; set; }

Parametry VectorStoreRecordKeyAttribute

Parametr Požadováno Popis
StoragePropertyName No Lze použít k zadání alternativního názvu vlastnosti v databázi. Všimněte si, že tento parametr nejsou podporovány všemi konektory, například pokud se podporují alternativy, jako JsonPropertyNameAttribute jsou podporované.

Tip

Další informace o tom, které konektory podporují StoragePropertyName a jaké alternativy jsou k dispozici, najdete v dokumentaci ke každému konektoru.

VectorStoreRecordDataAttribute

Tento atribut použijte k označení, že vlastnost obsahuje obecná data, která nejsou klíčem nebo vektorem.

[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }

Parametry VectorStoreRecordDataAttribute

Parametr Požadováno Popis
IsFilterable No Určuje, zda má být vlastnost indexována pro filtrování v případech, kdy databáze vyžaduje souhlas s indexováním na vlastnost. Výchozí hodnota je False.
IsFullTextSearchable No Určuje, zda má být vlastnost indexována pro fulltextové vyhledávání databází, které podporují fulltextové vyhledávání. Výchozí hodnota je False.
StoragePropertyName No Lze použít k zadání alternativního názvu vlastnosti v databázi. Všimněte si, že tento parametr nejsou podporovány všemi konektory, například pokud se podporují alternativy, jako JsonPropertyNameAttribute jsou podporované.

Tip

Další informace o tom, které konektory podporují StoragePropertyName a jaké alternativy jsou k dispozici, najdete v dokumentaci ke každému konektoru.

VectorStoreRecordVectorAttribute

Tento atribut použijte k označení, že vlastnost obsahuje vektor.

[VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance, IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }

Parametry VectorStoreRecordVectorAttribute

Parametr Požadováno Popis
Dimenze Ano pro vytvoření kolekce, volitelné v opačném případě Počet dimenzí, které vektor má. To se obvykle vyžaduje při vytváření vektorového indexu pro kolekci.
IndexKind No Typ indexu indexu indexu vektoru. Výchozí nastavení se liší podle typu úložiště vektorů.
VzdálenostFunction No Typ funkce vzdálenosti, která se má použít při porovnávání vektorů při hledání vektorů nad tímto vektorem. Výchozí nastavení se liší podle typu úložiště vektorů.
StoragePropertyName No Lze použít k zadání alternativního názvu vlastnosti v databázi. Všimněte si, že tento parametr nejsou podporovány všemi konektory, například pokud se podporují alternativy, jako JsonPropertyNameAttribute jsou podporované.

Běžné typy indexů a typy funkcí vzdálenosti jsou zadány jako statické hodnoty v těchto Microsoft.SemanticKernel.Data.IndexKind třídách Microsoft.SemanticKernel.Data.DistanceFunction . Implementace jednotlivých vektorových úložiště mohou také používat vlastní typy indexů a funkce vzdálenosti, kde databáze podporuje neobvyklé typy.

Tip

Další informace o tom, které konektory podporují StoragePropertyName a jaké alternativy jsou k dispozici, najdete v dokumentaci ke každému konektoru.

Všechny metody pro upsertování nebo získání záznamů používají třídu a definici záznamu úložiště vektorů.

To lze provést definováním vlastní třídy s poznámkami pro pole nebo pomocí třídy/typu v kombinaci s definicí záznamu. Pro třídu je potřeba udělat dvě věci, první je přidat poznámky k typům polí, druhý je ozdobit třídu dekorátorem vectorstoremodel .

Tip

Alternativní přístup s použitím definice záznamu najdete v definici schématu pomocí definice záznamu.

Tady je příklad modelu, který je zdoben těmito poznámkami.

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)]

Tip

Definování třídy s těmito poznámkami lze provádět několika způsoby, z nichž jeden používá dataclasses modul v Pythonu, který je zde uvedený. Tato ukázka ukazuje i další přístupy (pomocí Pydantic BaseModels a vanilla pythonových tříd).

Poznámky

Existují tři typy poznámek, které se mají použít, a mají společnou základní třídu.

VectorStoreRecordField

Toto je základní třída pro všechny poznámky, není určena k přímému použití.

Parametry VectorStoreRecordField

Parametr Požadováno Popis
name No Můžete přidat přímo, ale během analýzy modelu se nastaví.
property_type No Měl by to být řetězec, který bude také odvozen během analýzy.

Tip

Poznámky jsou analyzovány dekorátorem vectorstoremodel a jednou z věcí, které dělá, je vytvořit definici záznamu pro třídu, proto není nutné vytvořit instanci třídy pole, pokud nejsou nastaveny žádné parametry, pole může být anotováno pouze třídou, jako je tato:

hotel_id: Annotated[str, VectorStoreRecordKeyField]

VectorStoreRecordKeyField

Tato poznámka slouží k označení, že tento atribut je klíčem záznamu.

VectorStoreRecordKeyField()

Parametry VectorStoreRecordKeyField

Nejsou definovány žádné jiné parametry mimo základní třídu.

VectorStoreRecordDataField

Tuto poznámku použijte k označení, že atribut obsahuje obecná data, která nejsou klíčem nebo vektorem.

VectorStoreRecordDataField(is_filterable=True)

Parametry VectorStoreRecordDataField

Parametr Požadováno Popis
has_embedding No Určuje, zda má vlastnost přidružené vložení, výchozí hodnota None.
embedding_property_name No Název vlastnosti, která obsahuje vkládání, výchozí hodnota None.
is_filterable No Určuje, zda má být vlastnost indexována pro filtrování v případech, kdy databáze vyžaduje souhlas s indexováním na vlastnost. Výchozí hodnota je False.
is_full_text_searchable No Určuje, zda má být vlastnost indexována pro fulltextové vyhledávání databází, které podporují fulltextové vyhledávání. Výchozí hodnota je False.

VectorStoreRecordVectorField

Tuto poznámku použijte k označení, že atribut obsahuje vektor.

VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)

Parametry VectorStoreRecordVectorField

Parametr Požadováno Popis
dimensions Ano pro vytvoření kolekce, volitelné v opačném případě Počet dimenzí, které vektor má. To se obvykle vyžaduje při vytváření vektorového indexu pro kolekci.
index_kind No Typ indexu indexu indexu vektoru. Výchozí nastavení se liší podle typu úložiště vektorů.
distance_function No Typ funkce vzdálenosti, která se má použít při porovnávání vektorů při hledání vektorů nad tímto vektorem. Výchozí nastavení se liší podle typu úložiště vektorů.
local_embedding No Určuje, zda má vlastnost přiřazené místní vložení, výchozí hodnota None.
embedding_settings No Nastavení pro vložení ve formě diktování s service_id jako klíč a PromptExecutionSettings jako hodnota je výchozí hodnota None.
serialize_function No Funkce, která se má použít k serializaci vektoru, pokud typ není seznam [float | int] tato funkce potřebná nebo musí být serializován celý model.
deserialize_function No Funkce, která se má použít k deserializaci vektoru, pokud typ není seznam [float | int] tato funkce nutná nebo je potřeba deserializovat celý model.

Běžné typy indexů a typy funkcí vzdálenosti jsou zadány jako statické hodnoty v těchto semantic_kernel.data.IndexKind třídách semantic_kernel.data.DistanceFunction . Implementace jednotlivých vektorových úložiště mohou také používat vlastní typy indexů a funkce vzdálenosti, kde databáze podporuje neobvyklé typy.

Všechny metody pro přenesení nebo získání záznamů používají třídy modelu silného typu. Pole v těchto třídách jsou zdobena poznámkami, které označují účel každého pole.

Tip

Alternativu k použití atributů najdete v definování schématu s definicí záznamu.

Tady je příklad modelu, který je zdoben těmito poznámkami. Ve výchozím nastavení většina z krabicových vektorových úložišť používá Jackson, takže je vhodné zajistit, aby objekt modelu mohl být serializován Jacksonem, tj. třída je viditelná, má getters, konstruktor, poznámky atd.

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; }
}

Poznámky

VectorStoreRecordKey

Tuto poznámku použijte k označení, že pole je klíčem záznamu.

@VectorStoreRecordKey
private String hotelId;

Parametry VectorStoreRecordKey

Parametr Požadováno Popis
storageName No Lze použít k zadání alternativního názvu pole v databázi. Všimněte si, že tento parametr nejsou podporovány všemi spojnicemi, například pokud se používá Jackson, je možné zadat název úložiště pomocí poznámek Jackson.

Tip

Další informace o tom, které konektory podporují storageName a jaké alternativy jsou k dispozici, najdete v dokumentaci ke každému konektoru.

VectorStoreRecordData

Tato poznámka slouží k označení, že pole obsahuje obecná data, která nejsou klíčem nebo vektorem.

@VectorStoreRecordData(isFilterable = true)
private String name;

Parametry VectorStoreRecordData

Parametr Požadováno Popis
isFilterable No Určuje, jestli má být pole indexováno pro filtrování v případech, kdy databáze vyžaduje přihlášení k indexování pro jednotlivá pole. Výchozí hodnota je False.
isFullTextSearchable No Určuje, jestli má být pole indexováno pro fulltextové vyhledávání databází, které podporují fulltextové vyhledávání. Výchozí hodnota je False.
storageName No Lze použít k zadání alternativního názvu pole v databázi. Všimněte si, že tento parametr nejsou podporovány všemi spojnicemi, například pokud se používá Jackson, je možné zadat název úložiště pomocí poznámek Jackson.

Tip

Další informace o tom, které konektory podporují storageName a jaké alternativy jsou k dispozici, najdete v dokumentaci ke každému konektoru.

VectorStoreRecordVector

Pomocí této poznámky můžete určit, že pole obsahuje vektor.

@VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
private List<Float> descriptionEmbedding;

Parametry VectorStoreRecordVector

Parametr Požadováno Popis
dimensions Ano pro vytvoření kolekce, volitelné v opačném případě Počet dimenzí, které vektor má. To se obvykle vyžaduje při vytváření vektorového indexu pro kolekci.
indexKind No Typ indexu indexu indexu vektoru. Výchozí nastavení se liší podle typu úložiště vektorů.
vzdálenostFunction No Typ funkce vzdálenosti, která se má použít při porovnávání vektorů při hledání vektorů nad tímto vektorem. Výchozí nastavení se liší podle typu úložiště vektorů.
storageName No Lze použít k zadání alternativního názvu pole v databázi. Všimněte si, že tento parametr nejsou podporovány všemi spojnicemi, například pokud se používá Jackson, je možné zadat název úložiště pomocí poznámek Jackson.

Běžné typy indexů a typy funkcí vzdálenosti jsou dodávány na výčtech com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind a com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction výčtech. Implementace jednotlivých vektorových úložiště mohou také používat vlastní typy indexů a funkce vzdálenosti, kde databáze podporuje neobvyklé typy.

Tip

Další informace o tom, které konektory podporují storageName a jaké alternativy jsou k dispozici, najdete v dokumentaci ke každému konektoru.

Další informace budou brzy k dispozici.