Partager via


Ajout d’une génération augmentée de récupération (RAG) à des agents de noyau sémantique

Avertissement

La fonctionnalité RAG de l’agent de noyau sémantique est expérimentale, susceptible de changer et ne sera finalisée qu’en fonction des commentaires et de l’évaluation.

Utilisation de TextSearchProvider pour RAG

Les Microsoft.SemanticKernel.Data.TextSearchProvider agents peuvent récupérer des documents pertinents en fonction des entrées utilisateur et les injecter dans le contexte de l’agent pour obtenir des réponses plus éclairées. Il intègre une Microsoft.SemanticKernel.Data.ITextSearch instance à des agents de noyau sémantique. Plusieurs ITextSearch implémentations existent, prenant en charge les recherches de similarité sur les magasins vectoriels et l’intégration du moteur de recherche. Des informations supplémentaires sont disponibles ici.

Nous fournissons également un Microsoft.SemanticKernel.Data.TextSearchStore, qui offre un stockage vectoriel simple et spécialisé des données textuelles à des fins de génération augmentée par récupération. TextSearchStore dispose d’un schéma intégré pour stocker et récupérer des données textuelles dans un magasin vectoriel. Si vous souhaitez utiliser votre propre schéma pour le stockage, consultez VectorStoreTextSearch.

Configuration de TextSearchProvider

Il TextSearchProvider peut être utilisé avec un VectorStore et TextSearchStore pour stocker et rechercher des documents texte.

L’exemple suivant montre comment configurer et utiliser TextSearchProvider avec TextSearchStore et InMemoryVectorStore pour qu’un agent effectue un simple RAG sur du texte.

// Create an embedding generator using Azure OpenAI.
var embeddingGenerator = new AzureOpenAIClient(new Uri("<Your_Azure_OpenAI_Endpoint>"), new AzureCliCredential())
    .GetEmbeddingClient("<Your_Deployment_Name>")
    .AsIEmbeddingGenerator(1536);

// Create a vector store to store documents.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });

// Create a TextSearchStore for storing and searching text documents.
using var textSearchStore = new TextSearchStore<string>(vectorStore, collectionName: "FinancialData", vectorDimensions: 1536);

// Upsert documents into the store.
await textSearchStore.UpsertTextAsync(new[]
{
    "The financial results of Contoso Corp for 2024 is as follows:\nIncome EUR 154 000 000\nExpenses EUR 142 000 000",
    "The Contoso Corporation is a multinational business with its headquarters in Paris."
});

// Create an agent.
Kernel kernel = new Kernel();
ChatCompletionAgent agent = new()
{
    Name = "FriendlyAssistant",
    Instructions = "You are a friendly assistant",
    Kernel = kernel,
    // This setting must be set to true when using the on-demand RAG feature
    UseImmutableKernel = true
};

// Create an agent thread and add the TextSearchProvider.
ChatHistoryAgentThread agentThread = new();
var textSearchProvider = new TextSearchProvider(textSearchStore);
agentThread.AIContextProviders.Add(textSearchProvider);

// Use the agent with RAG capabilities.
ChatMessageContent response = await agent.InvokeAsync("Where is Contoso based?", agentThread).FirstAsync();
Console.WriteLine(response.Content);

Fonctionnalités avancées : citations et filtrage

Les fonctionnalités avancées de TextSearchStore prennent en charge des options telles que le filtrage des résultats par espace de noms et l’inclusion de citations dans les réponses.

Inclusion de citations

Les documents du fichier TextSearchStore peuvent inclure des métadonnées telles que des noms de source et des liens, ce qui permet la génération de citations dans les réponses de l’agent.

await textSearchStore.UpsertDocumentsAsync(new[]
{
    new TextSearchDocument
    {
        Text = "The financial results of Contoso Corp for 2023 is as follows:\nIncome EUR 174 000 000\nExpenses EUR 152 000 000",
        SourceName = "Contoso 2023 Financial Report",
        SourceLink = "https://www.contoso.com/reports/2023.pdf",
        Namespaces = ["group/g2"]
    }
});

Lorsque le TextSearchProvider récupère ce document, il inclut par défaut le nom de la source et le lien dans sa réponse.

Filtrage par espace de noms

Lors de la mise à jour de documents, vous pouvez éventuellement fournir un ou plusieurs espaces de noms pour chaque document. Les espaces de noms peuvent être n’importe quelle chaîne qui définit l’étendue d’un document. Vous pouvez ensuite configurer le paramètre pour limiter les TextSearchStore résultats de recherche aux seuls enregistrements correspondant à l’espace de noms demandé.

using var textSearchStore = new TextSearchStore<string>(
    vectorStore,
    collectionName: "FinancialData",
    vectorDimensions: 1536,
    new() { SearchNamespace = "group/g2" }
);

