Compartilhar via


Por que usar a chamada de função com a Pesquisa de Texto do Kernel Semântico?

Nos exemplos anteriores baseados em RG (Geração Aumentada por Recuperação), a pergunta do usuário foi usada como consulta de pesquisa ao recuperar informações relevantes. A pergunta do usuário pode ser longa e abranger vários tópicos ou pode haver várias implementações de pesquisa diferentes disponíveis que fornecem resultados especializados. Para qualquer um desses cenários, pode ser útil permitir que o modelo de IA extraia a consulta ou consultas de pesquisa do usuário ask e use a chamada de função para recuperar as informações relevantes necessárias.

Dica

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

Dica

Os exemplos nesta seção usam um IFunctionInvocationFilter filtro para registrar a função que o modelo chama e quais parâmetros ele envia. É interessante ver o que o modelo usa como uma consulta de pesquisa ao chamar o SearchPlugin.

Aqui está a implementação do IFunctionInvocationFilter filtro.

private sealed class FunctionInvocationFilter(TextWriter output) : IFunctionInvocationFilter
{
    public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next)
    {
        if (context.Function.PluginName == "SearchPlugin")
        {
            output.WriteLine($"{context.Function.Name}:{JsonSerializer.Serialize(context.Arguments)}\n");
        }
        await next(context);
    }
}

O exemplo abaixo cria uma pesquisa na Web usando o SearchPlugin Bing. Este plug-in será anunciado ao modelo de IA para uso com chamada automática de função, usando o FunctionChoiceBehavior nas configurações de execução de prompt. Ao executar este exemplo, verifique a saída do console para ver o que o modelo usou como consulta de pesquisa.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
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>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();

// Create a search service with 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
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel?", arguments));

Chamada de função com pesquisa de texto e citações do Bing

O exemplo abaixo inclui as alterações necessárias para incluir citações:

  1. Use CreateWithGetTextSearchResults para criar o SearchPlugin, isso incluirá o link para a fonte original da informação.
  2. Modifique o prompt para instruir o modelo a incluir citações em sua resposta.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
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>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();

// Create a search service with 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
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel? Include citations to the relevant information where it is referenced in the response.", arguments));

Chamada de função com pesquisa e filtragem de texto do Bing

O exemplo final nesta seção mostra como usar um filtro com chamada de função. Para este exemplo, somente os resultados da pesquisa do site Microsoft Developer Blogs serão incluídos. Uma instância de é criada e uma cláusula de TextSearchFilter igualdade é adicionada para corresponder ao devblogs.microsoft.com site. Esse filtro será usado quando a função for invocada em resposta a uma solicitação de chamada de função do modelo.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
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>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();

// Create a search service with 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 filter = new TextSearchFilter().Equality("site", "devblogs.microsoft.com");
var searchOptions = new TextSearchOptions() { Filter = filter };
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
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel? Include citations to the relevant information where it is referenced in the response.", arguments));

Em breve

Mais em breve.

Em breve

Mais em breve.

Próximas etapas