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.
Waarschuwing
De Semantische Kernel Vector Store-functionaliteit is in preview en verbeteringen waarvoor wijzigingen die fouten veroorzaken, kunnen nog steeds in beperkte omstandigheden optreden voordat ze worden uitgebracht.
Waarschuwing
De Semantische Kernel Vector Store-functionaliteit is in preview en verbeteringen waarvoor wijzigingen die fouten veroorzaken, kunnen nog steeds in beperkte omstandigheden optreden voordat ze worden uitgebracht.
Semantische Kernel Vector Store-connectors ondersteunen meerdere manieren om insluitingen te genereren.
Embeddings kunnen door de ontwikkelaar worden gegenereerd en als onderdeel van een record worden doorgegeven wanneer een VectorStoreCollection wordt gebruikt, of ze kunnen intern worden gegenereerd voor de VectorStoreCollection.
Vector Store insluitingen laten genereren
U kunt een generator voor insluiten configureren in uw vectorarchief, zodat insluitingen automatisch kunnen worden gegenereerd tijdens zowel upsert- als zoekbewerkingen, waardoor handmatige voorverwerking niet meer nodig is.
Als u het automatisch genereren van vectoren op upsert wilt inschakelen, wordt de vectoreigenschap in uw gegevensmodel gedefinieerd als het brontype, bijvoorbeeld tekenreeks, maar nog steeds ingericht met een VectorStoreVectorPropertyAttribute.
[VectorStoreVector(1536)]
public string Embedding { get; set; }
Voordat je gaat upserten, moet de Embedding eigenschap de tekenreeks bevatten waaruit een vector moet worden gegenereerd. Het type vector dat is opgeslagen in de database (bijvoorbeeld float32, float16, enzovoort) wordt afgeleid van de geconfigureerde insluitingsgenerator.
Belangrijk
Deze vectoreigenschappen bieden geen ondersteuning voor het ophalen van de gegenereerde vector of de oorspronkelijke tekst waaruit de vector is gegenereerd. Ze slaan ook de oorspronkelijke tekst niet op. Als de oorspronkelijke tekst moet worden opgeslagen, moet er een afzonderlijke eigenschap Gegevens worden toegevoegd om deze op te slaan.
Insluitingsgeneratoren die de Microsoft.Extensions.AI abstracties implementeren, worden ondersteund en kunnen op verschillende niveaus worden geconfigureerd:
In het vectorarchief: u kunt een standaard insluitingsgenerator instellen voor het gehele vectorarchief. Deze generator wordt gebruikt voor alle verzamelingen en eigenschappen, tenzij deze worden overschreven.
using Microsoft.Extensions.AI; using Microsoft.SemanticKernel.Connectors.Qdrant; using OpenAI; using Qdrant.Client; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var vectorStore = new QdrantVectorStore( new QdrantClient("localhost"), ownsClient: true, new QdrantVectorStoreOptions { EmbeddingGenerator = embeddingGenerator });Bij een verzameling: u kunt een embed generator configureren voor een specifieke verzameling, waarbij de generator op winkel-niveau wordt overschreven.
using Microsoft.Extensions.AI; using Microsoft.SemanticKernel.Connectors.Qdrant; using OpenAI; using Qdrant.Client; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var collectionOptions = new QdrantCollectionOptions { EmbeddingGenerator = embeddingGenerator }; var collection = new QdrantCollection<ulong, MyRecord>( new QdrantClient("localhost"), "myCollection", ownsClient: true, collectionOptions);Op een Recorddefinitie: Wanneer u eigenschappen programmatisch definieert met
VectorStoreCollectionDefinition, kunt u een insluitgenerator voor alle eigenschappen specificeren.using Microsoft.Extensions.AI; using Microsoft.Extensions.VectorData; using Microsoft.SemanticKernel.Connectors.Qdrant; using OpenAI; using Qdrant.Client; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var definition = new VectorStoreCollectionDefinition { EmbeddingGenerator = embeddingGenerator, Properties = new List<VectorStoreProperty> { new VectorStoreKeyProperty("Key", typeof(ulong)), new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536) } }; var collectionOptions = new QdrantCollectionOptions { Definition = definition }; var collection = new QdrantCollection<ulong, MyRecord>( new QdrantClient("localhost"), "myCollection", ownsClient: true, collectionOptions);Op een vectoreigenschapsdefinitie: Wanneer u eigenschappen programmatisch definieert, kunt u een insluitgenerator rechtstreeks op de eigenschap instellen.
using Microsoft.Extensions.AI; using Microsoft.Extensions.VectorData; using OpenAI; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var vectorProperty = new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536) { EmbeddingGenerator = embeddingGenerator };
Voorbeeldgebruik
In het volgende voorbeeld ziet u hoe u de insluitgenerator gebruikt om automatisch vectoren te genereren tijdens upsert- en zoekbewerkingen. Deze aanpak vereenvoudigt werkstromen door de noodzaak om embeddings vooraf te berekenen handmatig te elimineren.
// The data model
internal class FinanceInfo
{
[VectorStoreKey]
public string Key { get; set; } = string.Empty;
[VectorStoreData]
public string Text { get; set; } = string.Empty;
// Note that the vector property is typed as a string, and
// its value is derived from the Text property. The string
// value will however be converted to a vector on upsert and
// stored in the database as a vector.
[VectorStoreVector(1536)]
public string Embedding => this.Text;
}
// Create an OpenAI embedding generator.
var embeddingGenerator = new OpenAIClient("your key")
.GetEmbeddingClient("your chosen model")
.AsIEmbeddingGenerator();
// Use the embedding generator with the vector store.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<string, FinanceInfo>("finances");
await collection.EnsureCollectionExistsAsync();
// Create some test data.
string[] budgetInfo =
{
"The budget for 2020 is EUR 100 000",
"The budget for 2021 is EUR 120 000",
"The budget for 2022 is EUR 150 000",
"The budget for 2023 is EUR 200 000",
"The budget for 2024 is EUR 364 000"
};
// Embeddings are generated automatically on upsert.
var records = budgetInfo.Select((input, index) => new FinanceInfo { Key = index.ToString(), Text = input });
await collection.UpsertAsync(records);
// Embeddings for the search is automatically generated on search.
var searchResult = collection.SearchAsync(
"What is my budget for 2024?",
top: 1);
// Output the matching result.
await foreach (var result in searchResult)
{
Console.WriteLine($"Key: {result.Record.Key}, Text: {result.Record.Text}");
}
Zelf embeddings genereren
Een generator voor insluiten maken
Zie Embedding-generatie voor voorbeelden van het maken van Semantische Kernel-exemplaren ITextEmbeddingGenerationService.
Zie Microsoft.Extensions.AI.Abstractions voor informatie over hoe u services voor het genereren van embeddings kunt samenstellen.
Embeddings genereren bij upsert met de Semantische Kernel ITextEmbeddingGenerationService
public async Task GenerateEmbeddingsAndUpsertAsync(
ITextEmbeddingGenerationService textEmbeddingGenerationService,
VectorStoreCollection<ulong, Hotel> collection)
{
// Upsert a record.
string descriptionText = "A place where everyone can be happy.";
ulong hotelId = 1;
// Generate the embedding.
ReadOnlyMemory<float> embedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);
// Create a record and upsert with the already generated embedding.
await collection.UpsertAsync(new Hotel
{
HotelId = hotelId,
HotelName = "Hotel Happy",
Description = descriptionText,
DescriptionEmbedding = embedding,
Tags = new[] { "luxury", "pool" }
});
}
Embeddings genereren voor zoeken met de semantische kernel ITextEmbeddingGenerationService
public async Task GenerateEmbeddingsAndSearchAsync(
ITextEmbeddingGenerationService textEmbeddingGenerationService,
VectorStoreCollection<ulong, Hotel> collection)
{
// Upsert a record.
string descriptionText = "Find me a hotel with happiness in mind.";
// Generate the embedding.
ReadOnlyMemory<float> searchEmbedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);
// Search using the already generated embedding.
IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult = collection.SearchAsync(searchEmbedding, top: 1);
List<VectorSearchResult<Hotel>> resultItems = await searchResult.ToListAsync();
// Print the first search result.
Console.WriteLine("Score for first result: " + resultItems.FirstOrDefault()?.Score);
Console.WriteLine("Hotel description for first result: " + resultItems.FirstOrDefault()?.Record.Description);
}
Aanbeveling
Raadpleeg het genereren van insluitingen in Semantische kernel voor meer informatie over het genereren van insluitingen.
Dimensies voor insluiten
Voor vectordatabases moet u doorgaans het aantal dimensies opgeven dat elke vector heeft bij het maken van de verzameling.
Verschillende insluitmodellen ondersteunen doorgaans het genereren van vectoren met verschillende dimensiegrootten. OpenAI text-embedding-ada-002 genereert bijvoorbeeld vectoren met 1536 dimensies. Bij sommige modellen kan een ontwikkelaar ook het gewenste aantal dimensies kiezen in de uitvoervector. Google text-embedding-004 produceert bijvoorbeeld standaard vectoren met 768 dimensies, maar stelt een ontwikkelaar in staat om een willekeurig aantal dimensies tussen 1 en 768 te kiezen.
Het is belangrijk om ervoor te zorgen dat de vectoren die door het insluitmodel worden gegenereerd, hetzelfde aantal dimensies hebben als de overeenkomende vector in de database.
Als u een verzameling maakt met behulp van de Semantische Kernel Vector Store-abstracties, moet u het aantal dimensies opgeven dat vereist is voor elke vectoreigenschap via aantekeningen of via de recorddefinitie. Hier volgen voorbeelden van het instellen van het aantal dimensies op 1536.
[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 1536);
Binnenkort beschikbaar
Binnenkort meer informatie.
Binnenkort beschikbaar
Binnenkort meer informatie.