Udostępnij za pośrednictwem


Definiowanie schematu magazynu przy użyciu definicji rekordu (wersja zapoznawcza)

Ostrzeżenie

Funkcja semantycznego magazynu wektorów jądra jest dostępna w wersji zapoznawczej, a ulepszenia wymagające zmian powodujących niezgodność mogą nadal występować w ograniczonych okolicznościach przed wydaniem.

Omówienie

Łączniki semantycznego magazynu wektorów jądra używają modelu pierwszego podejścia do interakcji z bazami danych i umożliwia dodawanie adnotacji do modeli danych z informacjami wymaganymi do tworzenia indeksów lub mapowania danych do schematu bazy danych.

Innym sposobem dostarczania tych informacji jest użycie definicji rekordów, które można zdefiniować i dostarczyć oddzielnie do modelu danych. Może to być przydatne w wielu scenariuszach:

  • Może wystąpić sytuacja, w której deweloper chce użyć tego samego modelu danych z więcej niż jedną konfiguracją.
  • Może wystąpić sytuacja, w której deweloper chce przechowywać dane przy użyciu zupełnie innego schematu do modelu i chce podać niestandardowy maper do konwersji między modelem danych a schematem magazynu.
  • Może wystąpić sytuacja, w której deweloper chce użyć wbudowanego typu, takiego jak dykt, lub zoptymalizowanego formatu, takiego jak ramka danych, i nadal chce korzystać z funkcji magazynu wektorów.

Oto przykład tworzenia definicji rekordu.

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

Podczas tworzenia definicji zawsze musisz podać nazwę i typ każdej właściwości w schemacie, ponieważ jest to wymagane do tworzenia indeksu i mapowania danych.

Aby użyć definicji, przekaż ją do metody GetCollection.

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

Klasy konfiguracji właściwości rekordu

VectorStoreRecordKeyProperty

Użyj tej klasy, aby wskazać, że właściwość jest kluczem rekordu.

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

Ustawienia konfiguracji VectorStoreRecordKeyProperty

Parametr Wymagania opis
DataModelPropertyName Tak Nazwa właściwości modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
Typ właściwości Tak Typ właściwości w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
StoragePropertyName Nie. Może służyć do podawania alternatywnej nazwy właściwości w bazie danych. Należy pamiętać, że ten parametr nie jest obsługiwany przez wszystkie łączniki, np. jeśli są obsługiwane alternatywy, takie jak JsonPropertyNameAttribute .

Napiwek

Aby uzyskać więcej informacji na temat łączników obsługujących usługę StoragePropertyName i dostępne alternatywy, zapoznaj się z dokumentacją każdego łącznika.

VectorStoreRecordDataProperty

Użyj tej klasy, aby wskazać, że właściwość zawiera ogólne dane, które nie są kluczem ani wektorem.

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

Ustawienia konfiguracji VectorStoreRecordDataProperty

Parametr Wymagania opis
DataModelPropertyName Tak Nazwa właściwości modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
Typ właściwości Tak Typ właściwości w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
IsFilterable Nie. Wskazuje, czy właściwość powinna być indeksowana do filtrowania w przypadkach, gdy baza danych wymaga zgody na indeksowanie poszczególnych właściwości. Wartość domyślna to „fałsz”.
IsFullTextSearchable Nie. Wskazuje, czy właściwość powinna być indeksowana w celu wyszukiwania pełnotekstowego baz danych obsługujących wyszukiwanie pełnotekstowe. Wartość domyślna to „fałsz”.
StoragePropertyName Nie. Może służyć do podawania alternatywnej nazwy właściwości w bazie danych. Należy pamiętać, że ten parametr nie jest obsługiwany przez wszystkie łączniki, np. jeśli są obsługiwane alternatywy, takie jak JsonPropertyNameAttribute .

Napiwek

Aby uzyskać więcej informacji na temat łączników obsługujących usługę StoragePropertyName i dostępne alternatywy, zapoznaj się z dokumentacją każdego łącznika.

VectorStoreRecordVectorProperty

Użyj tej klasy, aby wskazać, że właściwość zawiera wektor.

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

Ustawienia konfiguracji VectorStoreRecordVectorProperty

Parametr Wymagania opis
DataModelPropertyName Tak Nazwa właściwości modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
Typ właściwości Tak Typ właściwości w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
Wymiary Tak w przypadku tworzenia kolekcji, opcjonalnie w przeciwnym razie Liczba wymiarów, które ma wektor. Jest to zwykle wymagane podczas tworzenia indeksu wektorowego dla kolekcji.
IndexKind Nie. Typ indeksu do indeksowania wektora. Wartość domyślna różni się w zależności od typu magazynu wektorów.
Funkcja odległości Nie. Typ funkcji odległości do użycia podczas porównywania wektorów podczas wyszukiwania wektorów w tym wektorze. Wartość domyślna różni się w zależności od typu magazynu wektorów.
StoragePropertyName Nie. Może służyć do podawania alternatywnej nazwy właściwości w bazie danych. Należy pamiętać, że ten parametr nie jest obsługiwany przez wszystkie łączniki, np. jeśli są obsługiwane alternatywy, takie jak JsonPropertyNameAttribute .

Napiwek

Aby uzyskać więcej informacji na temat łączników obsługujących usługę StoragePropertyName i dostępne alternatywy, zapoznaj się z dokumentacją każdego łącznika.

Oto przykład tworzenia definicji rekordu do użycia z ramką danych biblioteki pandas.

Uwaga

