Bagikan melalui


Mengapa menggunakan panggilan fungsi dengan Semantic Kernel Text Search?

Dalam sampel berbasis Retrieval-Augmented Generation (RAG) sebelumnya yang diminta pengguna telah digunakan sebagai kueri pencarian saat mengambil informasi yang relevan. Permintaan pengguna bisa panjang dan mungkin mencakup beberapa topik atau mungkin ada beberapa implementasi pencarian berbeda yang tersedia yang memberikan hasil khusus. Untuk salah satu skenario ini, dapat berguna untuk memungkinkan model AI mengekstrak kueri pencarian atau kueri dari pengguna meminta dan menggunakan panggilan fungsi untuk mengambil informasi relevan yang dibutuhkannya.

Tip

Untuk menjalankan sampel yang diperlihatkan di halaman ini, buka GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.

Tip

Sampel di bagian ini menggunakan IFunctionInvocationFilter filter untuk mencatat fungsi yang dipanggil model dan parameter apa yang dikirimnya. Menarik untuk melihat apa yang digunakan model sebagai kueri pencarian saat memanggil SearchPlugin.

Berikut adalah IFunctionInvocationFilter implementasi filter.

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

Sampel di bawah ini membuat SearchPlugin pencarian web Bing menggunakan. Plugin ini akan diiklankan ke model AI untuk digunakan dengan panggilan fungsi otomatis, menggunakan FunctionChoiceBehavior dalam pengaturan eksekusi prompt. Saat Anda menjalankan sampel ini, periksa output konsol untuk melihat apa model yang digunakan sebagai kueri pencarian.

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

Pemanggilan fungsi dengan pencarian teks Bing dan kutipan

Sampel di bawah ini mencakup perubahan yang diperlukan untuk menyertakan kutipan:

  1. Gunakan CreateWithGetTextSearchResults untuk membuat SearchPlugin, ini akan menyertakan tautan ke sumber asli informasi.
  2. Ubah perintah untuk menginstruksikan model untuk menyertakan kutipan dalam responsnya.
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));

Pemanggilan fungsi dengan pencarian dan pemfilteran teks Bing

Sampel akhir di bagian ini menunjukkan cara menggunakan filter dengan panggilan fungsi. Untuk sampel ini, hanya hasil pencarian dari situs Blog Pengembang Microsoft yang akan disertakan. Instans TextSearchFilter dibuat dan klausa kesetaraan ditambahkan agar sesuai dengan devblogs.microsoft.com situs. Filter Ths akan digunakan ketika fungsi dipanggil sebagai respons terhadap permintaan panggilan fungsi dari 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));

Segera hadir

Lebih segera datang.

Segera hadir

Lebih segera datang.

Langkah berikutnya