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 Kernel semântico 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 recuperar dados adicionais relevantes para a solicitação atual do usuário e enriquecer o 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 Kernel semântico 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.

Kernel semântico fornece APIs para executar a recuperação de dados em diferentes níveis de abstração.

A pesquisa de texto permite a pesquisa em um alto nível na pilha, em que a entrada é texto com suporte para filtragem básica. A interface de pesquisa de texto dá suporte a vários tipos de saída, incluindo suporte para apenas retornar uma cadeia de caracteres simples. Isso permite que a pesquisa de texto dê suporte a muitas implementações, incluindo mecanismos de pesquisa na Web e repositórios de vetores. O objetivo principal da pesquisa de texto é fornecer uma interface simples que pode ser exposta como um plug-in para a conclusão do chat.

Dica

Para todas as implementações de pesquisa de texto prontas para uso, consulte a Pesquisa de Texto Pronta para Uso.

A busca vetorial está em um nível mais baixo da pilha, onde a entrada é um vetor. Ele também dá suporte à filtragem básica, além de escolher um vetor no armazenamento de dados com o qual comparar o vetor de entrada. Ele retorna um modelo de dados que contém os dados do armazenamento de dados.

Quando você deseja fazer o RAG com repositórios de vetores, faz sentido usar a pesquisa de texto e a pesquisa de vetor em conjunto. A maneira de fazer isso é encapsulando uma coleção de repositórios de vetores, que dá suporte à pesquisa de vetor, com pesquisa de texto e, em seguida, expondo a pesquisa de texto como um plug-in para conclusão do chat. Kernel semântico fornece a capacidade de fazer isso facilmente fora da caixa. Confira as dicas a seguir para obter mais informações sobre como fazer isso.

Dica

Para ver como expor a pesquisa vetorial à complementação de chat, consulte Como usar repositórios vetoriais com a Pesquisa de Texto do Kernel semântico.

Dica

Para obter mais informações sobre repositórios de vetores e pesquisa de vetores, consulte O que são Kernel semântico conectores do Vector Store?.

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 enriquecer 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 modelo gpt-4o usando 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 trecho de cada página da Web está sendo usado para fornecer contexto de embasamento ao modelo, e o trecho 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 consultar Abstrações de Pesquisa de Texto.

Em breve

Mais em breve.

Em breve

Mais em breve.

Próximas etapas