次の方法で共有


セマンティック カーネル テキスト検索プラグインとは

セマンティック カーネルでは、 Plugins を使用して既存の API を AI に接続します。 これらのプラグインには、関連するデータや例をプロンプトに追加したり、AI が自動的にアクションを実行したりするために使用できる関数があります。

Text Search とセマンティック カーネルを統合するには、それをプラグインに変換する必要があります。 テキスト検索プラグインを作成したら、それを使用して、プロンプトに関連情報を追加したり、必要に応じて情報を取得したりできます。 テキスト検索からプラグインを作成するのは簡単なプロセスであり、以下で説明します。

ヒント

このページに示されているサンプルを実行するには、 GettingStartedWithTextSearch/Step2_Search_For_RAG.cs に移動します。

基本的な検索プラグイン

セマンティック カーネルには、変数の置換と関数呼び出しをサポートする既定のテンプレート実装が用意されています。 プロンプト テンプレートに{{MyPlugin.Function $arg1}}などの式を含めることで、指定された関数 (つまり、指定された引数arg1 (KernelArgumentsから解決される) を使用してMyPlugin.Functionが呼び出されます。 関数呼び出しからの戻り値がプロンプトに挿入されます。 この手法を使用すると、関連情報をプロンプトに挿入できます。

次のサンプルは、BingTextSearchのインスタンスから SearchPlugin という名前のプラグインを作成する方法を示しています。 CreateWithSearchを使用すると、基になるテキスト検索の実装を呼び出す単一のSearch関数を持つ新しいプラグインが作成されます。 SearchPluginKernelに追加され、プロンプトレンダリング中に呼び出せます。 プロンプト テンプレートには、現在のクエリに関連する結果を取得する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は、基になるテキスト検索の実装からGetTextSearchResults メソッドを呼び出すSearchPluginを作成するために使用されます。
  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 Developer Blogs サイト (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
));

カスタム検索プラグイン

前のサンプルでは、静的サイト フィルターが検索操作に適用されました。 このフィルターを動的にする必要がある場合はどうしますか?

次のサンプルでは、フィルター値を動的にできるように、 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
));

間もなく利用できます

詳細は近日公開予定です。

間もなく利用できます

詳細は近日公開予定です。

次のステップ