Aracılığıyla paylaş


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

Anlam Çekirdeği, sınıfı tarafından temsil edilen geçerli işlev çağırma özelliklerinden sınıfı tarafından ToolCallBehavior temsil FunctionChoiceBehavior edilen yeni gelişmiş özelliklere 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ı geçirme

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ı geçirme

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

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

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

ToolCallBehavior.EnableFunctions davranışını geçirme

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ı geçirme

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:

  • Sohbet geçmişinde OpenAI'ye özgü öğenin özelliği aracılığıyla ToolCalls sağlanan veya ChatCompletionsFunctionToolCallgibi ChatToolCall bağlayıcıya özgü OpenAIChatMessageContent işlev çağrı sınıflarını kullanma.
  • gibi FunctionCallContentbağlayıcıdan bağımsız işlev çağrı sınıflarını kullanarak sohbet geçmişindeki Items bağlayıcıdan bağımsız ChatMessageContent öğenin özelliği aracılığıyla kullanılabilir.

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 bağlayıcıya özgü işlev çağrı sınıfları ile El ile İşlev Çağırma'yı 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();
}

Yukarıdaki kod parçacıkları, OpenAI AI bağlayıcısını kullanan kodunuzun nasıl geçirildiğini gösterir. İ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.