Partager via


Qu’est-ce que les plug-ins de recherche de texte du noyau sémantique ?

Le noyau sémantique utilise des plug-ins pour connecter des API existantes avec l’IA. Ces plug-ins ont des fonctions qui peuvent être utilisées pour ajouter des données ou des exemples pertinents à des invites, ou pour permettre à l’IA d’effectuer automatiquement des actions.

Pour intégrer la recherche de texte au noyau sémantique, nous devons le transformer en plug-in. Une fois que nous avons un plug-in Recherche de texte, nous pouvons l’utiliser pour ajouter des informations pertinentes aux invites ou pour récupérer des informations selon les besoins. La création d’un plug-in à partir de la recherche de texte est un processus simple, que nous allons expliquer ci-dessous.

Conseil

Pour exécuter les exemples affichés sur cette page, accédez à GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.

Plug-in de recherche de base

Le noyau sémantique fournit une implémentation de modèle par défaut qui prend en charge la substitution de variable et l’appel de fonction. En incluant une expression telle que {{MyPlugin.Function $arg1}} dans un modèle d’invite, la fonction spécifiée, c’est-à-dire, MyPlugin.Function sera appelée avec l’argument arg1 fourni (qui est résolu à partir de KernelArguments). La valeur de retour de l’appel de fonction est insérée dans l’invite. Cette technique peut être utilisée pour injecter des informations pertinentes dans une invite.

L’exemple ci-dessous montre comment créer un plug-in nommé SearchPlugin à partir d’une instance de BingTextSearch. L’utilisation CreateWithSearch crée un plug-in avec une fonction unique Search qui appelle l’implémentation de recherche de texte sous-jacente. Il SearchPlugin est ajouté à celui Kernel qui le rend disponible lors du rendu d’invite. Le modèle d’invite inclut un appel auquel {{SearchPlugin.Search $query}} l’appel appelle les résultats pour récupérer les SearchPlugin résultats liés à la requête actuelle. Les résultats sont ensuite insérés dans l’invite rendue avant d’être envoyés au modèle IA.

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// Build a text search plugin with Bing search and add to the kernel
var searchPlugin = textSearch.CreateWithSearch("SearchPlugin");
kernel.Plugins.Add(searchPlugin);

// Invoke prompt and use text search plugin to provide grounding information
var query = "What is the Semantic Kernel?";
var prompt = "{{SearchPlugin.Search $query}}. {{$query}}";
KernelArguments arguments = new() { { "query", query } };
Console.WriteLine(await kernel.InvokePromptAsync(prompt, arguments));

Plug-in de recherche avec citations

L’exemple ci-dessous répète le modèle décrit dans la section précédente avec quelques modifications notables :

  1. CreateWithGetTextSearchResults est utilisé pour créer un SearchPlugin qui appelle la GetTextSearchResults méthode à partir de l’implémentation de recherche de texte sous-jacente.
  2. Le modèle d’invite utilise la syntaxe Handlebars. Cela permet au modèle d’itérer sur les résultats de la recherche et de restituer le nom, la valeur et le lien pour chaque résultat.
  3. L’invite inclut une instruction pour inclure des citations, de sorte que le modèle IA effectue le travail d’ajout de citations à la réponse.
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// Build a text search plugin with Bing search and add to the kernel
var searchPlugin = textSearch.CreateWithGetTextSearchResults("SearchPlugin");
kernel.Plugins.Add(searchPlugin);

// Invoke prompt and use text search plugin to provide grounding information
var query = "What is the Semantic Kernel?";
string promptTemplate = """
{{#with (SearchPlugin-GetTextSearchResults query)}}  
    {{#each this}}  
    Name: {{Name}}
    Value: {{Value}}
    Link: {{Link}}
    -----------------
    {{/each}}  
{{/with}}  

{{query}}

Include citations to the relevant information where it is referenced in the response.
""";
KernelArguments arguments = new() { { "query", query } };
HandlebarsPromptTemplateFactory promptTemplateFactory = new();
Console.WriteLine(await kernel.InvokePromptAsync(
    promptTemplate,
    arguments,
    templateFormat: HandlebarsPromptTemplateFactory.HandlebarsTemplateFormat,
    promptTemplateFactory: promptTemplateFactory
));

Plug-in de recherche avec un filtre

Les exemples présentés jusqu’à présent utilisent les résultats de recherche web les plus classés pour fournir les données de base. Pour fournir une plus grande fiabilité dans les données que la recherche web peut être limitée pour renvoyer uniquement les résultats d’un site spécifié.

L’exemple ci-dessous s’appuie sur le précédent pour ajouter le filtrage des résultats de la recherche. Une TextSearchFilter clause d’égalité est utilisée pour spécifier que seuls les résultats du site Blogs des développeurs Microsoft (site == 'devblogs.microsoft.com') doivent être inclus dans les résultats de la recherche.

L’exemple utilise KernelPluginFactory.CreateFromFunctions pour créer le SearchPlugin. Une description personnalisée est fournie pour le plug-in. La ITextSearch.CreateGetTextSearchResults méthode d’extension est utilisée pour créer le KernelFunction service de recherche de texte.

