의미 체계 커널은 플러그 인을 사용하여 기존 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));
인용을 사용하여 플러그 인 검색
아래 샘플에서는 이전 섹션에서 설명한 패턴을 몇 가지 주목할 만한 변경 내용과 함께 반복합니다.
CreateWithGetTextSearchResults는 기본 텍스트 검색 구현에서 메서드를GetTextSearchResults호출하는 메서드를 만드는SearchPlugin데 사용됩니다.- 프롬프트 템플릿은 핸들바 구문을 사용합니다. 이렇게 하면 템플릿이 검색 결과를 반복하고 각 결과에 대한 이름, 값 및 링크를 렌더링할 수 있습니다.
- 프롬프트에는 인용을 포함하는 명령이 포함되어 있으므로 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
));
서비스 예정
더 곧 출시될 예정입니다.
서비스 예정
더 곧 출시될 예정입니다.