Vad är plugin-program för semantisk kerneltextsökning?
Semantisk kernel använder plugin-program för att ansluta befintliga API:er till AI. Dessa plugin-program har funktioner som kan användas för att lägga till relevanta data eller exempel i prompter, eller för att tillåta ai:n att utföra åtgärder automatiskt.
För att integrera textsökning med semantisk kernel måste vi omvandla den till ett plugin-program. När vi har ett plugin-program för textsökning kan vi använda det för att lägga till relevant information i frågor eller för att hämta information efter behov. Att skapa ett plugin-program från Textsökning är en enkel process som vi kommer att förklara nedan.
Dricks
Om du vill köra exemplen som visas på den här sidan går du till GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.
Plugin-program för grundläggande sökning
Semantisk kernel tillhandahåller en standardmallimplementering som stöder variabel ersättning och funktionsanrop.
Genom att inkludera ett uttryck som {{MyPlugin.Function $arg1}}
i en promptmall anropas den angivna funktionen, MyPlugin.Function
d.v.s. med det angivna argumentet arg1
(som matchas från KernelArguments
).
Returvärdet från funktionsanropet infogas i prompten. Den här tekniken kan användas för att mata in relevant information i en prompt.
Exemplet nedan visar hur du skapar ett plugin-program med namnet SearchPlugin
från en instans av BingTextSearch
.
Genom att använda CreateWithSearch
skapas ett nytt plugin-program med en enda Search
funktion som anropar implementeringen av den underliggande textsökningen.
SearchPlugin
Läggs till i som gör den Kernel
tillgänglig för att anropas under promptrendering.
Promptmallen innehåller ett anrop som {{SearchPlugin.Search $query}}
anropar SearchPlugin
för att hämta resultat relaterade till den aktuella frågan.
Resultatet infogas sedan i den renderade prompten innan den skickas till AI-modellen.
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));
Sök plugin-program med citat
Exemplet nedan upprepar mönstret som beskrivs i föregående avsnitt med några viktiga ändringar:
CreateWithGetTextSearchResults
används för att skapa enSearchPlugin
som anroparGetTextSearchResults
metoden från den underliggande textsökningsimplementeringen.- Promptmallen använder syntaxen för styret. På så sätt kan mallen iterera över sökresultaten och återge namn, värde och länk för varje resultat.
- Uppmaningen innehåller en instruktion om att inkludera citat, så AI-modellen utför arbetet med att lägga till citat i svaret.
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
));
Sök plugin-program med ett filter
Exemplen som visas hittills använder de högst rankade webbsökningsresultaten för att tillhandahålla grunddata. För att ge mer tillförlitlighet i data kan webbsökningen begränsas till att endast returnera resultat från en angiven webbplats.
Exemplet nedan bygger på det föregående för att lägga till filtrering av sökresultaten.
En TextSearchFilter
med en likhetsklausul används för att ange att endast resultat från Webbplatsen Microsoft Developer Blogs (site == 'devblogs.microsoft.com'
) ska ingå i sökresultaten.
Exemplet använder KernelPluginFactory.CreateFromFunctions
för att skapa SearchPlugin
.
En anpassad beskrivning tillhandahålls för plugin-programmet.
Tilläggsmetoden ITextSearch.CreateGetTextSearchResults
används för att skapa som KernelFunction
anropar textsökningstjänsten.
Dricks
Filtret site
är specifikt för Bing. För Googles webbsökning använder du 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
));
Dricks
Följ länken för mer information om hur du filtrerar svaren som Bing returnerar.
Plugin-program för anpassad sökning
I föregående exempel tillämpades ett statiskt webbplatsfilter på sökåtgärderna. Vad händer om du behöver det här filtret för att vara dynamiskt?
Nästa exempel visar hur du kan utföra mer anpassning av SearchPlugin
så att filtervärdet kan vara dynamiskt.
Exemplet använder KernelFunctionFromMethodOptions
för att ange följande för SearchPlugin
:
FunctionName
: Sökfunktionen namngesGetSiteResults
eftersom den använder ett webbplatsfilter om frågan innehåller en domän.Description
: Beskrivningen beskriver hur den här specialiserade sökfunktionen fungerar.Parameters
: Parametrarna innehåller ytterligare en valfri parameter försite
så att domänen kan anges.
Du måste anpassa sökfunktionen om du vill tillhandahålla flera specialiserade sökfunktioner. I prompter kan du använda funktionsnamnen för att göra mallen mer läsbar. Om du använder funktionsanrop använder modellen funktionsnamnet och beskrivningen för att välja den bästa sökfunktionen som ska anropas.
När det här exemplet körs använder svaret techcommunity.microsoft.com som källa för relevanta data.
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
));
Kommer snart
Fler kommer snart.
Kommer snart
Fler kommer snart.