Sdílet prostřednictvím


Definování schématu úložiště pomocí definice záznamu (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 a umožňují přidávání poznámek k datovým modelům s informacemi potřebnými k vytváření indexů nebo mapování dat na schéma databáze.

Další způsob, jak tyto informace poskytnout, je prostřednictvím definic záznamů, které je možné definovat a zadat samostatně do datového modelu. To může být užitečné v několika scénářích:

  • Může se stát, že vývojář chce použít stejný datový model s více než jednou konfigurací.
  • Může se stát, že vývojář chce ukládat data pomocí velmi odlišného schématu modelu a chce zadat vlastní mapovač pro převod mezi datovým modelem a schématem úložiště.
  • Může se stát, že vývojář chce použít předdefinovaný typ, například diktování, nebo optimalizovaný formát, jako je datový rámec, a přesto chce využívat funkci úložiště vektorů.

Tady je příklad vytvoření definice záznamu.

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

Při vytváření definice musíte vždy zadat název a typ pro každou vlastnost ve schématu, protože to je vyžadováno pro vytvoření indexu a mapování dat.

Chcete-li použít definici, předejte ji getCollection metoda.

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

Třídy konfigurace vlastností záznamu

VectorStoreRecordKeyProperty

Tuto třídu použijte k označení, že vaše vlastnost je klíčem záznamu.

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

Nastavení konfigurace VectorStoreRecordKeyProperty

Parametr Požadováno Popis
DataModelPropertyName Ano Název vlastnosti datového modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
PropertyType Ano Typ vlastnosti datového modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
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.

VectorStoreRecordDataProperty

Tuto třídu použijte k označení, že vaše vlastnost obsahuje obecná data, která nejsou klíčem nebo vektorem.

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

Nastavení konfigurace VectorStoreRecordDataProperty

Parametr Požadováno Popis
DataModelPropertyName Ano Název vlastnosti datového modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
PropertyType Ano Typ vlastnosti datového modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
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.

VectorStoreRecordVectorProperty

Tuto třídu použijte k označení, že vaše vlastnost obsahuje vektor.

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

Nastavení konfigurace VectorStoreRecordVectorProperty

Parametr Požadováno Popis
DataModelPropertyName Ano Název vlastnosti datového modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
PropertyType Ano Typ vlastnosti datového modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
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é.

Tip

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

Tady je příklad vytvoření definice záznamu pro použití s datovým rámcem pandas.

Poznámka:

Stejná pole jako v definici datového modelu se tady používají pro datový model, který se přidají jako poznámky, tady jako diktování s názvem.

Je potřeba poznamenat několik důležitých věcí, jiné pak samotné definice polí. První je container_mode parametr. Pokud je nastavená hodnota True, znamená to, že datový model je typ kontejneru, jako je datový rámec, a že datový model je tedy kontejner záznamů, nikoli jeden záznam kontejneru, lze použít úplně stejným způsobem, hlavní rozdíl je v tom, že get a get_batch vrátí stejný datový typ, s jedním záznamem get pro jeden a jeden nebo více pro get_batch. Pokud chcete provést upsert a upsert upsert_batch lze ho použít zaměnitelně, jinými slovy předání kontejneru, aby upsert výsledkem bylo více upsertů místo jednoho.

Druhým je přidání to_dict metod a from_dict metod, které se používají k převodu mezi datovým modelem a schématem úložiště. V tomto případě se metoda používá k převodu to_dict datového rámce na seznam záznamů a from_dict metoda slouží k převodu seznamu záznamů na datový rámec. Může existovat serialize také metoda a deserialize (která není uvedena v následujícím příkladu), kde najdete podrobnosti o rozdílu mezi metodami, které najdete v dokumentaci k serializaci.

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

Při vytváření definice musíte vždy zadat název (jako klíč ve fields diktování) a zadat pro každou vlastnost ve schématu, protože to je vyžadováno pro vytvoření indexu a mapování dat.

Chcete-li použít definici, předejte ji getCollection metoda nebo konstruktor kolekce společně s datovým modelem.

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

Tady je příklad vytvoření definice záznamu.

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

Při vytváření definice musíte vždy zadat název a typ pro každé pole ve schématu, protože to je vyžadováno pro vytvoření indexu a mapování dat.

Chcete-li použít definici, předejte ji getCollection metoda.

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

Třídy konfigurace záznamu polí

VectorStoreRecordKeyField

Tuto třídu použijte k označení, že pole je klíčem záznamu.

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

Nastavení konfigurace VectorStoreRecordKeyField

Parametr Požadováno Popis
name Ano Název pole v datovém modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
fieldType Ano Typ pole v datovém modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
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.

VectorStoreRecordDataField

Tuto třídu použijte k označení, že vaše vlastnost obsahuje obecná data, která nejsou klíčem nebo vektorem.

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

Nastavení konfigurace VectorStoreRecordDataField

Parametr Požadováno Popis
name Ano Název pole v datovém modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
fieldType Ano Typ pole v datovém modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
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.

VectorStoreRecordVectorField

Tuto třídu použijte k označení, že vaše pole obsahuje vektor.

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

Nastavení konfigurace VectorStoreRecordVectorField

Parametr Požadováno Popis
name Ano Název pole v datovém modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
fieldType Ano Typ pole v datovém modelu. Integrované mapovače se používají k automatickému mapování mezi schématem úložiště a datovým modelem a k vytváření indexů.
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.

Tip

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