Planner nedir?
Birden çok eklentiye sahip olduktan sonra yapay zeka aracınızın bir kullanıcının ihtiyacını çözmek için bunları birlikte kullanabilmesi için bir yönteme ihtiyacınız olur. Planlama burada devreye girer.
Semantik Çekirdek daha önce yapay zekadan çağrılacak işlevleri seçmesini istemek için istemleri kullanan planlayıcı kavramını ortaya atmıştı. Ancak Anlam Çekirdeği kullanıma sunulduğundan OpenAI, modelin bir işlevi çağırması veya "çağırması" için yerel bir yöntem sunmıyordu: işlev çağrısı. Gemini, Claude ve Mistral gibi diğer yapay zeka modelleri o zamandan beri işlev çağrılarını çekirdek bir özellik olarak benimseyerek modeller arası desteklenen bir özellik haline getirdi.
Bu ilerlemeler nedeniyle Anlam Çekirdeği, görevleri planlamanın ve yürütmenin birincil yolu olarak işlev çağrısını kullanacak şekilde gelişti.
Önemli
İşlev çağrısı yalnızca 0613 veya daha yeni olan OpenAI modellerinde kullanılabilir. Eski bir model (örneğin, 0314) kullanıyorsanız, bu işlev bir hata döndürür. Bu özelliğin avantajlarından yararlanmak için en son OpenAI modellerini kullanmanızı öneririz.
İşlev çağrısı nasıl "plan" oluşturur?
en basiti, işlev çağrısı yalnızca bir yapay zekanın doğru parametrelerle işlev çağırmak için bir yoldur. Örneğin, bir kullanıcı ampulü açmak ister. Yapay zekanın doğru eklentiye sahip olduğunu varsayarsak, ışığı açmak için işlevi çağırabilir.
Role | İleti |
---|---|
🔵Kullanıcı | Lütfen ışık #1'i açın |
🔴Yardımcı (işlev çağrısı) | Lights.change_state(1, { "isOn": true }) |
🟢Araç | { "id": 1, "name": "Table Lamp", "isOn": true, "brightness": 100, "hex": "FF0000" } |
🔴Asistan | Lamba artık açık |
Peki ya kullanıcı ışığın kimliğini bilmiyorsa? Ya da ya kullanıcı tüm ışıkları açmak isterse? Planlama burada devreye girer. Günümüzün LLM modelleri, kullanıcının ihtiyacını çözmek için işlevleri yinelemeli olarak çağırabilir. Bu, yapay zekanın bir işlevi çağırabileceği, sonucu denetleyebileceği ve ardından ne yapılacağına karar verebildiği bir geri bildirim döngüsü oluşturarak gerçekleştirilir.
Örneğin, bir kullanıcı yapay zekadan ampulü "değiştirmesini" isteyebilir. Yapay zekanın açılıp açılmayacağı konusunda karar vermeden önce ampulün durumunu denetlemesi gerekir.
Role | İleti |
---|---|
🔵Kullanıcı | Lütfen tüm ışıkları açın |
🔴Yardımcı (işlev çağrısı) | Lights.get_lights() |
🟢Araç | { "lights": [ { "id": 1, "name": "Table Lamp", "isOn": true, "brightness": 100, "hex": "FF0000" }, { "id": 2, "name": "Ceiling Light", "isOn": false, "brightness": 0, "hex": "FFFFFF" } ] } |
🔴Yardımcı (işlev çağrısı) | Lights.change_state(1, { "isOn": false }) Lights.change_state(2, { "isOn": true }) |
🟢Araç | { "id": 1, "name": "Table Lamp", "isOn": false, "brightness": 0, "hex": "FFFFFF" } |
🟢Araç | { "id": 2, "name": "Ceiling Light", "isOn": true, "brightness": 100, "hex": "FF0000" } |
🔴Asistan | Işıklar aç/kapatılmış |
Not
Bu örnekte paralel işlev çağrısı da gördünüz. Burası yapay zekanın aynı anda birden çok işlevi çağırabildiği yerdir. Bu, yapay zekanın karmaşık görevleri daha hızlı çözmesine yardımcı olabilecek güçlü bir özelliktir. 1106'da OpenAI modellerine eklendi.
Otomatik planlama döngüsü
Anlam Çekirdeği olmadan işlev çağrısının desteklenmesi nispeten karmaşıktır. Aşağıdakileri gerçekleştirecek bir döngü yazmanız gerekir:
- İşlevlerinizin her biri için JSON şemaları oluşturma
- LLM'ye önceki sohbet geçmişini ve işlev şemalarını sağlayın
- LLM'nin yanıtını ayrıştırarak iletiyle yanıtlamak mı yoksa işlev çağırmak mı istediğini belirleyin
- LLM bir işlevi çağırmak istiyorsa, LLM'nin yanıtından işlev adını ve parametrelerini ayrıştırmanız gerekir
- İşlevi doğru parametrelerle çağırma
- LLM'nin bundan sonra ne yapması gerektiğini belirleyebilmesi için işlevin sonuçlarını döndürün
- LLM görevi tamamlayana veya kullanıcının yardımına ihtiyaç duyana kadar 2-6 arası adımları yineleyin
Anlam Çekirdeği'nde, bu döngünün sizin için otomatikleştirilmesiyle işlev çağrısının kullanımını kolaylaştırırız. Bu, kullanıcınızın ihtiyaçlarını çözmek için gereken eklentileri oluşturmaya odaklanmanızı sağlar.
Not
İşlev çağırma döngüsünün nasıl çalıştığını anlamak, yüksek performanslı ve güvenilir yapay zeka aracıları oluşturmak için gereklidir. Döngünün nasıl çalıştığına ayrıntılı bir bakış için işlev çağırma makalesine bakın.
Otomatik işlev çağrısı kullanma
Anlam Çekirdeği'nde otomatik işlev çağrısını kullanmak için aşağıdakileri yapmanız gerekir:
- Eklentiyi çekirdekle kaydetme
- Yapay zekaya işlevleri otomatik olarak çağırmasını söyleyen bir yürütme ayarları nesnesi oluşturma
- Sohbet geçmişi ve çekirdek ile sohbet tamamlama hizmetini çağırma
using System.ComponentModel;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// 1. Create the kernel with the Lights plugin
var builder = Kernel.CreateBuilder().AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Plugins.AddFromType<LightsPlugin>("Lights");
Kernel kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 2. Enable automatic function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var history = new ChatHistory();
string? userInput;
do {
// Collect user input
Console.Write("User > ");
userInput = Console.ReadLine();
// Add user input
history.AddUserMessage(userInput);
// 3. Get the response from the AI with automatic function calling
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// Print the results
Console.WriteLine("Assistant > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
} while (userInput is not null)
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.functions import kernel_function
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.contents.chat_history import ChatHistory
from semantic_kernel.functions.kernel_arguments import KernelArguments
from semantic_kernel.connectors.ai.open_ai.prompt_execution_settings.azure_chat_prompt_execution_settings import (
AzureChatPromptExecutionSettings,
)
async def main():
# 1. Create the kernel with the Lights plugin
kernel = Kernel()
kernel.add_service(AzureChatCompletion(
deployment_name="your_models_deployment_name",
api_key="your_api_key",
base_url="your_base_url",
))
kernel.add_plugin(
LightsPlugin(),
plugin_name="Lights",
)
chat_completion : AzureChatCompletion = kernel.get_service(type=ChatCompletionClientBase)
# 2. Enable automatic function calling
execution_settings = AzureChatPromptExecutionSettings()
execution_settings.function_call_behavior = FunctionChoiceBehavior.Auto()
# Create a history of the conversation
history = ChatHistory()
userInput = None
while True:
# Collect user input
userInput = input("User > ")
# Terminate the loop if the user says "exit"
if userInput == "exit":
break
# Add user input to the history
history.add_user_message(userInput)
# 3. Get the response from the AI with automatic function calling
result = (await chat_completion.get_chat_message_contents(
chat_history=history,
settings=execution_settings,
kernel=kernel,
arguments=KernelArguments(),
))[0]
# Print the results
print("Assistant > " + str(result))
# Add the message from the agent to the chat history
history.add_message(result)
# Run the main function
if __name__ == "__main__":
asyncio.run(main())
OpenAIAsyncClient client = new OpenAIClientBuilder()
.credential(new AzureKeyCredential(AZURE_CLIENT_KEY))
.endpoint(CLIENT_ENDPOINT)
.buildAsyncClient();
// Import the LightsPlugin
KernelPlugin lightPlugin = KernelPluginFactory.createFromObject(new LightsPlugin(),
"LightsPlugin");
// Create your AI service client
ChatCompletionService chatCompletionService = OpenAIChatCompletion.builder()
.withModelId(MODEL_ID)
.withOpenAIAsyncClient(client)
.build();
// Create a kernel with Azure OpenAI chat completion and plugin
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletionService)
.withPlugin(lightPlugin)
.build();
// Add a converter to the kernel to show it how to serialise LightModel objects into a prompt
ContextVariableTypes
.addGlobalConverter(
ContextVariableTypeConverter.builder(LightModel.class)
.toPromptString(new Gson()::toJson)
.build());
// Enable planning
InvocationContext invocationContext = new InvocationContext.Builder()
.withReturnMode(InvocationReturnMode.LAST_MESSAGE_ONLY)
.withToolCallBehavior(ToolCallBehavior.allowAllKernelFunctions(true))
.build();
// Create a history to store the conversation
ChatHistory history = new ChatHistory();
// Initiate a back-and-forth chat
Scanner scanner = new Scanner(System.in);
String userInput;
do {
// Collect user input
System.out.print("User > ");
userInput = scanner.nextLine();
// Add user input
history.addUserMessage(userInput);
// Prompt AI for response to users input
List<ChatMessageContent<?>> results = chatCompletionService
.getChatMessageContentsAsync(history, kernel, invocationContext)
.block();
for (ChatMessageContent<?> result : results) {
// Print the results
if (result.getAuthorRole() == AuthorRole.ASSISTANT && result.getContent() != null) {
System.out.println("Assistant > " + result);
}
// Add the message from the agent to the chat history
history.addMessage(result);
}
} while (userInput != null && !userInput.isEmpty());
Otomatik işlev çağrısı kullandığınızda, otomatik planlama döngüsündeki tüm adımlar sizin için işlenir ve nesneye ChatHistory
eklenir. İşlev çağırma döngüsü tamamlandıktan sonra, semantik çekirdek tarafından yapılan tüm işlev çağrılarını ve sonuçları görmek için nesnesini inceleyebilirsiniz ChatHistory
.
İşlev Çağrısı Stepwise ve Handlebars planlayıcıları ne olacak?
Stepwise ve Handlebars planlayıcıları Anlam Çekirdeği'nde hala kullanılabilir. Ancak, daha güçlü ve kullanımı daha kolay olduğundan çoğu görev için işlev çağrısı kullanmanızı öneririz. Hem Stepwise hem de Handlebars planlayıcıları, Semantik Çekirdeğin gelecekteki bir sürümünde kullanım dışı bırakılacaktır.
Stepwise Planner'ı Otomatik İşlev Çağrısına geçirmeyi öğrenin.
Dikkat
Yeni bir yapay zeka aracısı oluşturuyorsanız Stepwise veya Handlebars planlayıcılarını kullanmamanızı öneririz. Bunun yerine, daha güçlü ve kullanımı daha kolay olduğundan işlev çağrısını kullanın.
Sonraki adımlar
Planlayıcıların Anlam Çekirdeği'nde nasıl çalıştığını anladığınıza göre yapay zeka aracınızı nasıl etkilediği hakkında daha fazla bilgi edinebilir, böylece kullanıcılarınız adına görevleri en iyi şekilde planlayabilir ve yürütebilirler.