共用方式為


什麼是語意核心文字搜尋外掛程式?

語意核心會使用 外掛程式 來連接現有的 API 與 AI。 這些外掛程式具有函式,可用來新增相關數據或範例來提示,或允許 AI 自動執行動作。

若要整合文字搜尋與語意核心,我們需要將其轉換成外掛程式。 一旦有了文字搜尋外掛程式,就可以使用它來新增相關信息來提示或視需要擷取資訊。 從文字搜尋建立外掛程式是一個簡單的程式,我們將在下面說明。

提示

若要執行此頁面中顯示的範例,請移至 GettingStartedWithTextSearch/Step2_Search_For_RAG.cs

基本搜尋外掛程式

語意核心提供支援變數替代和函式呼叫的預設範本實作。 藉由在提示範本中包含之類的{{MyPlugin.Function $arg1}}表達式,指定的函MyPlugin.Function式即會使用提供的自變數來叫用 (從 解析KernelArguments的自變數arg1)。 函式調用的傳回值會插入提示中。 這項技術可用來將相關信息插入提示中。

下列範例示範如何從 實例建立名為 SearchPluginBingTextSearch外掛程式。 使用 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));

使用引文搜尋外掛程式

下列範例會重複上一節所述的模式,但有一些值得注意的變更:

  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 條件為 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
));

即將推出

更多即將推出。

即將推出

更多即將推出。

下一步