Aracılığıyla paylaş


Anlam Çekirdeği Keşfi ChatCompletionAgent

Tavsiye

Bu tartışmayla ilgili ayrıntılı API belgelerine şu adreste ulaşabilirsiniz:

Tavsiye

Bu tartışmayla ilgili ayrıntılı API belgelerine şu adreste ulaşabilirsiniz:

Tavsiye

Bu tartışmayla ilgili ayrıntılı API belgelerine şu adreste ulaşabilirsiniz:

Semantic Kernel'de Sohbet Tamamlama

Sohbet Tamamlama temel olarak, sohbet geçmişinin korunduğu ve her istekle modele sunulduğu yapay zeka modeliyle sohbet tabanlı etkileşime yönelik bir protokoldür. Semantik Çekirdek yapay zeka hizmetleri , çeşitli yapay zeka modellerinin sohbet tamamlama özelliklerini tümleştirmeye yönelik birleşik bir çerçeve sunar.

, ChatCompletionAgent ister bir kullanıcıya ister başka bir aracıya yönlendirilen yanıtlar oluşturmak için bu yapay zeka hizmetlerinden herhangi birini kullanabilir.

Geliştirme Ortamınızı Hazırlama

ChatCompletionAgentgeliştirmeye devam etmek için geliştirme ortamınızı uygun paketlerle yapılandırın.

projenize Microsoft.SemanticKernel.Agents.Core paketini ekleyin:

dotnet add package Microsoft.SemanticKernel.Agents.Core --prerelease

semantic-kernel Paketi yükleyin:

pip install semantic-kernel

Önemli

içinde hangi Yapay Zeka Hizmetini kullandığınıza ChatCompletionAgentbağlı olarak ek paketler yüklemeniz gerekebilir. Lütfen aşağıdaki sayfada gerekli ek bilgi olup olmadığını kontrol edin

<dependency>
    <groupId>com.microsoft.semantic-kernel</groupId>
    <artifactId>semantickernel-agents-core</artifactId>
    <version>[LATEST]</version>
</dependency>

Bir ChatCompletionAgent oluşturmak

ChatCompletionAgent temel olarak yapay zeka hizmetlerini temel alır. Bu nedenle, bir ChatCompletionAgent oluşturmak, bir veya daha fazla sohbet tamamlama hizmeti içeren bir Kernel örneği oluşturmak ve ardından aracıyı o Kernel örneğine bir referansla oluşturmakla başlar.

// Initialize a Kernel with a chat-completion service
IKernelBuilder builder = Kernel.CreateBuilder();

builder.AddAzureOpenAIChatCompletion(/*<...configuration parameters>*/);

Kernel kernel = builder.Build();

// Create the agent
ChatCompletionAgent agent =
    new()
    {
        Name = "SummarizationAgent",
        Instructions = "Summarize user input",
        Kernel = kernel
    };

ChatCompletionAgentoluşturmanın iki yolu vardır:

1. Sohbet tamamlama hizmetini doğrudan sağlayarak

from semantic_kernel.agents import ChatCompletionAgent

# Create the agent by directly providing the chat completion service
agent = ChatCompletionAgent(
    service=AzureChatCompletion(),  # your chat completion service instance
    name="<agent name>",
    instructions="<agent instructions>",
)

2. Önce bir Çekirdek oluşturarak, hizmeti buna ekleyerek ve ardından çekirdeği sağlayarak

# Define the kernel
kernel = Kernel()

# Add the chat completion service to the kernel
kernel.add_service(AzureChatCompletion())

# Create the agent using the kernel
agent = ChatCompletionAgent(
  kernel=kernel, 
  name="<agent name>", 
  instructions="<agent instructions>",
)

İlk yöntem, sohbet tamamlama hizmetiniz hazır olduğunda kullanışlıdır. İkinci yöntem, birden çok hizmeti veya ek işlevselliği yöneten bir çekirdek gerektiğinde yararlıdır.

// Initialize a Kernel with a chat-completion service
var chatCompletion = OpenAIChatCompletion.builder()
        .withOpenAIAsyncClient(client) // OpenAIAsyncClient with configuration parameters
        .withModelId(MODEL_ID)
        .build();

var kernel = Kernel.builder()
        .withAIService(ChatCompletionService.class, chatCompletion)
        .build();

