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:

  1. İşlevlerinizin her biri için JSON şemaları oluşturma
  2. LLM'ye önceki sohbet geçmişini ve işlev şemalarını sağlayın
  3. LLM'nin yanıtını ayrıştırarak iletiyle yanıtlamak mı yoksa işlev çağırmak mı istediğini belirleyin
  4. LLM bir işlevi çağırmak istiyorsa, LLM'nin yanıtından işlev adını ve parametrelerini ayrıştırmanız gerekir
  5. İşlevi doğru parametrelerle çağırma
  6. LLM'nin bundan sonra ne yapması gerektiğini belirleyebilmesi için işlevin sonuçlarını döndürün
  7. 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:

  1. Eklentiyi çekirdekle kaydetme
  2. Yapay zekaya işlevleri otomatik olarak çağırmasını söyleyen bir yürütme ayarları nesnesi oluşturma
  3. 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.