함수 호출 마이그레이션 가이드
의미 체계 커널은 클래스가 나타내는 현재 함수 호출 기능에서 클래스가 나타내는 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 모델에서 선택한 함수 목록에 액세스할 수 있습니다.
- 채팅 기록에서 OpenAI 관련
OpenAIChatMessageContent
항목의 속성을 통해ToolCalls
사용할 수 있는 커넥터별 함수 호출 클래스(예:ChatToolCall
또는ChatCompletionsFunctionToolCall
)를 사용합니다. - 채팅 기록에서 커넥터에 구애받지 않은 항목의 속성을 통해
Items
사용할 수 있는 같은FunctionCallContent
커넥터에 구애받지 않은ChatMessageContent
함수 호출 클래스를 사용합니다.
현재 모델과 새 모델에서 두 가지 방법이 모두 지원됩니다. 그러나 더 유연하고 코드가 새 함수 호출 모델을 지원하는 AI 커넥터와 함께 작동할 수 있으므로 커넥터에 구애받지 않는 접근 방식을 사용하여 함수 호출에 액세스하는 것이 좋습니다. 또한 현재 모델이 곧 더 이상 사용되지 않을 것이라는 점을 고려하면 나중에 호환성이 손상되는 변경을 방지하기 위해 코드를 새 모델로 마이그레이션하는 것이 좋습니다.
따라서 이 코드 조각과 같이 커넥터별 함수 호출 클래스와 함께 수동 함수 호출을 사용하는 경우:
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 커넥터에 유사한 마이그레이션 프로세스를 적용할 수 있습니다.
다음 단계
이제 코드를 새 함수 호출 모델로 마이그레이션한 후 함수 호출 동작 섹션을 참조하여 특정 시나리오에 더 적합할 수 있는 모델의 다양한 측면을 구성하는 방법을 알아볼 수 있습니다.
서비스 예정
추가 정보는 곧 제공될 예정입니다.
서비스 예정
추가 정보는 곧 제공될 예정입니다.