Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De Microsoft.Extensions.VectorData bibliotheek biedt vectorzoekmogelijkheden als onderdeel van de abstracties van het vectorarchief. Deze mogelijkheden omvatten filteren en vele andere opties.
Aanbeveling
Als u wilt zien hoe u zelf kunt zoeken zonder insluitingen te genereren, raadpleegt u Laat het vectorarchief insluitingen genereren.
Zoeken met vectoren
Met de SearchAsync methode kunt u zoeken met behulp van gegevens die al zijn gevectoriseerd. Deze methode gebruikt een vector en een optionele VectorSearchOptions<TRecord> klasse als invoer. SearchAsync is beschikbaar voor de volgende typen:
Let op: VectorStoreCollection<TKey,TRecord> implementeert IVectorSearchable<TRecord>.
Ervan uitgaande dat u een verzameling hebt die al gegevens bevat, kunt u deze eenvoudig doorzoeken. Hier volgt een voorbeeld met Qdrant.
public async Task SearchAsync()
{
// Create a Qdrant VectorStore object and choose
// an existing collection that already contains records.
VectorStore vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
VectorStoreCollection<ulong, Hotel> collection =
vectorStore.GetCollection<ulong, Hotel>("skhotels");
// Generate a vector for your search text, using
// your chosen embedding generation implementation.
ReadOnlyMemory<float> searchVector =
await GenerateAsync("I'm looking for a hotel where customer happiness is the priority.");
// Do the search, passing an options object with
// a Top value to limit results to the single top match.
IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult =
collection.SearchAsync(searchVector, top: 1);
// Inspect the returned hotel.
await foreach (VectorSearchResult<Hotel> record in searchResult)
{
Console.WriteLine("Found hotel description: " + record.Record.Description);
Console.WriteLine("Found record score: " + record.Score);
}
}
Aanbeveling
Zie het genereren van insluitingen voor meer informatie over het genereren van insluitingen.
Zoeken met automatisch gegenereerde insluitingen
Als u een IEmbeddingGenerator<TInput,TEmbedding> vectorarchief of -verzameling hebt geconfigureerd, kunt u een string rechtstreeks doorgeven aan SearchAsync in plaats van een vooraf samengestelde vector. Het vectorarchief genereert automatisch het insluiten van zoekopdrachten:
public async Task SearchWithAutoEmbeddingAsync()
{
// If an IEmbeddingGenerator is configured on the vector store or collection,
// you can pass a string directly to SearchAsync. The store generates
// the search embedding for you.
VectorStore vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
VectorStoreCollection<ulong, Hotel> collection =
vectorStore.GetCollection<ulong, Hotel>("skhotels");
// Pass the search text directly — no manual embedding generation required.
IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult =
collection.SearchAsync("I'm looking for a hotel where customer happiness is the priority.", top: 1);
await foreach (VectorSearchResult<Hotel> record in searchResult)
{
Console.WriteLine("Found hotel description: " + record.Record.Description);
Console.WriteLine("Found record score: " + record.Score);
}
}
Zie voor meer informatie over het configureren van een insluitingen-generator in uw vectorarchief, Laat het vectorarchief insluitingen genereren.
Ondersteunde vectortypen
SearchAsync gebruikt een algemeen type als vectorparameter. De typen vectoren die door elk gegevensarchief worden ondersteund, variëren.
Het is ook belangrijk dat het zoekvectortype overeenkomt met de doelvector die wordt doorzocht, bijvoorbeeld als u twee vectoren op dezelfde record met verschillende vectortypen hebt, moet u ervoor zorgen dat de zoekvector die u opgeeft overeenkomt met het type specifieke vector dat u wilt gebruiken. Zie VectorProperty voor informatie over het kiezen van een doelvector als u meer dan één record hebt.
Opties voor vectorzoekopdrachten
De volgende opties kunnen worden opgegeven met behulp van de VectorSearchOptions<TRecord> klasse.
VectorProperty
Gebruik de VectorProperty optie om de vectoreigenschap op te geven die tijdens de zoekopdracht moet worden gericht. Als er geen gegevens worden opgegeven en het gegevensmodel slechts één vector bevat, wordt die vector gebruikt. Als het gegevensmodel geen vectoren of meerdere vectoren bevat en VectorProperty niet is opgegeven, genereert de zoekmethode een uitzondering.
public async Task VectorPropertySearch()
{
var vectorStore = new InMemoryVectorStore();
InMemoryCollection<int, Product> collection =
vectorStore.GetCollection<int, Product>("skproducts");
// Create the vector search options and indicate that you want to search the FeatureListEmbedding property.
var vectorSearchOptions = new VectorSearchOptions<Product>
{
VectorProperty = r => r.FeatureListEmbedding
};
// This snippet assumes searchVector is already provided, having been created using the embedding model of your choice.
IAsyncEnumerable<VectorSearchResult<Product>> searchResult =
collection.SearchAsync(searchVector, top: 3, vectorSearchOptions);
}
public sealed class Product
{
[VectorStoreKey]
public int Key { get; set; }
[VectorStoreData]
public required string Description { get; set; }
[VectorStoreData]
public required List<string> FeatureList { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> DescriptionEmbedding { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> FeatureListEmbedding { get; set; }
}
Resultaten overslaan of topresultaten selecteren
Met de top parameter aan SearchAsync<TInput>(TInput, Int32, VectorSearchOptions<TRecord>, CancellationToken) en de VectorSearchOptions<TRecord>.Skip optie kunt u het aantal resultaten beperken. De top parameter beperkt de resultaten tot de bovenste n resultaten. Met Skip de optie worden een aantal resultaten boven aan de resultatenset overgeslagen. U kunt deze besturingselementen gebruiken om paging uit te voeren als u een groot aantal resultaten wilt ophalen met behulp van afzonderlijke aanroepen.
// Create the vector search options and indicate
// that you want to skip the first 40 results.
VectorSearchOptions<Product> vectorSearchOptions = new()
{
Skip = 40
};
// This snippet assumes searchVector is already provided,
// having been created using the embedding model of your choice.
// Pass 'top: 20' to indicate that you want to retrieve
// the next 20 results after skipping the first 40.
IAsyncEnumerable<VectorSearchResult<Product>> searchResult =
collection.SearchAsync(searchVector, top: 20, vectorSearchOptions);
// Iterate over the search results.
await foreach (VectorSearchResult<Product> result in searchResult)
{
Console.WriteLine(result.Record.FeatureList);
}
De standaardwaarde voor Skip is 0.
IncludeVectors
Met de VectorSearchOptions<TRecord>.IncludeVectors optie kunt u opgeven of u vectoren wilt retourneren in de zoekresultaten. Als false is, blijven de vectoreigenschappen op het geretourneerde model null. Het gebruik false kan de hoeveelheid gegevens die tijdens het zoeken worden opgehaald uit het vectorarchief aanzienlijk verminderen, waardoor zoekopdrachten efficiënter worden.
De standaardwaarde voor IncludeVectors is false.
// Create the vector search options and indicate that you want to include vectors in the search results.
var vectorSearchOptions = new VectorSearchOptions<Product>
{
IncludeVectors = true
};
// This snippet assumes searchVector is already provided,
// having been created using the embedding model of your choice.
IAsyncEnumerable<VectorSearchResult<Product>> searchResult =
collection.SearchAsync(searchVector, top: 3, vectorSearchOptions);
// Iterate over the search results.
await foreach (VectorSearchResult<Product> result in searchResult)
{
Console.WriteLine(result.Record.FeatureList);
}
Filter
Gebruik de VectorSearchOptions<TRecord>.Filter optie om de records in de gekozen verzameling te filteren voordat u de vectorzoekopdracht toepast. Dit heeft meerdere voordelen:
- Vermindert de latentie en verwerkingskosten, omdat alleen records die na het filteren resteren, moeten worden vergeleken met de zoekvector en daarom moeten er minder vectorvergelijkingen worden uitgevoerd.
- Hiermee beperkt u de resultatenset. U kunt bijvoorbeeld toegangsbeheer implementeren door gegevens uit te sluiten waartoe de gebruiker geen toegang mag hebben.
Voor velden die moeten worden gebruikt voor filteren, moeten deze velden eerst worden geïndexeerd in veel vectorarchieven. Sommige vectorarchieven staan filteren toe met behulp van elk veld, maar kunnen eventueel indexering toestaan om de filterprestaties te verbeteren.
Als u een verzameling maakt door middel van vector store abstracties en u wilt filtering op een veld inschakelen, stel dan de eigenschap IsIndexed in op true bij het definiëren van uw gegevensmodel of het creëren van uw recorddefinitie.
Aanbeveling
Zie IsIndexed of VectorStoreDataProperty voor meer informatie over het inschakelen.
Filters worden uitgedrukt met LINQ-expressies op basis van het type gegevensmodel. De set ONDERSTEUNDE LINQ-expressies varieert, afhankelijk van de functionaliteit die door elke database wordt ondersteund, maar alle databases ondersteunen een brede basis van algemene expressies, bijvoorbeeld gelijk aan, niet gelijk aan, anden or.
public static async Task FilteredSearchAsync()
{
// Create the vector search options and set the filter on the options.
VectorSearchOptions<Glossary> vectorSearchOptions = new()
{
Filter = r => r.Category == "External Definitions" && r.Tags.Contains("memory")
};
// This snippet assumes searchVector is already provided,
// having been created using the embedding model of your choice.
IAsyncEnumerable<VectorSearchResult<Glossary>> searchResult =
collection.SearchAsync(searchVector, top: 3, vectorSearchOptions);
// Iterate over the search results.
await foreach (VectorSearchResult<Glossary> result in searchResult)
{
Console.WriteLine(result.Record.Definition);
}
}
sealed class Glossary
{
[VectorStoreKey]
public ulong Key { get; set; }
// 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; }
[VectorStoreData]
public required string Term { get; set; }
[VectorStoreData]
public required string Definition { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> DefinitionEmbedding { get; set; }
}