// Create the agent
var agent = ChatCompletionAgent.builder()
        .withKernel(kernel)
        .build();

Yapay Zeka Hizmeti Seçimi

, doğrudan ChatCompletionAgent Anlam Çekirdeği'ni kullanmaktan farklı değildir. , hizmet seçici belirtimini destekler. Hizmet seçici, yapay zeka hizmetini hedef alacak olanı Kernel birden fazla varsa tanımlar.

Uyarı

Birden çok yapay zeka hizmeti mevcutsa ve hizmet seçici sağlanmazsa, dışındaki bir Agent Framework kullanırken karşılaşacağınız aynı varsayılan mantık, temsilciye uygulanır.

IKernelBuilder builder = Kernel.CreateBuilder();

// Initialize multiple chat-completion services.
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-1");
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-2");

Kernel kernel = builder.Build();

ChatCompletionAgent agent =
    new()
    {
        Name = "<agent name>",
        Instructions = "<agent instructions>",
        Kernel = kernel,
        Arguments = // Specify the service-identifier via the KernelArguments
          new KernelArguments(
            new OpenAIPromptExecutionSettings() 
            { 
              ServiceId = "service-2" // The target service-identifier.
            })
    };
from semantic_kernel.connectors.ai.open_ai import (
    AzureChatCompletion,
    AzureChatPromptExecutionSettings,
)

# Define the Kernel
kernel = Kernel()

# Add the AzureChatCompletion AI Service to the Kernel
kernel.add_service(AzureChatCompletion(service_id="service1"))
kernel.add_service(AzureChatCompletion(service_id="service2"))

settings = AzureChatPromptExecutionSettings(service_id="service2")

# Create the agent
agent = ChatCompletionAgent(
  kernel=kernel, 
  name="<agent name>", 
  instructions="<agent instructions>",
  arguments=KernelArguments(settings=settings)
)

Özellik şu anda Java'da kullanılamıyor.

ChatCompletionAgent ile konuşma

Sizin ChatCompletionAgent'inizle sohbet etmek, ChatHistory örneğine dayanır ve sohbet tamamlama yapay zeka hizmetiile etkileşimde bulunmaktan farklı değildir.

Aracıyı kullanıcı iletinizle çağırmanız yeterlidir.

// Define agent
ChatCompletionAgent agent = ...;

// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>")))
{
  // Process agent response(s)...
}

Bir AgentThread kullanarak temsilcinizle de konuşma yapabilirsiniz. Burada bir ChatHistoryAgentThreadkullanıyoruz.

, ChatHistoryAgentThread önceki bir konuşmayı devam ettiriyorsa oluşturucu aracılığıyla isteğe bağlı ChatHistory bir nesneyi giriş olarak da alabilir. (gösterilmez)

// Define agent
ChatCompletionAgent agent = ...;

AgentThread thread = new ChatHistoryAgentThread();

// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>"), thread))
{
  // Process agent response(s)...
}

ChatCompletionAgentile sohbet etmenin birden çok yolu vardır.

En kolayı aramak ve get_responsebeklemektir:

# Define agent
agent = ChatCompletionAgent(...)

# Generate the agent response
response = await agent.get_response(messages="user input")
# response is an `AgentResponseItem[ChatMessageContent]` object

Etkene çağrıların arasında konuşma geçmişini korumasını istiyorsanız, bunu aşağıdaki şekilde geçebilirsiniz: ChatHistoryAgentThread


# Define agent
agent = ChatCompletionAgent(...)

# Generate the agent response(s)
response = await agent.get_response(messages="user input")

# Generate another response, continuing the conversation thread from the first response.
response2 = await agent.get_response(messages="user input", thread=response.thread)
# process agent response(s)

invoke yöntemini çağırmak, bir AsyncIterableAgentResponseItem[ChatMessageContent] döndürür.

# Define agent
agent = ChatCompletionAgent(...)

# Define the thread
thread = ChatHistoryAgentThread()

# Generate the agent response(s)
async for response in agent.invoke(messages="user input", thread=thread):
  # process agent response(s)

ChatCompletionAgent, invoke_stream yönteminin bir AsyncIterableStreamingChatMessageContent döndürdüğü durumlardaki akışı da destekler:

# Define agent
agent = ChatCompletionAgent(...)

# Define the thread
thread = ChatHistoryAgentThread()

