Compartilhar via


O que é pesquisa de texto semântico do kernel?

Aviso

A funcionalidade de Pesquisa de Texto do Kernel Semântico é versão prévia e as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

O Semantic Kernel fornece recursos que permitem que os desenvolvedores integrem a pesquisa ao chamar um LLM (Large Language Model). Isso é importante porque os LLMs são treinados em conjuntos de dados fixos e podem precisar de acesso a dados adicionais para responder com precisão a uma solicitação do usuário.

O processo de fornecer contexto adicional ao solicitar um LLM é chamado de Geração Aumentada por Recuperação (RAG). O RAG normalmente envolve a recuperação de dados adicionais relevantes para a solicitação do usuário atual e o aumento do prompt enviado ao LLM com esses dados. O LLM pode usar seu treinamento mais o contexto adicional para fornecer uma resposta mais precisa.

Um exemplo simples de quando isso se torna importante é quando a solicitação do usuário está relacionada a informações atualizadas não incluídas no conjunto de dados de treinamento do LLM. Ao realizar uma pesquisa de texto apropriada e incluir os resultados com a pergunta do usuário, respostas mais precisas serão obtidas.

O Semantic Kernel fornece um conjunto de recursos de pesquisa de texto que permitem que os desenvolvedores realizem pesquisas usando pesquisa na Web ou bancos de dados vetoriais e adicionem facilmente RAG a seus aplicativos.

No código de exemplo a seguir, você pode escolher entre usar o Bing ou o Google para executar operações de pesquisa na Web.

Dica

Para executar os exemplos mostrados nesta página, acesse GettingStartedWithTextSearch/Step1_Web_Search.cs.

Criar instância de pesquisa de texto

Cada exemplo cria uma instância de pesquisa de texto e, em seguida, executa uma operação de pesquisa para obter resultados para a consulta fornecida. Os resultados da pesquisa conterão um trecho de texto da página da Web que descreve seu conteúdo. Isso fornece apenas um contexto limitado, ou seja, um subconjunto do conteúdo da página da web e nenhum link para a fonte da informação. Exemplos posteriores mostram como lidar com essas limitações.

Dica

O código de exemplo a seguir usa o conector OpenAI do Kernel Semântico e os plug-ins da Web, instale usando os seguintes comandos:

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

Dica

Para obter mais informações sobre quais tipos de resultados de pesquisa podem ser recuperados, consulte a documentação sobre Plug-ins de pesquisa de texto.

Usar resultados de pesquisa de texto para aumentar um prompt

As próximas etapas são criar um plug-in a partir da pesquisa de texto da web e invocar o plug-in para adicionar os resultados da pesquisa ao prompt.

O código de exemplo abaixo mostra como fazer isso:

  1. Crie um Kernel que tenha um serviço OpenAI registrado. Isso será usado para chamar o gpt-4o modelo com o prompt.
  2. Crie uma instância de pesquisa de texto.
  3. Crie um plug-in de pesquisa a partir da instância de pesquisa de texto.
  4. Crie um modelo de prompt que invocará o plug-in de pesquisa com a consulta e incluirá os resultados da pesquisa no prompt junto com a consulta original.
  5. Invoque o prompt e exiba a resposta.

O modelo fornecerá uma resposta baseada nas informações mais recentes disponíveis em uma pesquisa na Web.

Pesquisa na Web do 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));

Pesquisa na web do 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));

Há vários problemas com o exemplo acima:

  1. A resposta não inclui citações mostrando as páginas da web que foram usadas para fornecer contexto de base.
  2. A resposta incluirá dados de qualquer site, seria melhor limitar isso a sites confiáveis.
  3. Apenas um snippet de cada página da web está sendo usado para fornecer contexto de aterramento ao modelo, o snippet pode não conter os dados necessários para fornecer uma resposta precisa.

Consulte a página que descreve os plug-ins de pesquisa de texto para obter soluções para esses problemas.

Em seguida, recomendamos examinar as abstrações de pesquisa de texto.

Em breve

Mais em breve.

Em breve

Mais em breve.

Próximas etapas