Bagikan melalui


Panduan Migrasi Panggilan Fungsi

Semantic Kernel secara bertahap beralih dari kemampuan panggilan fungsi saat ini, yang diwakili oleh ToolCallBehavior kelas, ke kemampuan baru yang ditingkatkan, yang diwakili oleh FunctionChoiceBehavior kelas . Kemampuan baru adalah agnostik layanan dan tidak terkait dengan layanan AI tertentu, tidak seperti model saat ini. Oleh karena itu, ia berada di abstraksi Kernel Semantik dan akan digunakan oleh semua konektor AI yang bekerja dengan model AI berkemampuan pemanggilan fungsi.

Panduan ini dimaksudkan untuk membantu Anda memigrasikan kode Anda ke kemampuan panggilan fungsi baru.

Memigrasikan perilaku ToolCallBehavior.AutoInvokeKernelFunctions

Perilaku ToolCallBehavior.AutoInvokeKernelFunctions ini setara dengan FunctionChoiceBehavior.Auto perilaku dalam model baru.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };

Memigrasikan perilaku ToolCallBehavior.EnableKernelFunctions

Perilaku ToolCallBehavior.EnableKernelFunctions ini setara dengan FunctionChoiceBehavior.Auto perilaku dengan pemanggilan otomatis yang dinonaktifkan.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

Memigrasikan perilaku ToolCallBehavior.EnableFunctions

Perilaku ToolCallBehavior.EnableFunctions ini setara dengan perilaku yang dikonfigurasi FunctionChoiceBehavior.Auto dengan daftar fungsi dengan pemanggilan otomatis yang dinonaktifkan.

var function = kernel.CreateFunctionFromMethod(() => DayOfWeek.Friday, "GetDayOfWeek", "Returns the current day of the week.");

// Before
var executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableFunctions(functions: [function.Metadata.ToOpenAIFunction()]) };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions: [function], autoInvoke: false) };

Memigrasikan perilaku ToolCallBehavior.RequireFunction

Perilaku ToolCallBehavior.RequireFunction ini setara dengan perilaku yang dikonfigurasi FunctionChoiceBehavior.Required dengan daftar fungsi dengan pemanggilan otomatis yang dinonaktifkan.

var function = kernel.CreateFunctionFromMethod(() => DayOfWeek.Friday, "GetDayOfWeek", "Returns the current day of the week.");

// Before
var executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.RequireFunction(functions: [function.Metadata.ToOpenAIFunction()]) };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Required(functions: [function], autoInvoke: false) };

Ganti penggunaan kelas panggilan fungsi khusus konektor

Fungsionalitas panggilan fungsi di Kernel Semantik memungkinkan pengembang mengakses daftar fungsi yang dipilih oleh model AI dengan dua cara:

  • Menggunakan kelas panggilan fungsi khusus konektor seperti ChatToolCall atau ChatCompletionsFunctionToolCall, tersedia melalui ToolCalls properti item khusus OpenAIChatMessageContent OpenAI dalam riwayat obrolan.
  • Menggunakan kelas panggilan fungsi konektor-agnostik seperti FunctionCallContent, tersedia melalui Items properti item konektor-agnostik ChatMessageContent dalam riwayat obrolan.

Kedua cara ini didukung saat ini oleh model saat ini dan baru. Namun, kami sangat menyarankan untuk menggunakan pendekatan agnostik konektor untuk mengakses panggilan fungsi, karena lebih fleksibel dan memungkinkan kode Anda untuk bekerja dengan konektor AI apa pun yang mendukung model pemanggilan fungsi baru. Selain itu, mengingat bahwa model saat ini akan segera tidak digunakan lagi, sekarang saat yang tepat untuk memigrasikan kode Anda ke model baru untuk menghindari perubahan yang melanggar di masa depan.

Jadi, jika Anda menggunakan Pemanggilan Fungsi Manual dengan kelas panggilan fungsi khusus konektor seperti dalam cuplikan kode ini:

using System.Text.Json;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using OpenAI.Chat;

var chatHistory = new ChatHistory();

var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

var result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

// Current way of accessing function calls using connector specific classes.
var toolCalls = ((OpenAIChatMessageContent)result).ToolCalls.OfType<ChatToolCall>().ToList();

while (toolCalls.Count > 0)
{
    // Adding function call from AI model to chat history
    chatHistory.Add(result);

    // Iterating over the requested function calls and invoking them
    foreach (var toolCall in toolCalls)
    {
        string content = kernel.Plugins.TryGetFunctionAndArguments(toolCall, out KernelFunction? function, out KernelArguments? arguments) ?
            JsonSerializer.Serialize((await function.InvokeAsync(kernel, arguments)).GetValue<object>()) :
            "Unable to find function. Please try again!";

        // Adding the result of the function call to the chat history
        chatHistory.Add(new ChatMessageContent(
            AuthorRole.Tool,
            content,
            metadata: new Dictionary<string, object?>(1) { { OpenAIChatMessageContent.ToolIdProperty, toolCall.Id } }));
    }

    // Sending the functions invocation results back to the AI model to get the final response
    result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
    toolCalls = ((OpenAIChatMessageContent)result).ToolCalls.OfType<ChatToolCall>().ToList();
}

Anda dapat merefaktornya untuk menggunakan kelas agnostik konektor:

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

var chatHistory = new ChatHistory();

var settings = new PromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

var messageContent = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

// New way of accessing function calls using connector agnostic function calling model classes.
var functionCalls = FunctionCallContent.GetFunctionCalls(messageContent).ToArray();

while (functionCalls.Length != 0)
{
    // Adding function call from AI model to chat history
    chatHistory.Add(messageContent);

    // Iterating over the requested function calls and invoking them
    foreach (var functionCall in functionCalls)
    {
        var result = await functionCall.InvokeAsync(kernel);

        chatHistory.Add(result.ToChatMessage());
    }

    // Sending the functions invocation results to the AI model to get the final response
    messageContent = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
    functionCalls = FunctionCallContent.GetFunctionCalls(messageContent).ToArray();
}

Cuplikan kode di atas menunjukkan cara memigrasikan kode Anda yang menggunakan konektor OpenAI AI. Proses migrasi serupa dapat diterapkan ke konektor Gemini dan Mistral AI ketika diperbarui untuk mendukung model panggilan fungsi baru.

Langkah berikutnya

Sekarang setelah Anda memigrasikan kode Anda ke model panggilan fungsi baru, Anda dapat melanjutkan untuk mempelajari cara mengonfigurasi berbagai aspek model yang mungkin lebih sesuai dengan skenario spesifik Anda dengan merujuk ke bagian perilaku panggilan fungsi.

Segera hadir

Info lebih lanjut akan segera hadir.

Segera hadir

Info lebih lanjut akan segera hadir.