次の方法で共有


セマンティック カーネル テキスト検索で関数呼び出しを使用する理由

前の取得拡張生成 (RAG) ベースのサンプルでは、関連情報を取得する際にユーザーからの質問が検索クエリとして使用されています。 ユーザーの質問は長く、複数のトピックにまたがる場合や、特殊な結果を提供する複数の異なる検索実装が使用できる場合があります。 どちらのシナリオでも、AI モデルがユーザーの質問から検索クエリまたはクエリを抽出し、関数呼び出しを使用して必要な関連情報を取得できるようにすると便利です。

ヒント

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

ヒント

このセクションのサンプルでは、 IFunctionInvocationFilter フィルターを使用して、モデルが呼び出す関数と、それが送信するパラメーターをログに記録します。 SearchPluginを呼び出すときに、モデルが検索クエリとして使用するものを確認するのは興味深いことです。

IFunctionInvocationFilter フィルターの実装を次に示します。

private sealed class FunctionInvocationFilter(TextWriter output) : IFunctionInvocationFilter
{
    public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next)
    {
        if (context.Function.PluginName == "SearchPlugin")
        {
            output.WriteLine($"{context.Function.Name}:{JsonSerializer.Serialize(context.Arguments)}\n");
        }
        await next(context);
    }
}

次のサンプルでは、Bing Web 検索を使用して SearchPlugin を作成します。 このプラグインは、プロンプト実行設定の FunctionChoiceBehavior を使用して、自動関数呼び出しで使用するために AI モデルにアドバタイズされます。 このサンプルを実行する場合は、コンソール出力を調べて、モデルが検索クエリとして使用した内容を確認します。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
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>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();

// Create a search service with 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
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel?", arguments));

Bingテキスト検索と引用を使用した関数呼び出し

次のサンプルには、引用文献を含めるために必要な変更が含まれています。

  1. CreateWithGetTextSearchResultsを使用してSearchPluginを作成します。これには、元の情報ソースへのリンクが含まれます。
  2. 応答に引用文献を含めるようモデルに指示するようにプロンプトを変更します。
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
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>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();

// Create a search service with 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
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel? Include citations to the relevant information where it is referenced in the response.", arguments));

Bingテキスト検索とフィルター処理を使用した関数呼び出し

このセクションの最後のサンプルでは、関数呼び出しでフィルターを使用する方法を示します。 このサンプルでは、Microsoft Developer Blogs サイトからの検索結果のみが含まれます。 TextSearchFilterのインスタンスが作成され、devblogs.microsoft.com サイトに一致するように等値句が追加されます。 このフィルターは、モデルからの関数呼び出し要求に応答して関数が呼び出されたときに使用されます。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
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>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();

// Create a search service with 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 filter = new TextSearchFilter().Equality("site", "devblogs.microsoft.com");
var searchOptions = new TextSearchOptions() { Filter = filter };
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
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel? Include citations to the relevant information where it is referenced in the response.", arguments));

間もなく利用できます

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

間もなく利用できます

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

次のステップ