Was sind Plug-Ins für die semantische Kernel-Textsuche?
Der semantische Kernel verwendet Plugins , um vorhandene APIs mit KI zu verbinden. Diese Plug-Ins verfügen über Funktionen, die verwendet werden können, um relevante Daten oder Beispiele für Eingabeaufforderungen hinzuzufügen oder die KI das automatische Ausführen von Aktionen zu ermöglichen.
Um die Textsuche in semantischen Kernel zu integrieren, müssen wir sie in ein Plug-In umwandeln. Sobald wir über ein Textsuche-Plug-In verfügen, können wir es verwenden, um relevante Informationen zu Eingabeaufforderungen hinzuzufügen oder nach Bedarf Informationen abzurufen. Das Erstellen eines Plug-Ins aus der Textsuche ist ein einfacher Prozess, der unten erläutert wird.
Tipp
Um die auf dieser Seite gezeigten Beispiele auszuführen, wechseln Sie zu GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.
Einfaches Such-Plug-In
Der semantische Kernel stellt eine Standardvorlagenimplementierung bereit, die Variablenersetzung und Funktionsaufrufe unterstützt.
Durch Einschließen eines Ausdrucks, z {{MyPlugin.Function $arg1}}
. B. in einer Eingabeaufforderungsvorlage, wird die angegebene Funktion MyPlugin.Function
mit dem angegebenen Argument arg1
aufgerufen (das wird aufgelöst von KernelArguments
).
Der Rückgabewert aus dem Funktionsaufruf wird in die Eingabeaufforderung eingefügt. Diese Technik kann verwendet werden, um relevante Informationen in eine Eingabeaufforderung einzufügen.
Das folgende Beispiel zeigt, wie Sie ein Plug-In SearchPlugin
erstellen, das aus einer Instanz von BingTextSearch
.
Die Verwendung CreateWithSearch
erstellt ein neues Plug-In mit einer einzelnen Search
Funktion, die die zugrunde liegende Textsuchimplementierung aufruft.
Der SearchPlugin
Wird hinzugefügt, der es während des Kernel
Eingabeaufforderungsrenderings zur Verfügung stellt.
Die Eingabeaufforderungsvorlage enthält einen Aufruf, mit {{SearchPlugin.Search $query}}
dem die SearchPlugin
Ergebnisse im Zusammenhang mit der aktuellen Abfrage abgerufen werden.
Die Ergebnisse werden dann in die gerenderte Eingabeaufforderung eingefügt, bevor sie an das KI-Modell gesendet wird.
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));
Such-Plug-In mit Zitaten
Im folgenden Beispiel wird das im vorherigen Abschnitt beschriebene Muster mit einigen wichtigen Änderungen wiederholt:
CreateWithGetTextSearchResults
dient zum Erstellen einerSearchPlugin
Methode, die dieGetTextSearchResults
Methode aus der zugrunde liegenden Textsuchimplementierung aufruft.- Die Eingabeaufforderungsvorlage verwendet Handlebars-Syntax. Dadurch kann die Vorlage die Suchergebnisse durchlaufen und den Namen, den Wert und den Link für jedes Ergebnis rendern.
- Die Eingabeaufforderung enthält eine Anweisung zum Einschließen von Zitaten, sodass das KI-Modell die Arbeit des Hinzufügens von Zitaten zur Antwort übernimmt.
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
));
Such-Plug-In mit einem Filter
Die bisher gezeigten Beispiele verwenden die top bewerteten Websuchergebnisse, um die Erdungsdaten bereitzustellen. Um mehr Zuverlässigkeit in den Daten bereitzustellen, kann die Websuche auf die Rückgabe von Ergebnissen einer angegebenen Website beschränkt werden.
Das folgende Beispiel baut auf dem vorherigen auf, um die Filterung der Suchergebnisse hinzuzufügen.
A TextSearchFilter
with an equality clause is used to specify that only results from the Microsoft Developer Blogs site (site == 'devblogs.microsoft.com'
) are to be included in the search results.
Das Beispiel verwendet KernelPluginFactory.CreateFromFunctions
zum Erstellen des SearchPlugin
.
Für das Plug-In wird eine benutzerdefinierte Beschreibung bereitgestellt.
Die ITextSearch.CreateGetTextSearchResults
Erweiterungsmethode wird verwendet, um den KernelFunction
Textsuchdienst aufzurufen.
Tipp
Der site
Filter ist Bing-spezifisch. Für google web search use 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
));
Tipp
Folgen Sie dem Link, um weitere Informationen zum Filtern der von Bing zurückgegebenen Antworten zu erhalten.
Benutzerdefiniertes Such-Plug-In
Im vorherigen Beispiel wurde ein statischer Websitefilter auf die Suchvorgänge angewendet. Was geschieht, wenn dieser Filter dynamisch sein soll?
Das nächste Beispiel zeigt, wie Sie weitere Anpassungen der SearchPlugin
Anpassung vornehmen können, damit der Filterwert dynamisch sein kann.
Im Beispiel wird KernelFunctionFromMethodOptions
Folgendes für folgendes SearchPlugin
angegeben:
FunctionName
: Die Suchfunktion wird benanntGetSiteResults
, da sie einen Websitefilter anwendet, wenn die Abfrage eine Domäne enthält.Description
: Die Beschreibung beschreibt, wie diese spezielle Suchfunktion funktioniert.Parameters
: Die Parameter enthalten einen zusätzlichen optionalen Parameter für diesite
Domäne, damit die Domäne angegeben werden kann.
Das Anpassen der Suchfunktion ist erforderlich, wenn Sie mehrere spezielle Suchfunktionen bereitstellen möchten. In Eingabeaufforderungen können Sie die Funktionsnamen verwenden, um die Vorlage besser lesbar zu machen. Wenn Sie Funktionsaufrufe verwenden, verwendet das Modell den Funktionsnamen und die Beschreibung, um die beste Suchfunktion auszuwählen, die aufgerufen werden soll.
Wenn dieses Beispiel ausgeführt wird, verwendet die Antwort techcommunity.microsoft.com als Quelle für relevante Daten.
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
));
In Kürze verfügbar
Mehr in Kürze verfügbar.
In Kürze verfügbar
Mehr in Kürze verfügbar.