RAG automatique ou à la demande

Les TextSearchProvider peuvent effectuer des recherches automatiquement lors de chaque invocation d’agent ou permettre des recherches à la demande par des appels d’outils lorsque l’agent a besoin d’informations supplémentaires.

Le paramètre par défaut est BeforeAIInvoke, ce qui signifie que les recherches seront effectuées avant chaque appel d’agent à l’aide du message transmis à l’agent. Cela peut être modifié en OnDemandFunctionCalling, ce qui permettra à l’Agent d’effectuer un appel d’outil pour mener des recherches en utilisant une chaîne de recherche de son choix.

var options = new TextSearchProviderOptions
{
    SearchTime = TextSearchProviderOptions.RagBehavior.OnDemandFunctionCalling,
};

var provider = new TextSearchProvider(mockTextSearch.Object, options: options);

Avertissement

Lorsque vous utilisez l’option TextSearchProvider avec OnDemandFunctionCalling, le UseImmutableKernel paramètre sur l’agent doit être défini comme true la fonctionnalité nécessite le clonage du noyau lors de l’appel de l’agent. Notez que la configuration de UseImmutableKernel à true signifie que toutes les modifications apportées aux données du noyau effectuées au cours de l’invocation de l’agent, par exemple, les plug-ins, ne seront pas conservées une fois l’appel achevé.

Options de TextSearchProvider

TextSearchProvider peut être configuré avec différentes options pour personnaliser son comportement. Les options sont fournies à l’aide de la classe TextSearchProviderOptions du constructeur TextSearchProvider.

Haut

Spécifie le nombre maximal de résultats à retourner à partir de la recherche de similarité.

  • Valeur par défaut : 3

TempsDeRecherche

Contrôles lorsque la recherche de texte est effectuée. Les options sont les suivantes :

  • BeforeAIInvoke : une recherche est effectuée chaque fois que le modèle/l’agent est appelé, juste avant l’appel et que les résultats sont fournis au modèle/agent via le contexte d’appel.
  • OnDemandFunctionCalling : une recherche peut être effectuée par le modèle/agent à la demande via l’appel d’une fonction.

PluginFunctionName

Spécifie le nom de la méthode de plug-in qui sera rendue disponible pour la recherche si SearchTime est défini sur OnDemandFunctionCalling.

  • Valeur par défaut : « Rechercher »

PluginFunctionDescription

Fournit une description de la méthode de plug-in qui sera rendue disponible pour la recherche si SearchTime est définie sur OnDemandFunctionCalling.

  • Valeur par défaut : « Permet de rechercher des informations supplémentaires pour répondre à la question de l’utilisateur ».

ContextPrompt

Lorsque vous fournissez les blocs de texte au modèle IA lors de l’appel, une invite est nécessaire pour indiquer au modèle IA ce que sont les blocs de texte et la façon dont ils doivent être utilisés. Ce paramètre permet de remplacer la messagerie par défaut intégrée au TextSearchProvider.

IncludeCitationsPrompt

Lorsque vous fournissez les blocs de texte au modèle IA lors de l’appel, une invite est nécessaire pour indiquer au modèle IA si et comment effectuer des citations. Ce paramètre permet de remplacer la messagerie par défaut intégrée au TextSearchProvider.

ContextFormatter

Ce rappel facultatif peut être utilisé pour personnaliser complètement le texte généré par le TextSearchProvider. Par défaut, le TextSearchProvider produira du texte qui inclut

  1. Une invite indiquant au modèle IA à quoi servent les blocs de texte.
  2. Liste de blocs de texte avec des liens sources et des noms.
  3. Invite demandant au modèle IA d’inclure des citations.

Vous pouvez produire votre propre résultat en implémentant et en fournissant cette fonction de rappel.

Remarque : Si ce délégué est fourni, les paramètres ContextPrompt et IncludeCitationsPrompt ne seront pas utilisés.

Combinaison de RAG avec d’autres fournisseurs

Le TextSearchProvider peut être combiné avec d'autres fournisseurs, tels que mem0 ou WhiteboardProvider, pour créer des agents avec des fonctionnalités de mémoire et de récupération d'informations.

// Add both mem0 and TextSearchProvider to the agent thread.
agentThread.AIContextProviders.Add(mem0Provider);
agentThread.AIContextProviders.Add(textSearchProvider);

// Use the agent with combined capabilities.
ChatMessageContent response = await agent.InvokeAsync("What was Contoso's income for 2023?", agentThread).FirstAsync();
Console.WriteLine(response.Content);

En combinant ces fonctionnalités, les agents peuvent offrir une expérience plus personnalisée et plus contextuelle.

Étapes suivantes

Prochainement

Plus d’informations seront bientôt disponibles.

Prochainement

Plus d’informations seront bientôt disponibles.