Dela via


Definiera ditt lagringsschema med hjälp av en postdefinition (förhandsversion)

Varning

Funktionen Semantic Kernel Vector Store är i förhandsversion, och förbättringar som kräver icke-bakåtkompatibla ändringar kan fortfarande ske under begränsade omständigheter före lanseringen.

Översikt

Anslutningsappar för semantisk kernelvektorlagring använder en modell för att interagera med databaser och gör det möjligt att kommentera datamodeller med information som behövs för att skapa index eller mappa data till databasschemat.

Ett annat sätt att tillhandahålla den här informationen är via postdefinitioner som kan definieras och levereras separat till datamodellen. Detta kan vara användbart i flera scenarier:

  • Det kan finnas ett fall där en utvecklare vill använda samma datamodell med mer än en konfiguration.
  • Det kan finnas ett fall där utvecklaren vill lagra data med ett helt annat schema än modellen och vill ange en anpassad mappare för konvertering mellan datamodellen och lagringsschemat.
  • Det kan finnas ett fall där en utvecklare vill använda en inbyggd typ, till exempel en diktamen, eller ett optimerat format som en dataram och ändå vill utnyttja funktionerna för vektorlagring.

Här är ett exempel på hur du skapar en postdefinition.

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

När du skapar en definition måste du alltid ange ett namn och en typ för varje egenskap i schemat, eftersom detta krävs för att skapa index och datamappning.

Om du vill använda definitionen skickar du den till metoden GetCollection.

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

Konfigurationsklasser för postegenskap

VectorStoreRecordKeyProperty

Använd den här klassen för att ange att din egenskap är nyckeln för posten.

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

Konfigurationsinställningar för VectorStoreRecordKeyProperty

Parameter Obligatoriskt Beskrivning
DataModelPropertyName Ja Namnet på egenskapen för datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
PropertyType Ja Typen av egenskap för datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
StoragePropertyName Nej Kan användas för att ange ett alternativt namn för egenskapen i databasen. Observera att den här parametern inte stöds av alla anslutningsappar, t.ex. där alternativ som JsonPropertyNameAttribute stöds.

Dricks

Mer information om vilka anslutningsappar som stöder StoragePropertyName och vilka alternativ som är tillgängliga finns i dokumentationen för varje anslutningsapp.

VectorStoreRecordDataProperty

Använd den här klassen för att ange att egenskapen innehåller allmänna data som inte är en nyckel eller en vektor.

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

Konfigurationsinställningar för VectorStoreRecordDataProperty

Parameter Obligatoriskt Beskrivning
DataModelPropertyName Ja Namnet på egenskapen för datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
PropertyType Ja Typen av egenskap för datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
IsFilterable Nej Anger om egenskapen ska indexeras för filtrering i fall där en databas kräver att du väljer att indexera per egenskap. Standardvärdet är falskt.
IsFullTextSearchable Nej Anger om egenskapen ska indexeras för fulltextsökning efter databaser som stöder fulltextsökning. Standardvärdet är falskt.
StoragePropertyName Nej Kan användas för att ange ett alternativt namn för egenskapen i databasen. Observera att den här parametern inte stöds av alla anslutningsappar, t.ex. där alternativ som JsonPropertyNameAttribute stöds.

Dricks

Mer information om vilka anslutningsappar som stöder StoragePropertyName och vilka alternativ som är tillgängliga finns i dokumentationen för varje anslutningsapp.

VectorStoreRecordVectorProperty

Använd den här klassen för att ange att egenskapen innehåller en vektor.

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

Konfigurationsinställningar för VectorStoreRecordVectorProperty

Parameter Obligatoriskt Beskrivning
DataModelPropertyName Ja Namnet på egenskapen för datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
PropertyType Ja Typen av egenskap för datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
Dimensioner Ja för samlingsskapande, valfritt annars Antalet dimensioner som vektorn har. Detta krävs vanligtvis när du skapar ett vektorindex för en samling.
IndexKind Nej Vilken typ av index som vektorn ska indexeras med. Standard varierar beroende på typ av vektorlager.
DistanceFunction Nej Den typ av avståndsfunktion som ska användas vid jämförelse av vektorer under vektorsökning över den här vektorn. Standard varierar beroende på typ av vektorlager.
StoragePropertyName Nej Kan användas för att ange ett alternativt namn för egenskapen i databasen. Observera att den här parametern inte stöds av alla anslutningsappar, t.ex. där alternativ som JsonPropertyNameAttribute stöds.

Dricks

Mer information om vilka anslutningsappar som stöder StoragePropertyName och vilka alternativ som är tillgängliga finns i dokumentationen för varje anslutningsapp.

Här är ett exempel på hur du skapar en postdefinition för användning med en Pandas DataFrame.

Kommentar

