関数呼び出し移行ガイド
セマンティック カーネルは、 ToolCallBehavior
クラスで表される現在の関数呼び出し機能から、 FunctionChoiceBehavior
クラスで表される新しい拡張機能に徐々に移行しています。
新しい機能はサービスに依存せず、現在のモデルとは異なり、特定の AI サービスには関連付けされません。 したがって、これはセマンティック カーネルの抽象化に存在し、関数呼び出し対応 AI モデルを使用するすべての AI コネクタで使用されます。
このガイドは、コードを新しい関数呼び出し機能に移行するのに役立ちます。
ToolCallBehavior.AutoInvokeKernelFunctions の動作を移行する
ToolCallBehavior.AutoInvokeKernelFunctions
動作は、新しいモデルのFunctionChoiceBehavior.Auto
動作と同じです。
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
ToolCallBehavior.EnableKernelFunctions の動作を移行する
ToolCallBehavior.EnableKernelFunctions
動作は、自動呼び出しが無効になっているFunctionChoiceBehavior.Auto
動作と同じです。
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };
ToolCallBehavior.EnableFunctions の動作を移行する
ToolCallBehavior.EnableFunctions
動作は、自動呼び出しが無効になっている関数の一覧で構成された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 の動作を移行する
ToolCallBehavior.RequireFunction
動作は、自動呼び出しが無効になっている関数の一覧で構成された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) };
コネクタ固有の関数呼び出しクラスの使用法を置き換える
セマンティック カーネルの関数呼び出し機能を使用すると、開発者は AI モデルによって選択された関数の一覧に 2 つの方法でアクセスできます。
ChatToolCall
やChatCompletionsFunctionToolCall
などのコネクタ固有の関数呼び出しクラスを使用します。チャット履歴の OpenAI 固有のOpenAIChatMessageContent
項目のToolCalls
プロパティを使用して使用できます。FunctionCallContent
などのコネクタに依存しない関数呼び出しクラスを使用すると、チャット履歴のコネクタに依存しないChatMessageContent
項目のItems
プロパティを使用して使用できます。
現在のモデルと新しいモデルでは、現時点では両方の方法がサポートされています。 ただし、コネクタに依存しないアプローチを使用して関数呼び出しにアクセスすることを強くお勧めします。これは、柔軟性が高く、新しい関数呼び出しモデルをサポートする任意の AI コネクタでコードを操作できるためです。 さらに、現在のモデルが間もなく非推奨になることを考慮して、今後の破壊的変更を回避するために、コードを新しいモデルに移行することをお勧めします。
そのため、 Manual 関数呼び出しを使用する場合は 次のコード スニペットのようにコネクタ固有の関数呼び出しクラスを使用します。
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();
}
コネクタに依存しないクラスを使用するようにリファクタリングできます。
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 コネクタを使用するコードを移行する方法を示しています。 同様の移行プロセスは、Gemini と Mistral AI コネクタが更新されたときに、新しい関数呼び出しモデルをサポートするように適用できます。
次のステップ
コードを新しい関数呼び出しモデルに移行したら、関数呼び出し動作のセクションを参照して、特定のシナリオに対応する可能性があるモデルのさまざまな側面を構成する方法を学習できます。
間もなく利用できます
詳細については、近日公開予定です。
間もなく利用できます
詳細については、近日公開予定です。