Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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. |