Génération d’incorporations pour les connecteurs de magasin de vecteurs de noyau sémantique
Avertissement
La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion et des améliorations nécessitant des modifications cassants peuvent toujours se produire dans des circonstances limitées avant la mise en production.
Le noyau sémantique prend en charge la génération d’incorporations à l’aide de nombreux services IA populaires en dehors de la boîte de dialogue.
Ces services peuvent être construits directement ou ajoutés à un conteneur d’injection de dépendances et résolus à partir de là.
Construction d’un générateur d’incorporation
Vous pouvez construire directement des instances des services d’incorporation de texte fournis par le noyau sémantique.
Ils implémentent toutes l’interface ITextEmbeddingGenerationService
.
// Constructing an Azure Open AI embedding generation service directly.
ITextEmbeddingGenerationService azureOpenAITES = new AzureOpenAITextEmbeddingGenerationService(
"text-embedding-ada-002",
"https://{myservice}.openai.azure.com/",
"apikey");
// Constructing an Olama embedding generation service directly.
ITextEmbeddingGenerationService olamaTES = new OllamaTextEmbeddingGenerationService(
"mxbai-embed-large",
new Uri("http://localhost:11434"));
Vous pouvez également utiliser des helpers pour les inscrire auprès d’un conteneur d’injection de dépendances.
// Registering Google AI embedding generation service with a service collection.
var services = new ServiceCollection();
services.AddGoogleAIEmbeddingGeneration("text-embedding-004", "apiKey");
// Registering Mistral AI embedding generation service with the dependency injection container on
// the kernel builder.
var kernelBuilder = Kernel
.CreateBuilder()
.AddMistralTextEmbeddingGeneration("mistral-embed", "apiKey");
Génération d’incorporations
Pour utiliser le ITextEmbeddingGenerationService
fichier que vous avez créé, appelez simplement la GenerateEmbeddingAsync
méthode dessus.
Voici un exemple de génération d’incorporations lors du chargement d’enregistrements.
public async Task GenerateEmbeddingsAndUpsertAsync(
ITextEmbeddingGenerationService textEmbeddingGenerationService,
IVectorStoreRecordCollection<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" }
});
}
Voici un exemple de génération d’incorporations lors de la recherche.
public async Task GenerateEmbeddingsAndSearchAsync(
ITextEmbeddingGenerationService textEmbeddingGenerationService,
IVectorStoreRecordCollection<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.
List<VectorSearchResult<Hotel>> searchResult = await collection.VectorizedSearchAsync(searchEmbedding).ToListAsync();
// Print the first search result.
Console.WriteLine("Score for first result: " + searchResult.FirstOrDefault()?.Score);
Console.WriteLine("Hotel description for first result: " + searchResult.FirstOrDefault()?.Record.Description);
}
Incorporation des dimensions
Les bases de données vectorielles nécessitent généralement que vous spécifiiez le nombre de dimensions dont chaque vecteur a lors de la création de la collection.
Différents modèles d’incorporation prennent généralement en charge la génération de vecteurs avec différentes tailles de dimension. Par exemple, Open AI text-embedding-ada-002
génère des vecteurs avec 1536 dimensions. Certains modèles permettent également à un développeur de choisir le nombre de dimensions souhaitées dans le vecteur de sortie, par exemple Google text-embedding-004
produit des vecteurs avec une dimension 768 par défaut, mais permet à un développeur de choisir un nombre quelconque de dimensions comprises entre 1 et 768.
Il est important de s’assurer que les vecteurs générés par le modèle d’incorporation ont le même nombre de dimensions que le vecteur correspondant dans la base de données.
Si vous créez une collection à l’aide des abstractions du magasin de vecteurs du noyau sémantique, vous devez spécifier le nombre de dimensions requises pour chaque propriété vectorielle via des annotations ou via la définition d’enregistrement. Voici des exemples de définition du nombre de dimensions sur 1536.
[VectorStoreRecordVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 1536 }
Conseil
Pour plus d’informations sur la façon d’annoter votre modèle de données, reportez-vous à la définition de votre modèle de données.
Conseil
Pour plus d’informations sur la création d’une définition d’enregistrement, reportez-vous à la définition de votre schéma avec une définition d’enregistrement.
Bientôt disponible
Plus d’informations prochainement.
Bientôt disponible
Plus d’informations prochainement.