Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
ChatToolCallatauChatCompletionsFunctionToolCall, tersedia melaluiToolCallsproperti item khususOpenAIChatMessageContentOpenAI dalam riwayat obrolan. - Menggunakan kelas panggilan fungsi konektor-agnostik seperti
FunctionCallContent, tersedia melaluiItemsproperti item konektor-agnostikChatMessageContentdalam 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.