Что такое подключаемые модули поиска текста семантического ядра?
Семантический ядро использует подключаемые модули для подключения существующих API с помощью искусственного интеллекта. Эти подключаемые модули имеют функции, которые можно использовать для добавления соответствующих данных или примеров для запроса, или разрешить ИИ выполнять действия автоматически.
Чтобы интегрировать поиск текста с семантическим ядром, необходимо превратить его в подключаемый модуль. После того как у нас есть подключаемый модуль поиска текста, мы можем использовать его для добавления соответствующих сведений в запросы или получения информации по мере необходимости. Создание подключаемого модуля из поиска текста — это простой процесс, который мы рассмотрим ниже.
Совет
Чтобы запустить примеры, показанные на этой странице, перейдите в раздел GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.
Базовый подключаемый модуль поиска
Семантический ядро предоставляет реализацию шаблона по умолчанию, которая поддерживает вызовы переменных и функций.
Включив выражение, например {{MyPlugin.Function $arg1}}
в шаблоне запроса, указанную функцию, т. е. MyPlugin.Function
будет вызвана предоставленным аргументом arg1
(который разрешается из KernelArguments
).
Возвращаемое значение из вызова функции вставляется в запрос. Этот метод можно использовать для внедрения соответствующих сведений в запрос.
В приведенном ниже примере показано, как создать подключаемый модуль с именем SearchPlugin
из экземпляра BingTextSearch
.
При использовании CreateWithSearch
создается новый подключаемый модуль с одной Search
функцией, которая вызывает базовую реализацию поиска текста.
Добавляется Kernel
в SearchPlugin
приложение, которое делает его доступным для вызова во время отрисовки запроса.
Шаблон запроса включает вызов, к {{SearchPlugin.Search $query}}
которому будет вызываться SearchPlugin
получение результатов, связанных с текущим запросом.
Затем результаты вставляются в отрисованный запрос перед отправкой в модель ИИ.
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
используется для созданияSearchPlugin
GetTextSearchResults
метода из базовой реализации поиска текста.- Шаблон запроса использует синтаксис Handlebars. Это позволяет шаблону выполнять итерацию результатов поиска и отображать имя, значение и ссылку для каждого результата.
- Запрос содержит инструкцию по включению ссылок, поэтому модель ИИ будет выполнять работу по добавлению ссылок в ответ.
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
));
Подключаемый модуль поиска с фильтром
Примеры, показанные до сих пор, будут использовать лучшие результаты поиска в Интернете для предоставления данных о заземления. Чтобы обеспечить более надежность в данных, поиск в Интернете может быть ограничен только возвращаемыми результатами из указанного сайта.
Приведенный ниже пример основан на предыдущем, чтобы добавить фильтрацию результатов поиска.
Предложение TextSearchFilter
равенства используется для указания того, что только результаты сайта блогов разработчиков Майкрософт (site == 'devblogs.microsoft.com'
) должны быть включены в результаты поиска.
Пример используется KernelPluginFactory.CreateFromFunctions
для создания SearchPlugin
.
Для подключаемого модуля предоставляется пользовательское описание.
ITextSearch.CreateGetTextSearchResults
Метод расширения используется для создания KernelFunction
вызываемой службы поиска текста.
Совет
Фильтр site
предназначен для Bing. Для использования поиска siteSearch
в Интернете Google.
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
, чтобы значение фильтра было динамическим.
Пример используется 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
));
Скоро
В ближайшее время будет больше.
Скоро
В ближайшее время будет больше.