什么是语义内核文本搜索插件?

语义内核使用 插件 将现有 API 与 AI 连接。 这些插件具有可用于向提示添加相关数据或示例的函数,或者允许 AI 自动执行操作。

若要将文本搜索与语义内核集成,需要将其转换为插件。 有了文本搜索插件后,就可以使用它将相关信息添加到提示或根据需要检索信息。 从文本搜索创建插件是一个简单的过程,下面我们将对此进行说明。

提示

若要运行本页上显示的示例,请转到 GettingStartedWithTextSearch/Step2_Search_For_RAG.cs

基本搜索插件

语义内核提供支持变量替换和函数调用的默认模板实现。 通过在提示模板中包含表达式(例如{{MyPlugin.Function $arg1}},在提示模板中),将使用提供的参数arg1(解析自KernelArguments变量)调用指定的函数MyPlugin.Function。 函数调用的返回值插入到提示中。 此方法可用于将相关信息注入到提示中。

下面的示例演示如何创建从实例命名 SearchPluginBingTextSearch插件。 使用 CreateWithSearch 创建一个新插件和一个 Search 调用基础文本搜索实现的函数。 将 SearchPlugin 添加到 Kernel 允许在提示呈现期间调用它。 提示模板包括调用调用以SearchPlugin检索与当前查询相关的结果的调用{{SearchPlugin.Search $query}}。 然后将结果插入到呈现的提示符中,然后再将其发送到 AI 模型。

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));

使用引文搜索插件

以下示例重复上一部分中所述的模式,并进行了一些值得注意的更改:

  1. CreateWithGetTextSearchResults 用于创建一个 SearchPlugin 从基础文本搜索实现调用 GetTextSearchResults 方法的方法。
  2. 提示模板使用 Handlebars 语法。 这样,模板就可以循环访问搜索结果,并呈现每个结果的名称、值和链接。
  3. 提示包含包含引文的说明,因此 AI 模型将执行向响应添加引文的工作。
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
));

使用筛选器搜索插件

到目前为止显示的示例将使用排名靠前的 Web 搜索结果来提供地面数据。 为了在数据中提供更高的可靠性,Web 搜索只能返回来自指定站点的结果。

以下示例基于上一个示例来添加搜索结果筛选。 TextSearchFilter使用相等子句指定只有来自Microsoft开发人员博客网站(site == 'devblogs.microsoft.com')的结果才会包含在搜索结果中。

示例用于 KernelPluginFactory.CreateFromFunctions 创建 SearchPlugin. 为插件提供了自定义说明。 扩展 ITextSearch.CreateGetTextSearchResults 方法用于创建 KernelFunction 调用文本搜索服务的函数。

提示

筛选器 site 特定于必应。 对于 Google Web 搜索,请使用 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
));

提示

按照链接了解有关如何 筛选必应返回的答案的详细信息。

自定义搜索插件

在前面的示例中,静态网站筛选器应用于搜索操作。 如果需要此筛选器是动态的,该怎么办?

下一个示例演示如何对筛选器值执行更多自定义 SearchPlugin ,以便筛选器值是动态的。 此示例用于 KernelFunctionFromMethodOptions 指定 SearchPlugin以下内容:

  • FunctionName:搜索函数命名 GetSiteResults ,因为它将在查询包含域时应用网站筛选器。
  • Description:说明描述此专用搜索函数的工作原理。
  • Parameters:参数包括一个附加的可选参数, site 以便可以指定域。

如果要提供多个专用搜索函数,则需要自定义搜索函数。 在提示中,可以使用函数名称使模板更具可读性。 如果使用函数调用,则模型将使用函数名称和说明选择要调用的最佳搜索函数。

执行此示例时,响应将使用 techcommunity.microsoft.com 作为相关数据的源。

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
));

即将推出

即将推出更多内容。

即将推出

即将推出更多内容。

后续步骤