什么是语义内核文本搜索?

警告

语义内核文本搜索功能为预览版,需要重大更改的改进可能在发布前的有限情况下发生。

语义内核提供的功能允许开发人员在调用大型语言模型(LLM)时集成搜索。 这一点很重要,因为 LLM 是在固定数据集上训练的,可能需要访问其他数据才能准确响应用户请求。

提示 LLM 时提供其他上下文的过程称为“检索扩充生成”(RAG)。 RAG 通常涉及检索与当前用户请求相关的其他数据,并使用此数据扩充发送到 LLM 的提示。 LLM 可以使用其训练和其他上下文来提供更准确的响应。

当用户的提问与 LLM 训练数据集中未包含的最新信息相关时,这一点变得非常重要的一个简单的示例。 通过执行适当的文本搜索并包括用户请求的结果,将实现更准确的响应。

语义内核提供了一组文本搜索功能,允许开发人员使用 Web 搜索或矢量数据库执行搜索,并轻松地将 RAG 添加到其应用程序。

在以下示例代码中,可以选择使用必应或 Google 执行 Web 搜索操作。

提示

若要运行此页上显示的示例,请转到 GettingStartedWithTextSearch/Step1_Web_Search.cs

创建文本搜索实例

每个示例创建一个文本搜索实例,然后执行搜索操作以获取提供的查询的结果。 搜索结果将包含网页中描述其内容的文本片段。 这仅提供有限的上下文,即网页内容的子集,并且没有指向信息源的链接。 后面的示例演示如何解决这些限制。

提示

以下示例代码使用语义内核 OpenAI 连接器和 Web 插件,使用以下命令进行安装:

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Plugins.Web

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

提示

有关可以检索的搜索结果类型的详细信息,请参阅 有关文本搜索插件的文档。

使用文本搜索结果增强提示

后续步骤是从 Web 文本搜索创建插件,并调用插件将搜索结果添加到提示。

下面的示例代码演示如何实现此目的:

  1. 创建已注册 OpenAI 服务的集合 Kernel 。 这将用于使用提示调用 gpt-4o 模型。
  2. 创建文本搜索实例。
  3. 从文本搜索实例创建搜索插件。
  4. 创建一个提示模板,该模板将使用查询调用搜索插件,并将搜索结果与原始查询一起包含在提示中。
  5. 调用提示并显示响应。

该模型将提供一个响应,该响应以 Web 搜索中提供的最新信息为基础。

必应 Web 搜索

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 Web 搜索

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

上述示例存在许多问题:

  1. 响应不包括用于提供地面上下文的网页的引文。
  2. 响应将包含来自任何网站的数据,最好将此内容限制为受信任的网站。
  3. 每个网页的代码片段仅用于提供模型的地面上下文,该代码段可能不包含提供准确响应所需的数据。

请参阅描述 文本搜索插件 的页面,了解这些问题的解决方案。

接下来,我们建议查看 文本搜索抽象

即将推出

即将推出更多内容。

即将推出

即将推出更多内容。

后续步骤

文本搜索抽象文本搜索插件文本搜索函数使用矢量存储调用文本搜索