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.
Microsoft.Extensions.VectorData maakt gebruik van een model-first benadering voor interactie met databases.
Alle methoden voor upsert of het ophalen van records maken gebruik van sterk getypeerde modelklassen. Er zijn twee manieren om het gegevensmodel te definiëren:
- Door eigenschappen op de modelklassen te decoreren met kenmerken die het doel van elke eigenschap aangeven.
- Door uw opslagschema te definiëren met behulp van een recorddefinitie die u afzonderlijk van het gegevensmodel opgeeft. De recorddefinitie is een VectorStoreCollectionDefinition definitie die eigenschappen bevat.
Hier volgt een voorbeeld van een klasse of gegevensmodel waarvan de eigenschappen zijn versierd met VectorStore*Attribute kenmerken.
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: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
[VectorStoreData(IsIndexed = true)]
public required string[] Tags { get; set; }
}
Eigenschappen van gegevensmodel
Opmerking
De .NET eigenschapstypen die worden ondersteund voor sleutels, gegevens en vectoren verschillen per database. Raadpleeg de documentatie van de door u gekozen vectorarchiefprovider voor informatie over ondersteunde typen.
Sleuteleigenschap
Elk gegevensmodel moet een sleuteleigenschap hebben waarmee elke record in de verzameling uniek wordt geïdentificeerd.
Gebruik het VectorStoreKeyAttribute kenmerk om aan te geven dat uw eigenschap de primaire sleutel van de record is.
[VectorStoreKey]
public ulong HotelId { get; set; }
In de volgende tabel ziet u de parameters voor VectorStoreKeyAttribute.
| Kenmerk | Verplicht | Beschrijving |
|---|---|---|
| IsAutoGenerated | No | Geeft aan of de sleutelwaarde automatisch wordt gegenereerd door de database. De standaardinstelling is false. |
| StorageName | No | Kan worden gebruikt om een alternatieve naam op te geven voor de eigenschap in de database. Deze parameter wordt bijvoorbeeld niet ondersteund door alle providers, waarbij alternatieven zoals JsonPropertyNameAttribute worden ondersteund. |
Gegevenseigenschap
Gegevenseigenschappen bevatten inhoud voor algemeen gebruik, zoals tekst, tags of andere metagegevens die worden opgehaald bij het zoeken naar records, en kunnen eventueel ook worden geïndexeerd voor filteren.
Gebruik het VectorStoreDataAttribute kenmerk om aan te geven dat uw eigenschap algemene gegevens bevat die geen sleutel of vector zijn.
[VectorStoreData(IsIndexed = true)]
public required string HotelName { get; set; }
In de volgende tabel ziet u de parameters voor VectorStoreDataAttribute.
| Kenmerk | Verplicht | Beschrijving |
|---|---|---|
| IsIndexed | No | Hiermee wordt aangegeven of de eigenschap moet worden geïndexeerd voor filteren in gevallen waarin een database moet inschakelen voor indexering per eigenschap. De standaardwaarde is false. |
| IsFullTextIndexed | No | Hiermee wordt aangegeven of de eigenschap moet worden geïndexeerd voor zoeken in volledige tekst naar databases die zoeken in volledige tekst ondersteunen. De standaardwaarde is false. |
| StorageName | No | Kan worden gebruikt om een alternatieve naam op te geven voor de eigenschap in de database. Deze parameter wordt bijvoorbeeld niet ondersteund door alle providers, waarbij alternatieven zoals JsonPropertyNameAttribute worden ondersteund. |
Vectoreigenschap
Vectoreigenschappen bevatten de insluitvectors die worden gebruikt voor overeenkomsten zoeken; in geavanceerde scenario's kan een gegevensmodel meerdere vectoreigenschappen hebben om het zoeken over verschillende aspecten van de record te ondersteunen.
Gebruik het VectorStoreVectorAttribute kenmerk om aan te geven dat uw eigenschap een vector bevat.
[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
Het is ook mogelijk om te gebruiken VectorStoreVectorAttribute voor eigenschappen die geen vectortype hebben, bijvoorbeeld een eigenschap van het type string. Wanneer een eigenschap op deze manier is ingericht, moet u een IEmbeddingGenerator exemplaar opgeven voor het vectorarchief. Wanneer u de record upsert, wordt de tekst in de string eigenschap automatisch geconverteerd en opgeslagen als vector in de database. (Het is niet mogelijk om een vector op te halen met behulp van dit mechanisme.)
[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public string DescriptionEmbedding { get; set; }
Aanbeveling
Zie Vectoreigenschappen en het genereren van insluiten voor meer informatie over het gebruik van ingebouwde insluitingsgeneratie.
In de volgende tabel ziet u de parameters voor VectorStoreVectorAttribute.
| Kenmerk | Verplicht | Beschrijving |
|---|---|---|
| Dimensions | Ja | Het aantal dimensies dat de vector heeft. Dit is vereist bij het maken van een vectorindex voor een verzameling. |
| IndexKind | No | Het type index waarmee de vector moet worden geïndexeer. De standaardinstelling is afhankelijk van het type vectorarchief. |
| DistanceFunction | No | Het type functie dat moet worden gebruikt bij het uitvoeren van vectorvergelijking tijdens vectorzoekopdrachten over deze vector. De standaardinstelling is afhankelijk van het type vectorarchief. |
| StorageName | No | Kan worden gebruikt om een alternatieve naam op te geven voor de eigenschap in de database. Deze parameter wordt bijvoorbeeld niet ondersteund door alle providers, waarbij alternatieven zoals JsonPropertyNameAttribute worden ondersteund. |
Algemene indextypen en functietypen voor afstand worden geleverd als statische waarden voor de IndexKind en DistanceFunction klassen. Implementaties van afzonderlijke vectoropslag kunnen ook hun eigen indextypen en afstandsfuncties gebruiken, waarbij de database ongebruikelijke typen ondersteunt.
Vectoreigenschappen en het genereren van insluiten
Vectordatabases gaan allemaal over het opslaan van insluitingen ( of numerieke representaties van uw gegevens) die worden gegenereerd door een insluitmodel. Bij het opslaan of zoeken van gegevens moet het genereren van insluiten eerst worden uitgevoerd om de doorzoekbare gegevens te converteren naar dergelijke insluitingen. MEVD biedt twee benaderingen voor het insluiten van generatie: handmatig en automatisch.
Handmatige generatie van insluiten op laag niveau
U kunt de vectoreigenschap definiëren als float[] of ReadOnlyMemory<float>, die het insluiten rechtstreeks vertegenwoordigt, en zelf insluitingen genereren vóór elke bewerking:
[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
Tijdens het zoeken genereert u de insluiting voor de querytekst en geeft u deze door aan SearchAsync:
ReadOnlyMemory<float> searchEmbedding =
(await embeddingGenerator.GenerateAsync("Find a happy hotel")).Vector;
var searchResult = collection.SearchAsync(searchEmbedding, top: 3);
Hoewel dit werkt, moet u het genereren van insluitingen op elke oproepsite beheren.
Automatisch genereren van insluiten (aanbevolen)
De aanbevolen methode is om een IEmbeddingGenerator<TInput,TEmbedding> vectorarchief te configureren. Hiermee kunt u de vectoreigenschap definiëren met behulp van het brontype (bijvoorbeeld string) in plaats van float[] of ReadOnlyMemory<float>. MEVD verwerkt vervolgens het automatisch genereren van insluiten tijdens upsert- en zoekbewerkingen.
Definieer eerst de vectoreigenschap als string:
[VectorStoreVector(Dimensions: 1536)]
public string DescriptionEmbedding { get; set; }
Configureer vervolgens een generator voor insluiten bij het maken van uw vectorarchief:
VectorStore vectorStore = new QdrantVectorStore(
new QdrantClient("localhost"),
ownsClient: true,
new QdrantVectorStoreOptions
{
EmbeddingGenerator = embeddingGenerator
});
U kunt nu tekst rechtstreeks doorgeven - MEVD genereert insluitingen onder de schermen:
// Search with a plain text query - embedding is generated automatically.
var searchResult = collection.SearchAsync("Find a happy hotel", top: 3);
Belangrijk
Vectoreigenschappen die op deze manier zijn geconfigureerd, bieden geen ondersteuning voor het ophalen van de gegenereerde vector of de oorspronkelijke tekst uit de database. Als u de oorspronkelijke tekst wilt opslaan, voegt u een afzonderlijke gegevenseigenschap toe.
Insluitgeneratoren kunnen ook worden geconfigureerd op het niveau van verzameling, recorddefinitie of afzonderlijke vectoreigenschap. Verschillende insluitmodellen ondersteunen verschillende vectorgrootten; Zorg ervoor dat de Dimensions waarde overeenkomt met het model dat u hebt geconfigureerd. Zie Embeddings in .NET voor meer informatie over het insluiten van generatoren en de Microsoft.Extensions.AI abstracties.
Dynamische toewijzing aan een .NET Woordenlijst
Er zijn gevallen waarin het niet wenselijk of mogelijk is om een sterk getypt .NET type toe te wijzen aan de database. Stel dat u tijdens het compileren niet weet hoe uw databaseschema eruitziet en dat het schema alleen via de configuratie wordt opgegeven. Het maken van een .NET type dat het schema weerspiegelt, is in dit geval onmogelijk. In plaats daarvan kunt u dynamisch toewijzen met behulp van een Dictionary<string, object?> recordtype. Eigenschappen worden toegevoegd aan de Dictionary with-sleutel als de eigenschapsnaam en de waarde als de eigenschapswaarde.
Opmerking
De meeste apps gebruiken eenvoudigweg sterk getypte .NET typen om hun gegevens te modelleren. Dynamische toewijzing via Dictionary<string, object?> is bedoeld voor geavanceerde, willekeurige scenario's voor gegevenstoewijzing.
Schemagegevens opgeven bij gebruik Dictionary
Wanneer u een Dictionarydatabase gebruikt, moeten providers nog steeds weten hoe het databaseschema eruitziet. Zonder de schemagegevens kan de provider geen verzameling maken of weten hoe deze kan worden toegewezen aan en van de opslagweergave die door elke database wordt gebruikt.
U kunt een recorddefinitie gebruiken om de schemagegevens op te geven. In tegenstelling tot een gegevensmodel kan tijdens runtime een recorddefinitie worden gemaakt op basis van configuratie wanneer schemagegevens niet bekend zijn tijdens het compileren.
Voorbeeld
Als u een provider wilt gebruiken Dictionary , geeft u dit op als uw gegevensmodel wanneer u de verzameling maakt. Geef ook een recorddefinitie op.
VectorStoreCollectionDefinition definition = new()
{
Properties =
[
new VectorStoreKeyProperty("Key", typeof(string)),
new VectorStoreDataProperty("Term", typeof(string)),
new VectorStoreDataProperty("Definition", typeof(string)),
new VectorStoreVectorProperty("DefinitionEmbedding", typeof(ReadOnlyMemory<float>), dimensions: 1536)
]
};
// Use GetDynamicCollection instead of the regular GetCollection method
// to get an instance of a collection using Dictionary<string, object?>.
VectorStoreCollection<object, Dictionary<string, object?>> dynamicDataModelCollection =
vectorStore.GetDynamicCollection("glossary", definition);
// Since schema information is available from the record definition,
// it's possible to create a collection with the right vectors,
// dimensions, indexes, and distance functions.
await dynamicDataModelCollection.EnsureCollectionExistsAsync();
// When retrieving a record from the collection,
// access key, data, and vector values via the dictionary entries.
Dictionary<string, object?>? record = await dynamicDataModelCollection.GetAsync("SK");
Console.WriteLine(record["Definition"]);