Partilhar via


Por que utilizar a invocação de funções com a busca de texto do Kernel Semântico?

Nas amostras anteriores baseadas na geração aumentada por recuperação de informação (RAG), 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 pode 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 da pergunta do utilizador e utilize a chamada de função para recuperar as informações relevantes de que precisa.

Gorjeta

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

Gorjeta

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 usa a pesquisa web do Bing para criar um SearchPlugin. Este plugin será anunciado para o modelo de IA para uso com chamada de função automática, usando as FunctionChoiceBehavior configurações de execução no prompt. Ao executar este exemplo, verifique a saída do console para ver qual o modelo usado 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 por texto do Bing e citações

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ções com pesquisa de texto do Bing e filtragem

O exemplo final nesta seção mostra como usar um filtro com chamada de função. Para este exemplo, apenas os resultados da pesquisa do site Microsoft Developer Blogs serão incluídos. Uma instância de TextSearchFilter é criada e uma cláusula de igualdade é adicionada para corresponder ao site devblogs.microsoft.com. 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));

Brevemente

Mais em breve.

Brevemente

Mais em breve.

Próximos passos