Udostępnij za pośrednictwem


Dlaczego warto używać funkcji wywołującej za pomocą wyszukiwania tekstu jądra semantycznego?

W poprzednich przykładach opartych na generacji rozszerzonej (RAG, Retrieval-Augmented Generation) użyto zapytania użytkownika jako zapytania wyszukiwania podczas pobierania odpowiednich informacji. Pytanie użytkownika może być długie i może obejmować wiele tematów lub może istnieć wiele różnych implementacji wyszukiwania, które zapewniają wyspecjalizowane wyniki. W przypadku jednego z tych scenariuszy może być przydatne umożliwienie modelowi sztucznej inteligencji wyodrębniania zapytania wyszukiwania lub zapytań od użytkownika i używania wywołania funkcji w celu pobrania odpowiednich potrzebnych informacji.

Napiwek

Aby uruchomić przykłady wyświetlane na tej stronie, przejdź do pozycji GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.

Napiwek

Przykłady w tej sekcji używają filtru IFunctionInvocationFilter do rejestrowania funkcji wywoływanej przez model i parametrów, które wysyła. Interesujące jest sprawdzenie, co model używa jako zapytania wyszukiwania podczas wywoływania elementu SearchPlugin.

Oto implementacja filtru IFunctionInvocationFilter .

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

W poniższym przykładzie przedstawiono sposób SearchPlugin tworzenia przy użyciu wyszukiwania w Internecie Bing. Ta wtyczka zostanie anonsowana do modelu sztucznej inteligencji do użycia z automatycznym wywołaniem funkcji przy użyciu FunctionChoiceBehavior w ustawieniach wykonywania monitu. Po uruchomieniu tego przykładu sprawdź dane wyjściowe konsoli, aby zobaczyć, jaki model jest używany jako zapytanie wyszukiwania.

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

Wywoływanie funkcji za pomocą wyszukiwania tekstu Bing i cytatów

Poniższy przykład zawiera wymagane zmiany w celu uwzględnienia cytatów:

  1. Użyj CreateWithGetTextSearchResults polecenia , aby utworzyć element SearchPlugin, będzie zawierać link do oryginalnego źródła informacji.
  2. Zmodyfikuj monit, aby poinstruować model, aby uwzględnił cytaty w odpowiedzi.
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));

Wywoływanie funkcji za pomocą wyszukiwania i filtrowania tekstu Bing

Ostatni przykład w tej sekcji pokazuje, jak używać filtru z wywoływaniem funkcji. W przypadku tego przykładu zostaną uwzględnione tylko wyniki wyszukiwania z witryny Blogi dla deweloperów firmy Microsoft. Zostanie utworzone wystąpienie TextSearchFilter klasy , a klauzula równości zostanie dodana, aby dopasować ją do devblogs.microsoft.com witryny. Filtr Ths będzie używany, gdy funkcja jest wywoływana w odpowiedzi na żądanie wywołujące funkcję z modelu.

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

Wkrótce

Wkrótce pojawi się więcej.

Wkrótce

Wkrótce pojawi się więcej.

Następne kroki