什么是语义内核文本搜索插件?
语义内核使用 插件 将现有 API 与 AI 连接。 这些插件具有可用于向提示添加相关数据或示例的函数,或者允许 AI 自动执行操作。
若要将文本搜索与语义内核集成,需要将其转换为插件。 有了文本搜索插件后,就可以使用它将相关信息添加到提示或根据需要检索信息。 从文本搜索创建插件是一个简单的过程,下面我们将对此进行说明。
提示
若要运行本页上显示的示例,请转到 GettingStartedWithTextSearch/Step2_Search_For_RAG.cs。
基本搜索插件
语义内核提供支持变量替换和函数调用的默认模板实现。
通过在提示模板中包含表达式(例如{{MyPlugin.Function $arg1}}
,在提示模板中),将使用提供的参数arg1
(解析自KernelArguments
变量)调用指定的函数MyPlugin.Function
。
函数调用的返回值插入到提示中。 此方法可用于将相关信息注入到提示中。
下面的示例演示如何创建从实例命名 SearchPlugin
的 BingTextSearch
插件。
使用 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));
使用引文搜索插件
以下示例重复上一部分中所述的模式,并进行了一些值得注意的更改:
CreateWithGetTextSearchResults
用于创建一个SearchPlugin
从基础文本搜索实现调用GetTextSearchResults
方法的方法。- 提示模板使用 Handlebars 语法。 这样,模板就可以循环访问搜索结果,并呈现每个结果的名称、值和链接。
- 提示包含包含引文的说明,因此 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
));
即将推出
即将推出更多内容。
即将推出
即将推出更多内容。