Udostępnij za pośrednictwem


Serializacja modelu danych do i z różnych magazynów (wersja zapoznawcza)

Aby model danych był przechowywany w bazie danych, musi zostać przekonwertowany na format, który może zrozumieć baza danych. Różne bazy danych wymagają różnych schematów i formatów przechowywania. Niektóre mają ścisły schemat, który musi być zgodny, a inne umożliwiają definiowanie schematu przez użytkownika.

Łączniki magazynu wektorów udostępniane przez Jądro Semantyczne mają wbudowane mapowania, które będą przeprowadzać model danych do i ze schematów bazy danych. Zobacz dla każdego łącznika stronę , aby uzyskać więcej informacji na temat sposobu, w jaki wbudowane mappery mapują dane dla każdej bazy danych.

Aby model danych został zdefiniowany jako klasa lub definicja do przechowywania w bazie danych, musi być serializowany do formatu, który może zrozumieć baza danych.

Istnieją dwa sposoby, które można wykonać, używając wbudowanej serializacji dostarczonej przez jądro semantyczne lub dostarczając własną logikę serializacji.

Na poniższych dwóch diagramach przedstawiono przepływy zarówno dla serializacji, jak i deserializacji modeli danych do i z modelu magazynu.

Przepływ serializacji (używany w operacji Upsert)

Przepływ serializacji

Przepływ deserializacji

Kroki oznaczone znakiem * (w obu diagramach) są implementowane przez dewelopera określonego łącznika i są różne dla każdego magazynu. Kroki oznaczone znakiem ** (w obu diagramach) są dostarczane jako metoda w rekordzie lub w ramach definicji rekordu. Jest to zawsze dostarczane przez użytkownika. Aby uzyskać więcej informacji, zobacz Direct Serialization (Serializacja bezpośrednia ).

(De)Podejścia do serializacji

Serializacja bezpośrednia (model danych do modelu magazynu)

Serializacja bezpośrednia jest najlepszym sposobem zapewnienia pełnej kontroli nad sposobem serializacji modeli i optymalizacji wydajności. Wadą jest to, że jest on specyficzny dla magazynu danych, a zatem w przypadku korzystania z niego nie jest tak łatwo przełączać się między różnymi magazynami z tym samym modelem danych.

Można go użyć, implementując metodę zgodną z protokołem SerializeMethodProtocol w modelu danych lub dodając funkcje zgodne z SerializeFunctionProtocol do definicji rekordu, oba te elementy można znaleźć w semantic_kernel/data/vector_store_model_protocols.py.

Gdy jedna z tych funkcji jest obecna, będzie używana do bezpośredniego serializowania modelu danych w modelu magazynu.

Można nawet zaimplementować tylko jedną z tych dwóch metod, używając wbudowanej serializacji/deserializacji w przeciwnym kierunku. Może to być na przykład przydatne w przypadku obsługi kolekcji utworzonej poza Twoją kontrolą i trzeba wykonać pewne dostosowania w sposób, w jaki jest deserializowana, oraz nie możesz wykonać operacji upsert.

Wbudowana serializacja i deserializacja (model danych do słownika i słownik do modelu przechowywania i odwrotnie)

Wbudowana serializacja jest wykonywana przez najpierw przekonwertowanie modelu danych na słownik, a następnie serializacji go do modelu, który przechowuje rozumie, dla każdego magazynu, który jest inny i zdefiniowany jako część wbudowanego łącznika. Deserializacja jest wykonywana w odwrotnej kolejności.

Serializacja — krok 1. Model danych do Dyktowania

W zależności od rodzaju posiadanego modelu danych kroki są wykonywane na różne sposoby. Istnieją cztery sposoby próby serializacji modelu danych do słownika:

  1. to_dict metodę w definicji (dopasowuje się do atrybutu to_dict w modelu danych, zgodnie z ToDictFunctionProtocol)
  2. sprawdź, czy rekord jest ToDictMethodProtocol i użyj metody to_dict
  3. Sprawdź, czy rekord jest modelem Pydantic i użyj model_dump modelu; zapoznaj się z notatką poniżej, aby uzyskać więcej informacji.
  4. Przejść przez pola w definicji i utworzyć słownik

Opcjonalnie: Osadzanie

Jeśli masz model danych z polem embedding_generator lub kolekcja ma pole embedding_generator, osadzanie zostanie wygenerowane i dodane do słownika przed jego serializacją do modelu magazynu.

Serializacja — krok 2. Dyktowanie do modelu magazynu

Metoda musi być dostarczona przez łącznik, aby przekonwertować słownik na model magazynu. Wykonywane jest to przez dewelopera łącznika i różni się dla każdego sklepu.

Deserializacja — krok 1. Przechowywanie modelu do dyktowania

Metoda musi zostać dostarczona przez łącznik, aby przekonwertować model magazynu na słownik. Wykonywane jest to przez dewelopera łącznika i różni się dla każdego sklepu.

Deserializacja — krok 2: Dyktowanie do modelu danych

Deserializacja jest wykonywana w odwrotnej kolejności, próbując następujące opcje:

  1. metoda from_dict w definicji (jest zgodna z atrybutem from_dict modelu danych, zgodnie z FromDictFunctionProtocol)
  2. sprawdź, czy rekord jest FromDictMethodProtocol i użyj metody from_dict
  3. Sprawdź, czy rekord jest modelem Pydantic i użyj model_validate modelu; zapoznaj się z notatką poniżej, aby uzyskać więcej informacji.
  4. Przejdź przez pola w definicji i ustaw wartości, a następnie ten słownik jest przekazywany do konstruktora modelu danych jako argumenty nazwane (chyba że model danych jest sam w sobie słownikiem, w takim przypadku jest zwracany bez zmian).

Notatka

Używanie Pydantic z wbudowaną serializacją

Podczas definiowania modelu przy użyciu modelu Pydantic BaseModel użyje model_dump metod i model_validate do serializacji i deserializacji modelu danych do i z dyktowania. Jest to wykonywane przy użyciu metody model_dump bez żadnych parametrów, jeśli chcesz to kontrolować, rozważ zaimplementowanie ToDictMethodProtocol w modelu danych, tak jak to było wcześniej wypróbowane.

Wkrótce

Więcej informacji wkrótce.