다음을 통해 공유


의미 체계 커널 텍스트 검색 플러그 인이란?

의미 체계 커널은 플러그 인을 사용하여 기존 API를 AI와 연결합니다. 이러한 플러그 인에는 관련 데이터 또는 예제를 프롬프트에 추가하거나 AI가 자동으로 작업을 수행하도록 허용하는 데 사용할 수 있는 함수가 있습니다.

텍스트 검색을 의미 체계 커널과 통합하려면 이를 플러그 인으로 전환해야 합니다. 텍스트 검색 플러그 인이 있으면 이를 사용하여 프롬프트에 관련 정보를 추가하거나 필요에 따라 정보를 검색할 수 있습니다. Text Search에서 플러그 인을 만드는 것은 간단한 프로세스이며 아래에서 설명합니다.

이 페이지에 표시된 샘플을 실행하려면 GettingStartedWithTextSearch/Step2_Search_For_RAG.cs 이동합니다.

기본 검색 플러그 인

의미 체계 커널은 변수 대체 및 함수 호출을 지원하는 기본 템플릿 구현을 제공합니다. 프롬프트 템플릿과 같은 {{MyPlugin.Function $arg1}} 식을 포함하면 지정된 함수(예 MyPlugin.Function : 제공된 인수 arg1 (확인 KernelArguments됨)를 사용하여 호출됩니다. 함수 호출의 반환 값이 프롬프트에 삽입됩니다. 이 기술을 사용하여 관련 정보를 프롬프트에 삽입할 수 있습니다.

아래 샘플에서는 인스턴스BingTextSearch에서 명명 SearchPlugin 된 플러그 인을 만드는 방법을 보여 줍니다. 사용 하 여 기본 텍스트 검색 구현을 호출 하는 단일 Search 함수를 사용 하 여 CreateWithSearch 새 플러그 인을 만듭니다. SearchPlugin 프롬프트 렌더링 중에 호출할 수 있도록 하는 값에 추가 Kernel 됩니다. 프롬프트 템플릿에는 현재 쿼리와 관련된 결과를 검색하기 위해 호출 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. 프롬프트 템플릿은 핸들바 구문을 사용합니다. 이렇게 하면 템플릿이 검색 결과를 반복하고 각 결과에 대한 이름, 값 및 링크를 렌더링할 수 있습니다.
  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
));

필터를 사용하여 플러그 인 검색

지금까지 표시된 샘플은 상위 순위 웹 검색 결과를 사용하여 접지 데이터를 제공합니다. 데이터에 더 많은 안정성을 제공하기 위해 웹 검색은 지정된 사이트의 결과만 반환하도록 제한할 수 있습니다.

아래 샘플은 검색 결과의 필터링을 추가하기 위해 이전 샘플을 기반으로 합니다. 같음 절이 있는 A TextSearchFilter 는 Microsoft 개발자 블로그 사이트(site == 'devblogs.microsoft.com')의 결과만 검색 결과에 포함되도록 지정하는 데 사용됩니다.

샘플에서는 .를 SearchPlugin만드는 데 사용합니다KernelPluginFactory.CreateFromFunctions. 플러그 인에 대한 사용자 지정 설명이 제공됩니다. ITextSearch.CreateGetTextSearchResults 확장 메서드는 텍스트 검색 서비스를 호출하는 메서드를 만드는 KernelFunction 데 사용됩니다.

필터는 site Bing 전용입니다. Google 웹 검색의 경우 .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 을 수행하는 방법을 보여줍니다. 샘플에서는 다음에 대해 다음을 지정하는 SearchPlugin데 사용합니다KernelFunctionFromMethodOptions.

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

서비스 예정

더 곧 출시될 예정입니다.

서비스 예정

더 곧 출시될 예정입니다.

다음 단계