다음을 통해 공유


의미 체계 커널 텍스트 검색에서 함수 호출을 사용하는 이유는 무엇인가요?

이전 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 웹 검색을 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. SearchPlugin만드는 데 사용합니다CreateWithGetTextSearchResults. 여기에는 정보의 원래 원본에 대한 링크가 포함됩니다.
  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 개발자 블로그 사이트의 검색 결과만 포함됩니다. 인스턴스 TextSearchFilter 가 만들어지고 사이트와 일치하도록 같음 절이 devblogs.microsoft.com 추가됩니다. Ths 필터는 모델의 함수 호출 요청에 대한 응답으로 함수가 호출될 때 사용됩니다.

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));

서비스 예정

더 곧 출시될 예정입니다.

서비스 예정

더 곧 출시될 예정입니다.

다음 단계