Delen via


Waarom functie-aanroepen gebruiken met Semantische kerneltekst zoeken?

In de vorige rag-voorbeelden (Retrieval-Augmented Generation) is de vraag van de gebruiker gebruikt als de zoekquery bij het ophalen van relevante informatie. De vraag van de gebruiker kan lang zijn en kan meerdere onderwerpen omvatten of er zijn mogelijk meerdere verschillende zoek-implementaties beschikbaar die gespecialiseerde resultaten bieden. Voor een van deze scenario's kan het handig zijn om het AI-model toe te staan de zoekquery of query's van de gebruiker te extraheren en functieaanroepen te gebruiken om de relevante informatie op te halen die nodig is.

Tip

Als u de voorbeelden wilt uitvoeren die op deze pagina worden weergegeven, gaat u naar GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.

Tip

In de voorbeelden in deze sectie wordt een IFunctionInvocationFilter filter gebruikt om de functie te registreren die door het model wordt aangeroepen en welke parameters worden verzonden. Het is interessant om te zien wat het model gebruikt als een zoekquery bij het aanroepen van de SearchPlugin.

Dit is de IFunctionInvocationFilter filter-implementatie.

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

In het onderstaande voorbeeld wordt een bing-webzoekopdracht SearchPlugin gemaakt. Deze invoegtoepassing wordt geadverteerd naar het AI-model voor gebruik met automatische functie-aanroepen, met behulp van de FunctionChoiceBehavior instellingen voor de promptuitvoering. Wanneer u dit voorbeeld uitvoert, controleert u de console-uitvoer om te zien welk model wordt gebruikt als zoekquery.

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

Functie aanroepen met Bing-tekstzoekopdrachten en bronvermeldingen

Het onderstaande voorbeeld bevat de vereiste wijzigingen om bronvermeldingen op te nemen:

  1. Hiermee CreateWithGetTextSearchResults maakt u de SearchPluginkoppeling naar de oorspronkelijke bron van de informatie.
  2. Wijzig de prompt om het model opdracht te geven om bronvermeldingen in het antwoord op te nemen.
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));

Functie aanroepen met Zoeken en filteren in Bing-tekst

Het laatste voorbeeld in deze sectie laat zien hoe u een filter gebruikt met functie-aanroepen. Voor dit voorbeeld worden alleen zoekresultaten van de microsoft Developer Blogs-site opgenomen. Er wordt een exemplaar van TextSearchFilter gemaakt en er wordt een gelijkheidsclausule toegevoegd die overeenkomt met de devblogs.microsoft.com site. Hetths-filter wordt gebruikt wanneer de functie wordt aangeroepen als reactie op een aanvraag voor het aanroepen van een functie vanuit het model.

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

Binnenkort beschikbaar

Binnenkort meer beschikbaar.

Binnenkort beschikbaar

Binnenkort meer beschikbaar.

Volgende stappen