W tym miejscu są używane te same pola, co w definicji modelu danych, dla modelu danych są dodawane jako adnotacje w tym miejscu jako dykt z nazwą.

Istnieje kilka ważnych rzeczy do zanotowania, inne, a następnie same definicje pól. Pierwszy to container_mode parametr . W przypadku ustawienia wartości True oznacza to, że model danych jest typem kontenera, takim jak ramka danych, i że model danych jest w związku z tym kontenerem rekordów, a nie pojedynczym, rekord kontenera może być używany w dokładnie taki sam sposób, główną różnicą jest to, że get i get_batch zwróci ten sam typ danych, z pojedynczym rekordem dla elementu get i i co najmniej jeden dla elementu get_batch. Jeśli chcesz wykonać operację upsert i upsert upsert_batch można jej używać zamiennie, innymi słowy, przekazanie kontenera do upsert spowoduje powstanie wielu operacji upsert, zamiast jednego.

Drugi to dodanie to_dict metod i from_dict , które są używane do konwertowania między modelem danych a schematem magazynu. W takim przypadku to_dict metoda jest używana do konwertowania ramki danych na listę rekordów, a from_dict metoda służy do konwertowania listy rekordów na ramkę danych. Istnieje również serialize metoda i deserialize (nie pokazana w poniższym przykładzie), aby uzyskać szczegółowe informacje na temat różnic między tymi, które znajdują się w dokumentacji serializacji.

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

Podczas tworzenia definicji zawsze musisz podać nazwę (jako klucz w dykt) fields i wpisać dla każdej właściwości w schemacie, ponieważ jest to wymagane do tworzenia indeksu i mapowania danych.

Aby użyć definicji, przekaż ją do metody GetCollection lub konstruktora kolekcji wraz z typem modelu danych.

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

Oto przykład tworzenia definicji rekordu.

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

Podczas tworzenia definicji zawsze trzeba podać nazwę i typ dla każdego pola w schemacie, ponieważ jest to wymagane do tworzenia indeksu i mapowania danych.

Aby użyć definicji, przekaż ją do metody GetCollection.

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

Klasy konfiguracji pola rekordu

VectorStoreRecordKeyField

Użyj tej klasy, aby wskazać, że pole jest kluczem rekordu.

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

Ustawienia konfiguracji VectorStoreRecordKeyField

Parametr Wymagania opis
name Tak Nazwa pola w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
fieldType Tak Typ pola w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
storageName Nie. Można użyć do podania alternatywnej nazwy pola w bazie danych. Należy pamiętać, że ten parametr nie jest obsługiwany przez wszystkie łączniki, np. gdzie jest używany Jackson, w takim przypadku można określić nazwę magazynu przy użyciu adnotacji Jacksona.

Napiwek

Aby uzyskać więcej informacji na temat łączników obsługujących usługę storageName i dostępnych alternatyw, zapoznaj się z dokumentacją każdego łącznika.

VectorStoreRecordDataField

Użyj tej klasy, aby wskazać, że właściwość zawiera ogólne dane, które nie są kluczem ani wektorem.

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

Ustawienia konfiguracji VectorStoreRecordDataField

Parametr Wymagania opis
name Tak Nazwa pola w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
fieldType Tak Typ pola w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
isFilterable Nie. Wskazuje, czy pole powinno być indeksowane do filtrowania w przypadkach, gdy baza danych wymaga wyrażenia zgody na indeksowanie na pole. Wartość domyślna to „fałsz”.
isFullTextSearchable Nie. Wskazuje, czy pole powinno być indeksowane w celu wyszukiwania pełnotekstowego baz danych obsługujących wyszukiwanie pełnotekstowe. Wartość domyślna to „fałsz”.
storageName Nie. Można użyć do podania alternatywnej nazwy pola w bazie danych. Należy pamiętać, że ten parametr nie jest obsługiwany przez wszystkie łączniki, np. gdzie jest używany Jackson, w takim przypadku można określić nazwę magazynu przy użyciu adnotacji Jacksona.

Napiwek

Aby uzyskać więcej informacji na temat łączników obsługujących usługę storageName i dostępnych alternatyw, zapoznaj się z dokumentacją każdego łącznika.

VectorStoreRecordVectorField

Użyj tej klasy, aby wskazać, że pole zawiera wektor.

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

Ustawienia konfiguracji VectorStoreRecordVectorField

Parametr Wymagania opis
name Tak Nazwa pola w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
fieldType Tak Typ pola w modelu danych. Używane przez wbudowane mapery do automatycznego mapowania między schematem magazynu a modelem danych i tworzenia indeksów.
wymiary Tak w przypadku tworzenia kolekcji, opcjonalnie w przeciwnym razie Liczba wymiarów, które ma wektor. Jest to zwykle wymagane podczas tworzenia indeksu wektorowego dla kolekcji.
indexKind Nie. Typ indeksu do indeksowania wektora. Wartość domyślna różni się w zależności od typu magazynu wektorów.
distanceFunction Nie. Typ funkcji odległości do użycia podczas porównywania wektorów podczas wyszukiwania wektorów w tym wektorze. Wartość domyślna różni się w zależności od typu magazynu wektorów.
storageName Nie. Można użyć do podania alternatywnej nazwy pola w bazie danych. Należy pamiętać, że ten parametr nie jest obsługiwany przez wszystkie łączniki, np. gdzie jest używany Jackson, w takim przypadku można określić nazwę magazynu przy użyciu adnotacji Jacksona.

Napiwek

Aby uzyskać więcej informacji na temat łączników obsługujących usługę storageName i dostępnych alternatyw, zapoznaj się z dokumentacją każdego łącznika.