Vektorkeresés vektortároló-szolgáltatókkal

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.

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

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