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.
A Microsoft.Extensions.VectorData kódtár vektorkeresési képességeket biztosít a vektortár absztrakcióinak részeként. Ezek a képességek közé tartozik a szűrés és sok más lehetőség.
Vektoros keresés
A SearchAsync metódus hasonlósági keresést végez, olyan rekordokat ad vissza, amelyek vektortulajdonsága a leginkább hasonlít egy adott értékhez. Feltételezve, hogy már tartalmaz adatokat tartalmazó gyűjteményt, íme egy minimális minta a Qdrant használatával végzett vektorkeresésről:
// Create a Qdrant VectorStore object and get a VectorStoreCollection for a collection that already contains records
VectorStore vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
VectorStoreCollection<ulong, Hotel> collection = vectorStore.GetCollection<ulong, Hotel>("skhotels");
// Get the 3 hotels whose vector property is most similar to the query text
IAsyncEnumerable<VectorSearchResult<Hotel>> results = collection.SearchAsync("Big rooms with a view", top: 3);
// Inspect the returned hotels and their similarity scores
await foreach (VectorSearchResult<Hotel> record in results)
{
Console.WriteLine("Found hotel description: " + record.Record.Description);
Console.WriteLine("Found record score: " + record.Score);
}
A beágyazási generációról további információt a Vektor tulajdonságai és a beágyazási generáció című témakörben talál.
Az eredmények száma és az eredmények kihagyása
SearchAsync kötelező top paraméterrel rendelkezik, amely szabályozza a keresésből visszaadott rekordok maximális számát. Mindig vegye figyelembe, hogy valójában hány felső rekordra van szüksége, mivel a túl sok adat lekérése csökkentheti az alkalmazás teljesítményét.
IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult = collection.SearchAsync("Big rooms with a view", top: 3);
Emellett választhatóan kihagyhatja a rekordokat. A következő keresés például a 20 legfontosabb terméket adja vissza a 40 kihagyása után:
IAsyncEnumerable<VectorSearchResult<Product>> results = collection.SearchAsync(
"Green socks",
top: 20,
new() { Skip = 40 });
top és Skip nagy számú eredményt külön hívásokkal lekérhetünk lapozás segítségével. Előfordulhat azonban, hogy ez a technika nem működik megfelelően az adatbázisban, mivel továbbra is meg kell találnia és feldolgoznia a kihagyott rekordokat. További információkért tekintse meg az adatbázis dokumentációját.
Metaadatok szűrése
Ezzel a VectorSearchOptions<TRecord>.Filter beállítással szűrheti a kiválasztott gyűjtemény rekordjait a vektorkeresés alkalmazása előtt. Ennek több előnye is van:
- Csökkenti a késést és a feldolgozási költségeket, mivel csak a szűrés után fennmaradó rekordokat kell összehasonlítani a keresési vektorral, ezért kevesebb vektor-összehasonlítást kell végezni.
- Korlátozza az eredményhalmazt. A hozzáférés-vezérlést például úgy valósíthatja meg, hogy kizárja azokat az adatokat, amelyekhez a felhasználónak nem kellene hozzáféréssel rendelkeznie, vagy csak egy adott termékkategórián belül kell keresnie.
A szűréshez használandó mezők esetében számos vektortároló esetében először ezeket a mezőket kell indexelni. Az adattulajdonságok indexelésének engedélyezéséről további információt az Adattulajdonságok című témakörben talál.
A szűrők az adatmodell típusán alapuló LINQ-kifejezések használatával vannak kifejezve. A támogatott LINQ-kifejezések halmaza az egyes adatbázisok által támogatott funkcióktól függően változik, de minden adatbázis támogatja a gyakori kifejezések széles körét, például egyenlő, nem egyenlő andés or.
class Glossary
{
// ...
// Category is marked as indexed, since you want to filter using this property.
[VectorStoreData(IsIndexed = true)]
public required string Category { get; set; }
// Tags is marked as indexed, since you want to filter using this property.
[VectorStoreData(IsIndexed = true)]
public required List<string> Tags { get; set; }
}
IAsyncEnumerable<VectorSearchResult<Glossary>> results = collection.SearchAsync(
"Some term",
top: 3,
new()
{
Filter = r => r.Category == "External Definitions" && r.Tags.Contains("memory")
});
Vektorok felvétele az eredményekbe
Alapértelmezés szerint a vektortulajdonságok nem szerepelnek a keresési eredményekben, ami csökkenti az adatátvitelt. A keresést úgy konfigurálhatja, hogy tartalmazza őket:
IAsyncEnumerable<VectorSearchResult<Product>> results = collection.SearchAsync(
"Green socks",
top: 3,
new() { IncludeVectors = true });
A vektortulajdonság megadása
A legtöbb forgatókönyvben csak egyetlen vektortulajdonság van definiálva az adatmodellben, és SearchAsync automatikusan rákeres. Ha azonban több vektortulajdonság van definiálva, meg kell adnia, hogy melyiket használja:
class Product
{
// ...
// Multiple vector properties:
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> DescriptionEmbedding { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> FeatureListEmbedding { get; set; }
}
IAsyncEnumerable<VectorSearchResult<Hotel>> results = collection.SearchAsync(
"I'm looking for a product with a specific feature.",
top: 3,
new() { VectorProperty = r => r.FeatureListEmbedding });
Hibrid keresés
A hibrid keresés kombinálja a vektoros hasonlósági keresést a hagyományos kulcsszókereséssel, párhuzamosan hajtja végre, és visszaadja a két találatkészlet kombinációját. Ez javíthatja a keresés minőségét, mivel a kulcsszavak egyeztetése pontosan rögzítheti azokat a kifejezésegyezéseket, amelyeket a vektorok hasonlósága kihagyhat, és fordítva.
Megjegyzés:
A hibrid keresés csak az azt támogató adatbázisokban érhető el. A felületet csak az adatbázisok szolgáltatói implementálják IKeywordHybridSearchable<TRecord> .
A hibrid keresés használatához az adatmodellnek szüksége van egy sztringmezőre, amelyen keresztül IsFullTextIndexedengedélyezve van a teljes szöveges keresés:
class Hotel
{
[VectorStoreKey]
public ulong Key { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public required string Description { get; set; }
[VectorStoreVector(1536)]
public string DescriptionEmbedding { get; set; }
}
Ezután hívja meg HybridSearchAsync, és adja át a keresési szöveget és a kulcsszavakat is:
var hybridCollection = (IKeywordHybridSearchable<Hotel>)collection;
IAsyncEnumerable<VectorSearchResult<Hotel>> results = hybridCollection.HybridSearchAsync(
"I'm looking for a hotel where customer happiness is the priority.",
["happiness", "hotel", "customer"],
top: 3);
A vektorkereséshez (top, , Skip, Filter, IncludeVectorsVectorProperty) leírt összes lehetőség a hibrid kereséshez is elérhető a következőn keresztülHybridSearchOptions<TRecord>: .
Emellett a hibrid keresés támogatja azt AdditionalProperty a lehetőséget, amely meghatározza, hogy melyik teljes szöveges keresési tulajdonságot célozza meg. Ha az adatmodell csak egy tulajdonsággal IsFullTextIndexed = truerendelkezik, az automatikusan használatos; ha több van, meg kell adnia, hogy melyik:
IAsyncEnumerable<VectorSearchResult<Hotel>> results = hybridCollection.HybridSearchAsync(
"I'm looking for a hotel where customer happiness is the priority.",
["happiness", "hotel", "customer"],
top: 3,
new()
{
VectorProperty = r => r.DescriptionEmbedding,
AdditionalProperty = r => r.Description
});