Samma fält som i datamodelldefinitionen används här, för en datamodell läggs de till som anteckningar, här som en diktamen med namnet.

Det finns ett par viktiga saker att notera, andra sedan själva fältdefinitionerna. Den första är parametern container_mode . När värdet är True anger detta att datamodellen är en containertyp, som en DataFrame, och att datamodellen därför är en container med poster, i stället för en enda, en containerpost kan användas på exakt samma sätt, den största skillnaden är att get och get_batch returnerar samma datatyp. med en enda post för en och en get eller flera för en get_batch. När du vill göra en upsert upsert , och upsert_batch kan användas omväxlande, med andra ord, att skicka en container till upsert resulterar i flera upserts, i stället för en enda.

Den andra är tillägget av to_dict metoderna och from_dict som används för att konvertera mellan datamodellen och lagringsschemat. I det här fallet to_dict används metoden för att konvertera DataFrame till en lista med poster, och from_dict metoden används för att konvertera en lista med poster till en DataFrame. Det kan också finnas en serialize metod (deserializevisas inte i exemplet nedan) för mer information om skillnaden mellan dem i serialiseringsdokumentationen.

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

När du skapar en definition måste du alltid ange ett namn (som nyckeln i diktamen fields ) och skriva för varje egenskap i schemat, eftersom detta krävs för att skapa index och datamappning.

Om du vill använda definitionen skickar du den till metoden GetCollection eller en samlingskonstruktor, tillsammans med datamodelltypen.

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

Här är ett exempel på hur du skapar en postdefinition.

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

När du skapar en definition måste du alltid ange ett namn och en typ för varje fält i schemat, eftersom detta krävs för att skapa index och datamappning.

Om du vill använda definitionen skickar du den till metoden GetCollection.

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

Konfigurationsklasser för postfält

VectorStoreRecordKeyField

Använd den här klassen för att ange att fältet är nyckeln för posten.

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

Konfigurationsinställningar för VectorStoreRecordKeyField

Parameter Obligatoriskt Beskrivning
name Ja Namnet på fältet i datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
fieldType Ja Typ av fält i datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
storageName Nej Kan användas för att ange ett alternativt namn för fältet i databasen. Observera att den här parametern inte stöds av alla anslutningsappar, t.ex. där Jackson används, i så fall kan lagringsnamnet anges med jacksonanteckningar.

Dricks

Mer information om vilka anslutningsappar som stöder storageName och vilka alternativ som är tillgängliga finns i dokumentationen för varje anslutningsapp.

VectorStoreRecordDataField

Använd den här klassen för att ange att egenskapen innehåller allmänna data som inte är en nyckel eller en vektor.

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

Konfigurationsinställningar för VectorStoreRecordDataField

Parameter Obligatoriskt Beskrivning
name Ja Namnet på fältet i datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
fieldType Ja Typ av fält i datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
isFilterable Nej Anger om fältet ska indexeras för filtrering i fall där en databas kräver att du väljer att indexera per fält. Standardvärdet är falskt.
isFullTextSearchable Nej Anger om fältet ska indexeras för fulltextsökning efter databaser som stöder fulltextsökning. Standardvärdet är falskt.
storageName Nej Kan användas för att ange ett alternativt namn för fältet i databasen. Observera att den här parametern inte stöds av alla anslutningsappar, t.ex. där Jackson används, i så fall kan lagringsnamnet anges med jacksonanteckningar.

Dricks

Mer information om vilka anslutningsappar som stöder storageName och vilka alternativ som är tillgängliga finns i dokumentationen för varje anslutningsapp.

VectorStoreRecordVectorField

Använd den här klassen för att ange att fältet innehåller en vektor.

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

Konfigurationsinställningar för VectorStoreRecordVectorField

Parameter Obligatoriskt Beskrivning
name Ja Namnet på fältet i datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
fieldType Ja Typ av fält i datamodellen. Används av de inbyggda mapparna för att automatiskt mappa mellan lagringsschemat och datamodellen och för att skapa index.
dimensioner Ja för samlingsskapande, valfritt annars Antalet dimensioner som vektorn har. Detta krävs vanligtvis när du skapar ett vektorindex för en samling.
indexKind Nej Vilken typ av index som vektorn ska indexeras med. Standard varierar beroende på typ av vektorlager.
distanceFunction Nej Den typ av avståndsfunktion som ska användas vid jämförelse av vektorer under vektorsökning över den här vektorn. Standard varierar beroende på typ av vektorlager.
storageName Nej Kan användas för att ange ett alternativt namn för fältet i databasen. Observera att den här parametern inte stöds av alla anslutningsappar, t.ex. där Jackson används, i så fall kan lagringsnamnet anges med jacksonanteckningar.

Dricks

Mer information om vilka anslutningsappar som stöder storageName och vilka alternativ som är tillgängliga finns i dokumentationen för varje anslutningsapp.