Freigeben über


Gründe für funktionsaufrufe mit semantischer Kerneltextsuche?

In den vorherigen Rag-Basierten Beispielen (Retrieval-Augmented Generation) wurde der Benutzer beim Abrufen relevanter Informationen als Suchabfrage verwendet. Die Frage des Benutzers könnte lang sein und kann mehrere Themen umfassen, oder es stehen mehrere verschiedene Suchimplementierungen zur Verfügung, die spezielle Ergebnisse liefern. Für eines dieser Szenarien kann es hilfreich sein, das KI-Modell zu ermöglichen, die Suchabfrage oder Abfragen des Benutzers zu extrahieren und Funktionsaufrufe zu verwenden, um die relevanten Informationen abzurufen, die er benötigt.

Tipp

Um die auf dieser Seite gezeigten Beispiele auszuführen, wechseln Sie zu GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.

Tipp

In den Beispielen in diesem Abschnitt wird ein IFunctionInvocationFilter Filter verwendet, um die Funktion zu protokollieren, die das Modell aufruft und welche Parameter gesendet werden. Es ist interessant zu sehen, was das Modell beim Aufrufen des SearchPluginModells als Suchabfrage verwendet.

Hier ist die IFunctionInvocationFilter Filterimplementierung.

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

Im folgenden Beispiel wird eine SearchPlugin Bing-Websuche erstellt. Dieses Plug-In wird dem KI-Modell für die Verwendung mit automatischen Funktionsaufrufen mit den Einstellungen für die FunctionChoiceBehavior Eingabeaufforderungsausführung angekündigt. Wenn Sie dieses Beispiel ausführen, überprüfen Sie die Konsolenausgabe, um zu sehen, welches Modell als Suchabfrage verwendet wurde.

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

Funktionsaufrufe mit Bing-Textsuche und Zitaten

Das folgende Beispiel enthält die erforderlichen Änderungen, um Zitate einzuschließen:

  1. Wird CreateWithGetTextSearchResults verwendet, um das SearchPluginElement zu erstellen, enthält dies den Link zur ursprünglichen Quelle der Informationen.
  2. Ändern Sie die Eingabeaufforderung, um das Modell anzuweisen, Zitate in die Antwort aufzunehmen.
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));

Funktionsaufrufe mit Bing-Textsuche und -Filterung

Das letzte Beispiel in diesem Abschnitt zeigt, wie Sie einen Filter mit Funktionsaufrufen verwenden. In diesem Beispiel werden nur Suchergebnisse aus der Microsoft Developer Blogs-Website einbezogen. Es wird eine Instanz TextSearchFilter erstellt, und es wird eine Gleichheitsklausel hinzugefügt, die mit der devblogs.microsoft.com Website übereinstimmt. Der Ths-Filter wird verwendet, wenn die Funktion als Reaktion auf eine Funktionsaufrufanforderung aus dem Modell aufgerufen wird.

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

In Kürze verfügbar

Mehr in Kürze verfügbar.

In Kürze verfügbar

Mehr in Kürze verfügbar.

Nächste Schritte