Adatok kezelése

Miután definiálta az adatmodellt , és beszerzett egy VectorStoreCollection<TKey,TRecord>rekordot, kezelheti a rekordokat a vektortároló-gyűjteményben. Ez a cikk az alapvető adatkezelési műveleteket ismerteti: a rekordok frissítését, törlését és lekérését. Az adatok vektoros hasonlóság használatával történő keresését a Vektorkeresés ismerteti.

Az alábbi példák az alábbi adatmodellt használják, amely automatikus beágyazási generálást használ:

public class Hotel
{
    [VectorStoreKey]
    public ulong HotelId { get; set; }

    [VectorStoreData(IsIndexed = true)]
    public required string HotelName { get; set; }

    [VectorStoreData(IsFullTextIndexed = true)]
    public required string Description { get; set; }

    [VectorStoreVector(Dimensions: 1536, DistanceFunction = DistanceFunction.CosineSimilarity)]
    public required string DescriptionEmbedding { get; set; }

    [VectorStoreData(IsIndexed = true)]
    public required string[] Tags { get; set; }
}

Vegye figyelembe, hogy a DescriptionEmbedding tulajdonság string, nem pedig vektortípus, mint a ReadOnlyMemory<float>. Ez azt jelenti, hogy a MEVD automatikusan generál beágyazásokat a rekordok feltöltésekor a IEmbeddingGenerator<TInput,TEmbedding> vektortárolóban konfigurált használatával.

A következő beállítási kód beszerez egy kollekciót, és biztosítja, hogy létezik.

var vectorStore = new QdrantVectorStore(
    new QdrantClient("localhost"),
    ownsClient: true,
    new QdrantVectorStoreOptions
    {
        EmbeddingGenerator = embeddingGenerator
    });

var collection = vectorStore.GetCollection<ulong, Hotel>("hotels");
await collection.EnsureCollectionExistsAsync();

Upsert rekordok

Új rekord beszúrására vagy meglévő frissítésére használható UpsertAsync . Ha már létezik ugyanazzal a kulccsal rendelkező rekord, a program lecseréli; ellenkező esetben egy új rekord jön létre:

var hotel = new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A happy hotel with good vibes.",
    DescriptionEmbedding = "A happy hotel with good vibes.",
    Tags = ["happy", "vibes"]
};

await collection.UpsertAsync(hotel);

Ha egyszerre több rekordot szeretne létrehozni, adjon át egy gyűjteményt:

var hotels = new[]
{
    new Hotel
    {
        HotelId = 1,
        HotelName = "Hotel Happy",
        Description = "A happy hotel with good vibes.",
        DescriptionEmbedding = "A happy hotel with good vibes.",
        Tags = ["happy", "vibes"]
    },
    new Hotel
    {
        HotelId = 2,
        HotelName = "Hotel Luxury",
        Description = "A luxurious hotel with top-notch amenities.",
        DescriptionEmbedding = "A luxurious hotel with top-notch amenities.",
        Tags = ["luxury", "amenities"]
    }
};

await collection.UpsertAsync(hotels);

Jótanács

Előnyben részesítse a köteg túlterhelését több rekord hozzáadásakor, mivel ez csökkenti az adatbázis-kerekítéseket. Az automatikus beágyazás generálással a tömeges feldolgozás általában minden rekordhoz beágyazásokat generál a beágyazási modell egyetlen hívásával, ami hatékonyabb, mintha egyenként generálnánk őket.

Rekordok törlése

A DeleteAsync kulcs alapján rekordokat távolíthat el a gyűjteményből.

await collection.DeleteAsync(key: 1);

Ha egyszerre több rekordot szeretne törölni, adjon át egy gyűjteményt:

await collection.DeleteAsync(keys: [1, 2, 3]);

Megjegyzés:

Ha a megadott kulccsal rendelkező rekord nem létezik, a rendszer csendesen figyelmen kívül hagyja a törlési műveletet.

Rekordok lekérése kulcs szerint

Használja a GetAsync parancsot a rekordok kulcsuk szerinti lekéréséhez.

Hotel? hotel = await collection.GetAsync(key: 1);

GetAsync a rekordot adja vissza, ha megtalálható, vagy null ha nincs az adott kulccsal rendelkező rekord.

Ha egyszerre több rekordot szeretne lekérni, adjon át egy kulcsgyűjteményt. Ez a túlterhelés egy IAsyncEnumerable<TRecord>-t ad vissza, amely csak a talált rekordokat tartalmazza.

IAsyncEnumerable<Hotel> hotels = collection.GetAsync(keys: [1, 2, 3]);

await foreach (Hotel hotel in hotels)
{
    Console.WriteLine(hotel.HotelName);
}

Megjegyzés:

A rendszer csak a talált rekordokat adja vissza, így az eredményhalmaz kisebb lehet a kért kulcsok készleténél. A visszaadott rekordok megrendelésére nincs garancia.

Vektorok felvétele az eredményekbe

Alapértelmezés szerint a vektortulajdonságok nem szerepelnek a beolvasott rekordokban, ami csökkenti az adatátvitelt. A belefoglalásukhoz adjon meg egy RecordRetrievalOptions-t, ahol a IncludeVectors értéke true:

var hotel = await collection.GetAsync(
    key: 1,
    new() { IncludeVectors = true });

Rekordok lekérése szűrő alapján

A szűrő túlterhelésével GetAsync egy adott feltételnek megfelelő rekordokat kérdezhet le kulcs- vagy vektor-hasonlóság helyett:

IAsyncEnumerable<Hotel> hotels = collection.GetAsync(
    filter: h => h.HotelName == "Hotel Happy",
    top: 10);

await foreach (Hotel hotel in hotels)
{
    Console.WriteLine(hotel.HotelName);
}

A szűrők LINQ-kifejezésekként vannak kifejezve. A támogatott kifejezések az adatbázis-szolgáltatótól függően eltérőek lehetnek, de minden szolgáltató támogatja az olyan gyakori összehasonlításokat, mint az egyenlőség, az egyenlőtlenség és a logikai && és ||a .

Fontos

Ahhoz, hogy a tulajdonságok használhatóak legyenek a szűrőkben, számos adatbázis esetében indexelni kell őket. Még akkor is, ha nincs szükség indexekre, jelentősen növelhetik a szűrők teljesítményét. Állítsa be IsIndexed = true az VectorStoreDataAttribute adatmodell definiálásakor. További információ: Adattulajdonság.

Szűrési beállítások

A lapozás, a rendezés és a vektorok eredményben való szerepeltetésére használható FilteredRecordRetrievalOptions<TRecord> :

IAsyncEnumerable<Hotel> hotels = collection.GetAsync(
    filter: h => h.Tags.Contains("luxury"),
    top: 10,
    new()
    {
        Skip = 20,
        IncludeVectors = false,
        OrderBy = order => order.Ascending(h => h.HotelName)
    });

Az alábbi táblázat a rendelkezésre álló lehetőségeket ismerteti:

Lehetőség Leírás
Skip Az eredmények visszaadása előtt kihagyandó egyező rekordok száma. Lapozáshoz hasznos. Az alapértelmezett érték 0.
OrderBy Megadja az eredményeket sorrendbe hozó tulajdonságot és irányt. Használja a .Ascending() vagy .Descending() jelölőt a rendezés meghatározásához. Ha nincs megadva, a sorrend nem determinisztikus.
IncludeVectors Vektoradatok felvétele a visszaadott rekordokba. Az alapértelmezett érték false.