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 :
CreateWithGetTextSearchResults
est utilisé pour créer unSearchPlugin
qui appelle laGetTextSearchResults
méthode à partir de l’implémentation de recherche de texte sous-jacente.- 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.
- 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éeGetSiteResults
, 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 lesite
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.