Conseil

Le site filtre est spécifique à Bing. Pour la recherche web Google, utilisez siteSearch.

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// Create a filter to search only the Microsoft Developer Blogs site
var filter = new TextSearchFilter().Equality("site", "devblogs.microsoft.com");
var searchOptions = new TextSearchOptions() { Filter = filter };

// Build a text search plugin with Bing search and add to the kernel
var searchPlugin = KernelPluginFactory.CreateFromFunctions(
    "SearchPlugin", "Search Microsoft Developer Blogs site only",
    [textSearch.CreateGetTextSearchResults(searchOptions: searchOptions)]);
kernel.Plugins.Add(searchPlugin);

// Invoke prompt and use text search plugin to provide grounding information
var query = "What is the Semantic Kernel?";
string promptTemplate = """
{{#with (SearchPlugin-GetTextSearchResults query)}}  
    {{#each this}}  
    Name: {{Name}}
    Value: {{Value}}
    Link: {{Link}}
    -----------------
    {{/each}}  
{{/with}}  

{{query}}

Include citations to the relevant information where it is referenced in the response.
""";
KernelArguments arguments = new() { { "query", query } };
HandlebarsPromptTemplateFactory promptTemplateFactory = new();
Console.WriteLine(await kernel.InvokePromptAsync(
    promptTemplate,
    arguments,
    templateFormat: HandlebarsPromptTemplateFactory.HandlebarsTemplateFormat,
    promptTemplateFactory: promptTemplateFactory
));

Conseil

Suivez le lien pour plus d’informations sur la façon de filtrer les réponses retournées par Bing.

Plug-in de recherche personnalisée

Dans l’exemple précédent, un filtre de site statique a été appliqué aux opérations de recherche. Que se passe-t-il si vous avez besoin de ce filtre pour être dynamique ?

L’exemple suivant montre comment effectuer davantage de personnalisation de la SearchPlugin valeur de filtre afin que la valeur de filtre puisse être dynamique. L’exemple utilise KernelFunctionFromMethodOptions pour spécifier les éléments suivants pour :SearchPlugin

  • FunctionName: la fonction de recherche est nommée GetSiteResults , car elle applique un filtre de site si la requête inclut un domaine.
  • Description: la description décrit le fonctionnement de cette fonction de recherche spécialisée.
  • Parameters: les paramètres incluent un paramètre facultatif supplémentaire pour le site domaine afin que le domaine puisse être spécifié.

La personnalisation de la fonction de recherche est requise si vous souhaitez fournir plusieurs fonctions de recherche spécialisées. Dans les invites, vous pouvez utiliser les noms de fonctions pour rendre le modèle plus lisible. Si vous utilisez l’appel de fonction, le modèle utilise le nom et la description de la fonction pour sélectionner la meilleure fonction de recherche à appeler.

Lorsque cet exemple est exécuté, la réponse utilise techcommunity.microsoft.com comme source de données pertinentes.

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// Build a text search plugin with Bing search and add to the kernel
var options = new KernelFunctionFromMethodOptions()
{
    FunctionName = "GetSiteResults",
    Description = "Perform a search for content related to the specified query and optionally from the specified domain.",
    Parameters =
    [
        new KernelParameterMetadata("query") { Description = "What to search for", IsRequired = true },
        new KernelParameterMetadata("top") { Description = "Number of results", IsRequired = false, DefaultValue = 5 },
        new KernelParameterMetadata("skip") { Description = "Number of results to skip", IsRequired = false, DefaultValue = 0 },
        new KernelParameterMetadata("site") { Description = "Only return results from this domain", IsRequired = false },
    ],
    ReturnParameter = new() { ParameterType = typeof(KernelSearchResults<string>) },
};
var searchPlugin = KernelPluginFactory.CreateFromFunctions("SearchPlugin", "Search specified site", [textSearch.CreateGetTextSearchResults(options)]);
kernel.Plugins.Add(searchPlugin);

// Invoke prompt and use text search plugin to provide grounding information
var query = "What is the Semantic Kernel?";
string promptTemplate = """
    {{#with (SearchPlugin-GetSiteResults query)}}  
        {{#each this}}  
        Name: {{Name}}
        Value: {{Value}}
        Link: {{Link}}
        -----------------
        {{/each}}  
    {{/with}}  

    {{query}}

    Only include results from techcommunity.microsoft.com. 
    Include citations to the relevant information where it is referenced in the response.
    """;
KernelArguments arguments = new() { { "query", query } };
HandlebarsPromptTemplateFactory promptTemplateFactory = new();
Console.WriteLine(await kernel.InvokePromptAsync(
    promptTemplate,
    arguments,
    templateFormat: HandlebarsPromptTemplateFactory.HandlebarsTemplateFormat,
    promptTemplateFactory: promptTemplateFactory
));

Bientôt disponible

Plus bientôt.

Bientôt disponible

Plus bientôt.

Étapes suivantes