# Generate the agent response(s)
async for response in agent.invoke_stream(messages="user input", thread=thread):
  # process agent response(s)
ChatCompletionAgent agent = ...;

// Generate the agent response(s)
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "<user input>")).block();

Bir AgentThread kullanarak temsilcinizle de konuşma yapabilirsiniz. Burada bir ChatHistoryAgentThreadkullanıyoruz.

ChatHistoryAgentThread, önceki bir konuşmayı sürdürme durumunda, bir nesneyi oluşturucusu aracılığıyla giriş olarak da alabilir. (gösterilmez)

// Define agent
ChatCompletionAgent agent = ...;

AgentThread thread = new ChatHistoryAgentThread();

// Generate the agent response(s)
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "<user input>"), thread).block();

Bir ChatCompletionAgent ile Ara Mesajları İşleme

Anlam Çekirdeği ChatCompletionAgent , kullanıcı sorgularını veya sorularını yerine getiren bir aracı çağırmak için tasarlanmıştır. Çağırma sırasında aracı, son yanıtı türetmek için araçlar çalıştırabilir. Bu işlem sırasında üretilen ara iletilere erişmek için, çağıranlar FunctionCallContent veya FunctionResultContent örneklerini işleyen bir geri çağırma işlevi sağlayabilir.

ChatCompletionAgent için geri çağırma belgeleri yakında sunulacaktır.

on_intermediate_message geri çağırmayı agent.invoke(...) veya agent.invoke_stream(...) içinde yapılandırmak, arayanın, ajanın nihai yanıtını formüle etme süreci sırasında üretilen ara mesajları almasına olanak tanır.

import asyncio
from typing import Annotated

from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent, ChatHistoryAgentThread
from semantic_kernel.connectors.ai.open_ai.services.azure_chat_completion import AzureChatCompletion
from semantic_kernel.contents import FunctionCallContent, FunctionResultContent
from semantic_kernel.contents.chat_message_content import ChatMessageContent
from semantic_kernel.functions import kernel_function


# Define a sample plugin for the sample
class MenuPlugin:
    """A sample Menu Plugin used for the concept sample."""

    @kernel_function(description="Provides a list of specials from the menu.")
    def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
        return """
        Special Soup: Clam Chowder
        Special Salad: Cobb Salad
        Special Drink: Chai Tea
        """

    @kernel_function(description="Provides the price of the requested menu item.")
    def get_item_price(
        self, menu_item: Annotated[str, "The name of the menu item."]
    ) -> Annotated[str, "Returns the price of the menu item."]:
        return "$9.99"


# This callback function will be called for each intermediate message
# Which will allow one to handle FunctionCallContent and FunctionResultContent
# If the callback is not provided, the agent will return the final response
# with no intermediate tool call steps.
async def handle_intermediate_steps(message: ChatMessageContent) -> None:
    for item in message.items or []:
        if isinstance(item, FunctionCallContent):
            print(f"Function Call:> {item.name} with arguments: {item.arguments}")
        elif isinstance(item, FunctionResultContent):
            print(f"Function Result:> {item.result} for function: {item.name}")
        else:
            print(f"{message.role}: {message.content}")


async def main() -> None:
    agent = ChatCompletionAgent(
        service=AzureChatCompletion(),
        name="Assistant",
        instructions="Answer questions about the menu.",
        plugins=[MenuPlugin()],
    )

    # Create a thread for the agent
    # If no thread is provided, a new thread will be
    # created and returned with the initial response
    thread: ChatHistoryAgentThread = None

    user_inputs = [
        "Hello",
        "What is the special soup?",
        "How much does that cost?",
        "Thank you",
    ]

    for user_input in user_inputs:
        print(f"# User: '{user_input}'")
        async for response in agent.invoke(
            messages=user_input,
            thread=thread,
            on_intermediate_message=handle_intermediate_steps,
        ):
            print(f"# {response.role}: {response}")
            thread = response.thread


if __name__ == "__main__":
    asyncio.run(main())

Aşağıda aracı çağırma işleminden alınan örnek çıkış gösterilmektedir:

User: 'Hello'
AuthorRole.ASSISTANT: Hi there! How can I assist you today?
User: 'What is the special soup?'
Function Call:> MenuPlugin-get_specials with arguments: {}
Function Result:> 
        Special Soup: Clam Chowder
        Special Salad: Cobb Salad
        Special Drink: Chai Tea
        for function: MenuPlugin-get_specials
