İşlev Çağırma Geçiş Kılavuzu

Anlam Çekirdeği, şu anki işlev çağırma özelliklerini temsil eden ToolCallBehavior sınıfından, yeni ve gelişmiş özellikleri temsil eden FunctionChoiceBehavior sınıfına aşamalı olarak geçiş yapıyor. Yeni özellik hizmet agnostiktir ve geçerli modelden farklı olarak belirli bir yapay zeka hizmetine bağlı değildir. Bu nedenle Semantik Çekirdek soyutlamalarında bulunur ve işlev çağırma özellikli yapay zeka modelleriyle çalışan tüm yapay zeka bağlayıcıları tarafından kullanılır.

Bu kılavuz, kodunuzu yeni işlev çağırma özelliklerine geçirmenize yardımcı olmak için tasarlanmıştır.

ToolCallBehavior.AutoInvokeKernelFunctions davranışını taşıma

Davranış ToolCallBehavior.AutoInvokeKernelFunctions , yeni modeldeki FunctionChoiceBehavior.Auto davranışla eşdeğerdir.

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

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

ToolCallBehavior.EnableKernelFunctions davranışını aktarma

ToolCallBehavior.EnableKernelFunctions davranışı, devre dışı bırakılmış otomatik çağırma ile FunctionChoiceBehavior.Auto davranışına eşdeğerdir.

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

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

ToolCallBehavior.EnableFunctions davranışını taşımak

Bu ToolCallBehavior.EnableFunctions davranış, devre dışı bırakılmış otomatik çağırmaya sahip işlevlerin listesiyle yapılandırılan davranışa eşdeğerdir FunctionChoiceBehavior.Auto .

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

ToolCallBehavior.RequireFunction davranışını aktarma

Bu ToolCallBehavior.RequireFunction davranış, devre dışı bırakılmış otomatik çağırmaya sahip işlevlerin listesiyle yapılandırılan davranışa eşdeğerdir FunctionChoiceBehavior.Required .

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

Bağlayıcıya özgü işlev çağrısı sınıflarının kullanımını değiştirme

Anlam Çekirdeği'ndeki işlev çağırma işlevi, geliştiricilerin yapay zeka modeli tarafından seçilen işlevlerin listesine iki şekilde erişmesini sağlar:

  • OpenAI'ye özgü ChatToolCall öğesinin sohbet geçmişindeki ChatCompletionsFunctionToolCall özelliği aracılığıyla sağlanan ToolCalls veya OpenAIChatMessageContent gibi bağlayıcıya özgü işlev çağrı sınıflarını kullanma.
  • bağlayıcıdan bağımsız FunctionCallContent işlev çağrı sınıflarını, sohbet geçmişinde yer alan bağlayıcıdan bağımsız Items nesnesinin ChatMessageContent özelliği aracılığıyla kullanarak elde edebilirsiniz.

Her iki yol da geçerli ve yeni modeller tarafından şu anda desteklenmektedir. Ancak, daha esnek olduğundan ve kodunuzun yeni işlev çağırma modelini destekleyen tüm yapay zeka bağlayıcılarıyla çalışmasına izin verdiğinden işlev çağrılarına erişmek için bağlayıcıdan bağımsız yaklaşımı kullanmanızı kesinlikle öneririz. Ayrıca, geçerli modelin yakında kullanım dışı bırakılacağını göz önünde bulundurarak, gelecekte hataya neden olan değişiklikleri önlemek için kodunuzu yeni modele geçirmek için iyi bir zaman.

Bu nedenle, bu kod parçacığında olduğu gibi El ile İşlev Çağırma'yı bağlayıcıya özgü işlev çağrı sınıfları ile kullanırsanız:

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

Bağlayıcıdan bağımsız sınıfları kullanmak için yeniden düzenleyebilirsiniz:

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

OpenAI AI bağlayıcısını kullanan kodunuzu nasıl taşıyacağınızı gösteren yukarıdaki kod parçacıkları. İkizler ve Mistral AI bağlayıcıları yeni işlev çağırma modelini destekleyecek şekilde güncelleştirildiğinde benzer bir geçiş süreci uygulanabilir.

Sonraki adımlar

Kodunuzu yeni işlev çağırma modeline geçirdikten sonra işlev çağırma davranışları bölümüne bakarak modelin belirli senaryolarınıza daha uygun olabilecek çeşitli yönlerini yapılandırmayı öğrenmeye devam edebilirsiniz.

Yakında

Daha fazla bilgi yakında sunulacaktır.

Yakında

Daha fazla bilgi yakında sunulacaktır.