Condividi tramite


Perché usare la chiamata di funzione con La ricerca di testo del kernel semantico?

Negli esempi precedenti basati su Recupero-Generazione aumentata (RAG) l'utente richiesto è stato usato come query di ricerca durante il recupero di informazioni pertinenti. L'utente chiede potrebbe essere lungo e può estendersi su più argomenti o potrebbero essere disponibili più implementazioni di ricerca diverse che forniscono risultati specializzati. Per uno di questi scenari può essere utile consentire al modello di intelligenza artificiale di estrarre la query di ricerca o le query dall'utente chiedere e usare la chiamata di funzione per recuperare le informazioni pertinenti necessarie.

Suggerimento

Per eseguire gli esempi visualizzati in questa pagina, passare a GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.

Suggerimento

Gli esempi in questa sezione usano un IFunctionInvocationFilter filtro per registrare la funzione chiamata dal modello e i parametri inviati. È interessante vedere cosa usa il modello come query di ricerca quando si chiama .SearchPlugin

Ecco l'implementazione del 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);
    }
}

L'esempio seguente crea un SearchPlugin oggetto usando ricerca Web Bing. Questo plug-in verrà annunciato al modello di intelligenza artificiale per l'uso con chiamate di funzione automatiche, usando nelle FunctionChoiceBehavior impostazioni di esecuzione della richiesta. Quando si esegue questo esempio, controllare l'output della console per visualizzare il modello usato come query di ricerca.

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

Chiamata di funzioni con ricerca e citazioni di testo Bing

L'esempio seguente include le modifiche necessarie per includere le citazioni:

  1. Usare CreateWithGetTextSearchResults per creare , SearchPluginche includerà il collegamento all'origine originale delle informazioni.
  2. Modificare il prompt per indicare al modello di includere le citazioni nella risposta.
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));

Chiamata di funzioni con ricerca e filtro di testo Bing

L'esempio finale di questa sezione illustra come usare un filtro con chiamate di funzione. Per questo esempio verranno inclusi solo i risultati della ricerca del sito Microsoft Developer Blogs. Viene creata un'istanza di TextSearchFilter e viene aggiunta una clausola di uguaglianza per trovare una corrispondenza con il devblogs.microsoft.com sito. Il filtro Ths verrà usato quando la funzione viene richiamata in risposta a una richiesta di chiamata di funzione dal modello.

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

Presto disponibile

Altre informazioni saranno presto disponibili.

Presto disponibile

Altre informazioni saranno presto disponibili.

Passaggi successivi