什麼是語意核心文字搜尋外掛程式?
語意核心會使用 外掛程式 來連接現有的 API 與 AI。 這些外掛程式具有函式,可用來新增相關數據或範例來提示,或允許 AI 自動執行動作。
若要整合文字搜尋與語意核心,我們需要將其轉換成外掛程式。 一旦有了文字搜尋外掛程式,就可以使用它來新增相關信息來提示或視需要擷取資訊。 從文字搜尋建立外掛程式是一個簡單的程式,我們將在下面說明。
提示
若要執行此頁面中顯示的範例,請移至 GettingStartedWithTextSearch/Step2_Search_For_RAG.cs。
基本搜尋外掛程式
語意核心提供支援變數替代和函式呼叫的預設範本實作。
藉由在提示範本中包含之類的{{MyPlugin.Function $arg1}}
表達式,指定的函MyPlugin.Function
式即會使用提供的自變數來叫用 (從 解析KernelArguments
的自變數arg1
)。
函式調用的傳回值會插入提示中。 這項技術可用來將相關信息插入提示中。
下列範例示範如何從 實例建立名為 SearchPlugin
的 BingTextSearch
外掛程式。
使用 CreateWithSearch
會建立新的外掛程式與呼叫基礎文字搜尋實作的單 Search
一函式。
SearchPlugin
會新增至 Kernel
,使其可在提示轉譯期間呼叫。
提示範本包含呼叫 {{SearchPlugin.Search $query}}
,其會叫 SearchPlugin
用 以擷取與目前查詢相關的結果。
然後,結果會插入轉譯的提示字元中,再傳送至 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
條件為 Bing 特定。 針對 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
));
提示
請遵循連結以取得有關如何 篩選 Bing 傳回答案的詳細資訊。
自定義搜尋外掛程式
在先前的範例中,靜態網站篩選已套用至搜尋作業。 如果您需要此篩選器為動態,該怎麼辦?
下一個範例示範如何執行 更多 自定義 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
));
即將推出
更多即將推出。
即將推出
更多即將推出。