Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
Функция поиска текста семантического ядра является предварительной версией, и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах до выпуска.
Семантический ядро предоставляет возможности, позволяющие разработчикам интегрировать поиск при вызове крупной языковой модели (LLM). Это важно, так как LLM обучен на фиксированных наборах данных и может потребоваться доступ к дополнительным данным для точного реагирования на запрос пользователя.
Процесс предоставления дополнительного контекста при формулировании запроса к LLM называется генерацией, дополненной извлечением данных (RAG). RAG обычно предполагает извлечение дополнительных данных, релевантных текущему запросу пользователя, и дополнение этими данными запроса, отправляемого в LLM. LLM может использовать свои обучающие данные и дополнительный контекст, чтобы дать более точный ответ.
Простой пример того, когда это становится важным, когда запрос пользователя связан с актуальной информацией, не включенной в набор обучающих данных LLM. Выполнив соответствующий поиск текста и включив результаты с запросом пользователя, будут достигнуты более точные ответы.
Семантический ядро предоставляет набор возможностей поиска текста, которые позволяют разработчикам выполнять поиск с помощью веб-поиска или векторных баз данных и легко добавлять RAG в свои приложения.
Как поиск текста отличается от векторного поиска?
Semantic Kernel предоставляет API для выполнения извлечения данных на разных уровнях абстракции.
Поиск текста позволяет выполнять поиск на высоком уровне в стеке, где входные данные — это текст с поддержкой базовой фильтрации. Интерфейс поиска текста поддерживает различные типы выходных данных, включая поддержку простого возврата простой строки. Это позволяет поиску текста поддерживать множество реализаций, включая веб-поисковые системы и векторные хранилища. Основная цель текстового поиска — предоставить простой интерфейс, который можно использовать как плагин для функции завершения чата.
Совет
Для всех реализаций поиска текста вне поля см. раздел "Вне поля" поиска текста.
Векторный поиск находится на нижнем уровне в стеке, где входные данные являются вектором. Она также поддерживает базовую фильтрацию, а также выбор вектора из хранилища данных для сравнения входного вектора с. Она возвращает модель данных, содержащую данные из хранилища данных.
Если вы хотите сделать RAG с векторными хранилищами, рекомендуется совместно использовать поиск текста и векторный поиск. Это можно сделать, обернув коллекцию векторного хранилища, которая поддерживает векторный поиск, текстовым поиском, а затем предоставив этот текстовый поиск в виде плагина для завершения чата. Semantic Kernel обеспечивает возможность сделать это легко из коробки. Дополнительные сведения о том, как это сделать, см. в следующих советах.
Совет
Чтобы узнать, как предоставить доступ к векторному поиску для завершения чата, см. How to use Vector Stores with Semantic Kernel Text Search.
Совет
Дополнительные сведения о векторных хранилищах и векторном поиске см. в статье Что такое коннекторы векторных хранилищ Semantic Kernel?.
Реализация RAG с помощью поиска в интернете
В следующем примере кода можно выбрать вариант между использованием Bing или Google для выполнения операций поиска в Интернете.
Совет
Чтобы запустить примеры, показанные на этой странице, перейдите в раздел GettingStartedWithTextSearch/Step1_Web_Search.cs.
Создать экземпляр текстового поиска
Каждый пример создает экземпляр текстового поиска, а затем выполняет операцию поиска, чтобы получить результаты для предоставленного запроса. Результаты поиска содержат фрагмент текста из веб-страницы, описывающей его содержимое. Это обеспечивает только ограниченный контекст, т. е. подмножество содержимого веб-страницы и нет ссылки на источник информации. В последующих примерах показано, как устранить эти ограничения.
Совет
В следующем примере кода используются коннектор OpenAI для Semantic Kernel и веб-плагины; установите их с помощью следующих команд:
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Plugins.Web
Веб-поиск Bing
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;
// Create an ITextSearch instance using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");
var query = "What is the Semantic Kernel?";
// Search and return results
KernelSearchResults<string> searchResults = await textSearch.SearchAsync(query, new() { Top = 4 });
await foreach (string result in searchResults.Results)
{
Console.WriteLine(result);
}
Поиск в Интернете Google
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Google;
// Create an ITextSearch instance using Google search
var textSearch = new GoogleTextSearch(
searchEngineId: "<Your Google Search Engine Id>",
apiKey: "<Your Google API Key>");
var query = "What is the Semantic Kernel?";
// Search and return results
KernelSearchResults<string> searchResults = await textSearch.SearchAsync(query, new() { Top = 4 });
await foreach (string result in searchResults.Results)
{
Console.WriteLine(result);
}
Совет
Дополнительные сведения о том, какие типы результатов поиска могут быть получены, см. в документации по плагинам текстового поиска.
Использовать результаты текстового поиска, чтобы дополнить запрос
Следующие шаги — создать плагин на основе веб-поиска по тексту и вызвать этот плагин, чтобы добавить результаты поиска в промпт.
В приведенном ниже примере кода показано, как это сделать:
-
KernelСоздайте службу OpenAI, зарегистрированную. Это будет использоваться для вызова моделиgpt-4oс промптом. - Создайте экземпляр текстового поиска.
- Создайте плагин поиска из экземпляра текстового поиска.
- Создайте шаблон промпта, который будет вызывать плагин поиска с поисковым запросом и включать в промпт результаты поиска вместе с исходным запросом.
- Вызовите запрос и отобразите ответ.
Модель предоставит ответ, который находится в основе последних сведений, доступных в веб-поиске.
Веб-поиск Bing
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));
Поиск в Интернете Google
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Google;
// 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 an ITextSearch instance using Google search
var textSearch = new GoogleTextSearch(
searchEngineId: "<Your Google Search Engine Id>",
apiKey: "<Your Google API Key>");
// Build a text search plugin with Google 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));
Существует ряд проблем с приведенным выше примером:
- Ответ не содержит ссылок на веб-страницы, которые использовались в качестве обосновывающего контекста.
- Ответ будет включать данные с любого веб-сайта, было бы лучше ограничить это доверенными сайтами.
- Для формирования контекста, на который опирается модель, используется только фрагмент каждой веб-страницы; этот фрагмент может не содержать данных, необходимых для точного ответа.
См. страницу с описанием модулей поиска текста, где представлены решения этих проблем.
Далее мы рекомендуем ознакомиться с абстракциями поиска текста.
Скоро
В ближайшее время будет больше.
Скоро
В ближайшее время будет больше.