AuthorRole.ASSISTANT: The special soup today is Clam Chowder. Would you like to know anything else from the menu?
User: 'How much does that cost?'
Function Call:> MenuPlugin-get_item_price with arguments: {"menu_item":"Clam Chowder"}
Function Result:> $9.99 for function: MenuPlugin-get_item_price
AuthorRole.ASSISTANT: The Clam Chowder costs $9.99. Would you like to know more about the menu or anything else?
User: 'Thank you'
AuthorRole.ASSISTANT: You're welcome! If you have any more questions, feel free to ask. Enjoy your day!

Özellik şu anda Java'da kullanılamıyor.

Bildirim Temelli Belirtim

Bildirim temelli özellikleri kullanma belgeleri yakında kullanıma sunulacaktır.

Önemli

Bu özellik deneysel aşamadadır. Bu aşamadaki özellikler geliştirme aşamasındadır ve önizleme veya sürüm adayı aşamasına geçmeden önce değiştirilebilir.

ChatCompletionAgent doğrudan YAML bildirim belirtiminden örneklenebilir. Bu yaklaşım, aracının temel özelliklerini, yönergelerini ve kullanılabilir işlevlerini (eklentiler) yapılandırılmış ve taşınabilir bir şekilde tanımlamanızı sağlar. YAML kullanarak, aracının adını, açıklamasını, yönerge istemini, araç kümesini ve model parametrelerini tek bir belgede açıklayarak aracının yapılandırmasını kolayca denetlenebilir ve yeniden üretilebilir hale getirebilirsiniz.

Uyarı

Bildirim temelli YAML'de belirtilen tüm araçlar veya işlevler, aracı oluşturulduğu sırada Çekirdek örneğinde zaten mevcut olmalıdır. Aracı yükleyici belirtiminden yeni işlevler oluşturmaz; bunun yerine, başvuruda bulunan eklentileri ve işlevleri çekirdekteki tanımlayıcılarına göre arar. Çekirdekte gerekli bir eklenti veya işlev yoksa, aracı oluşturma sırasında bir hata oluşur.

Örnek: YAML özelliği kullanarak bir ChatCompletionAgent oluşturma

import asyncio
from typing import Annotated

from semantic_kernel import Kernel
from semantic_kernel.agents import AgentRegistry, ChatHistoryAgentThread
from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import kernel_function

# Define a plugin with kernel functions
class MenuPlugin:
    @kernel_function(description="Provides a list of specials from the menu.")
    def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
        return """
        Special Soup: Clam Chowder
        Special Salad: Cobb Salad
        Special Drink: Chai Tea
        """

    @kernel_function(description="Provides the price of the requested menu item.")
    def get_item_price(
        self, menu_item: Annotated[str, "The name of the menu item."]
    ) -> Annotated[str, "Returns the price of the menu item."]:
        return "$9.99"

# YAML spec for the agent
AGENT_YAML = """
type: chat_completion_agent
name: Assistant
description: A helpful assistant.
instructions: Answer the user's questions using the menu functions.
tools:
  - id: MenuPlugin.get_specials
    type: function
  - id: MenuPlugin.get_item_price
    type: function
model:
  options:
    temperature: 0.7
"""

USER_INPUTS = [
    "Hello",
    "What is the special soup?",
    "What does that cost?",
    "Thank you",
]

async def main():
    kernel = Kernel()
    kernel.add_plugin(MenuPlugin(), plugin_name="MenuPlugin")

    agent: ChatCompletionAgent = await AgentRegistry.create_from_yaml(
        AGENT_YAML, kernel=kernel, service=OpenAIChatCompletion()
    )

    thread: ChatHistoryAgentThread | None = None

    for user_input in USER_INPUTS:
        print(f"# User: {user_input}")
        response = await agent.get_response(user_input, thread=thread)
        print(f"# {response.name}: {response}")
        thread = response.thread

    await thread.delete() if thread else None

if __name__ == "__main__":
    asyncio.run(main())

Bu özellik kullanılamıyor.

Nasıl Yapılır

ChatCompletionAgentiçin uçtan uca bir örnek için bkz:

Sonraki Adımlar