Aracılığıyla paylaş


Planlama

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ı. Anlam Çekirdeği tanıtıldığından beri OpenAI, modelin bir işlevi çağırması için yerel bir yöntem sundu: 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. Şu örneği ele alalım: Bir kullanıcı ampulü yakmak ister. Yapay zekanın doğru eklentiye sahip olduğunu varsayarsak, ışığı açmak için işlevi çağırabilir.

Rol Mesaj
🔵 kullanıcı Lütfen ışık #1'i açın
🔴 Yardımcısı (işlev çağrısı) Lights.change_state(1, { "isOn": true })
🟢 Aracı { "id": 1, "name": "Table Lamp", "isOn": true, "brightness": 100, "hex": "FF0000" }
🔴 Yardımcısı 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.

Rol Mesaj
🔵 kullanıcı Lütfen tüm ışıkları açın
🔴 Yardımcısı (işlev çağrısı) Lights.get_lights()
🟢 Aracı { "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ısı (işlev çağrısı) Lights.change_state(1, { "isOn": false }) Lights.change_state(2, { "isOn": true })
🟢 Aracı { "id": 1, "name": "Table Lamp", "isOn": false, "brightness": 0, "hex": "FFFFFF" }
🟢 Aracı { "id": 2, "name": "Ceiling Light", "isOn": true, "brightness": 100, "hex": "FF0000" }
🔴 Yardımcısı Işıklar açılıp kapatıldı

Uyarı

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ı çözümleyerek mesajla yanıt vermek mi yoksa bir işlev çağırmak mı istediğini belirlemek için
  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.

Uyarı

İş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şini ve çekirdeği kullanarak sohbet tamamlama hizmetini çağırın

Tavsiye

Aşağıdaki kod örneği burada tanımlanan öğesini LightsPlugin kullanır.

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.connectors.ai import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.connectors.ai.open_ai import (
    AzureChatCompletion,
    AzureChatPromptExecutionSettings,
)
from semantic_kernel.contents import ChatHistory
from semantic_kernel.functions import kernel_function

async def main():
    # 1. Create the kernel with the Lights plugin
    kernel = Kernel()
    kernel.add_service(AzureChatCompletion())
    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_choice_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_content(
            chat_history=history,
            settings=execution_settings,
            kernel=kernel,
        )

        # 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 .

Stepwise ve Handlebars planlayıcılarına ne oldu?

Stepwise ve Handlebars planlayıcıları kullanım dışı bırakıldı ve Anlam Çekirdeği paketinden kaldırıldı. Bu planlayıcılar artık Python, .NET veya Java'da desteklenmiyor.

Çoğu senaryoda hem daha güçlü hem de kullanımı daha kolay olan işlev çağrısını kullanmanızı öneririz.

Mevcut çözümleri güncelleştirmek için Adım Adım Planner Geçiş Kılavuzumuzu izleyin.

Tavsiye

Yeni yapay zeka aracıları için kullanım dışı bırakılan planlayıcılar yerine işlev çağrısı kullanın. Daha iyi esneklik, yerleşik araç desteği ve daha basit bir geliştirme deneyimi sunar.

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.