エージェントとは

エージェントは、AI モデルを活用して機能するソフトウェア ベースのエンティティです。 これらは、さまざまなタスクを実行するように構築されており、実行するジョブに基づいて異なる名前を呼び出します。

たとえば、質問に答えるために構築されたエージェントは、チャットベースのエクスペリエンスのためにチャットボットと呼ばれます。 これらのエージェントは、通常、会社のドキュメントなど、独自のデータに固定されます。

自分と一緒に動作するように構築されたエージェントは、通常、副操縦士と呼ばれます。 これらのエージェントは、電子メールの作成や他の Office 成果物の作成などのタスクを完了するのに役立ちます。これには、承諾または拒否を選択する推奨事項が用意されています。

反復的なタスクを処理するために構築されたエージェントは、通常、完全に自律的なラベルが付けられます。 イベントに応答し、介入を必要とせずにアクションを実行します。 これは、自分の代わりに作業を行うという点で、副操縦士とは異なります。

セマンティック カーネルは、AI の専門家でなくても、必要なあらゆる種類のエージェントを構築するためのインフラストラクチャを提供します。

3種類のエージェント:チャットボットコピロットと完全に自律的

最初のエージェントのビルド

エージェントは、タスクを完了するために調和的に連携する 3 つのコア構成要素で構成されています。 メールの作成と送信に役立つ副操縦士を構築して詳しく見てみましょう。

エージェントの構成要素

メールの書き込みと送信を行う副操縦士

この副操縦を作成するには、電子メールを送信できるプラグイン、電子メールを書く計画を生成するプランナー、および電子メールを送信するために必要な情報を取得するために対話するペルソナを作成する必要があります。

Step 説明
1 ユーザーのメール アドレスと名前を取得する
2 受信者のメール アドレスを取得する
3 メールのトピックを取得する
4 メールの件名と本文を生成する
5 ユーザーとのメールを確認する
6 メールを送信する

このシナリオを有効にするには、電子メールを送信できるプラグイン、メールを書く計画を生成できるプランナー、および必要な情報を取得するためにユーザーと対話できるペルソナを作成する必要があります。

次のセクションでは、概念的な構成要素と、それらをまとめて最初のエージェントを構築する方法について説明します。 その後、各構成要素の特定のガイドを参照して、それらを構築する方法の詳細を確認できます。

プラグイン: エージェントのスキルを付与する

上記の計画を生成するには、最初にこれらの手順を実行するために必要な機能が必要です。 プラグインが入ってくる場所です。 プラグインを使用すると、コードを使用してエージェントのスキルを付与できます。 たとえば、電子メールの送信、データベースからの情報の取得、ヘルプの要求、以前の会話からのメモリの保存と取得を行うプラグインを作成できます。

この例では、 native コードを使用して電子メールを送信する単純なプラグインを構築できます。 私たちのプラグインは、単一の機能を持っています, send_email, 電子メールアドレスを取ります, 件名, 電子メールの本文. その後、この情報を使用して電子メールを送信します。

using System.ComponentModel;
using Microsoft.SemanticKernel;

public class EmailPlugin
{
    [KernelFunction("send_email")]
    [Description("Sends an email to a recipient.")]
    public async Task SendEmailAsync(
        Kernel kernel,
        List<string> recipientEmails,
        string subject,
        string body
    )
    {
        // Add logic to send an email using the recipientEmails, subject, and body
        // For now, we'll just print out a success message to the console
        Console.WriteLine("Email sent!");
    }
}
from semantic_kernel.functions import kernel_function

class EmailPlugin:
    @kernel_function(
        name="send_email",
        description="Sends an email to a recipient."
    )
    async def send_email(self, recipient_emails: str|List[str], subject: str, body: str):
        # Add logic to send an email using the recipient_emails, subject, and body
        # For now, we'll just print out a success message to the console
        print("Email sent!")

プラグインを作成する方法は他にもあります。 たとえば、電子メールを送信できる RestAPI がある場合は、 OpenAPI 仕様を使用してプラグインを自動的に作成できます。 プラグインを作成するその他の方法の詳細については、「 plugins」セクションを参照してください

計画: 複数ステップのタスクを完了する

実際にこのプラグインを使用し、他のステップでそれらを結び付けるために、副操縦士は計画を生成する必要があります。 ここで計画が立ちます。 計画は、タスクを繰り返し完了する方法を決定する LLM の組み込み機能に由来します。

Note

以前は、セマンティック カーネルなどの SDK で使用できるプランを生成する際に AI をガイドする特別なプロンプトが AI アプリ開発者によって作成されていました。 ただし、LLM が登場すると、AI は関数呼び出しを利用してユーザーとの会話から直接プランを生成できるようになりました。

組み込みの計画サポート フォーム LLM では、セマンティック カーネルの使用が、自動関数呼び出しが有効になっているチャット完了サービスを呼び出すのと同じくらい簡単になりました。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;

// Create kernel with an email plugin
var builder = Kernel.CreateBuilder();
builder.Plugins.AddFromType<EmailPlugin>();
Kernel kernel = builder.Build();

// Create chat completion service
AzureOpenAIChatCompletionService chatCompletionService = new (
    deploymentName: "gpt-4",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT"
);

// Enable planning
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new() 
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};

// Create chat history
var history = new ChatHistory();
history.AddUserMessage("Can you help me write an email for my boss?");

// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
    history,
    executionSettings: openAIPromptExecutionSettings,
    kernel: kernel
);
import asyncio
import logging

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_call_behavior import FunctionCallBehavior
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():
    # Initialize the kernel
    kernel = Kernel()

    # Add Azure OpenAI chat completion
    kernel.add_service(AzureChatCompletion(
        deployment_name="your_models_deployment_name",
        api_key="your_api_key",
        base_url="your_base_url",
    ))

    # Set the logging level for  semantic_kernel.kernel to DEBUG.
    logging.basicConfig(
        format="[%(asctime)s - %(name)s:%(lineno)d - %(levelname)s] %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
    logging.getLogger("kernel").setLevel(logging.DEBUG)

    # Add a plugin (the EmailPlugin class is defined above)
    kernel.add_plugin(
        EmailPlugin(),
        plugin_name="Email",
    )

    chat_completion : AzureChatCompletion = kernel.get_service(type=ChatCompletionClientBase)

    # Enable planning
    execution_settings = AzureChatPromptExecutionSettings(tool_choice="auto")
    execution_settings.function_call_behavior = FunctionCallBehavior.EnableFunctions(auto_invoke=True, filters={})

    # Create a history of the conversation
    history = ChatHistory()
    history.add_user_message("Can you help me write an email for my boss?")

    result = (await chat_completion.get_chat_message_contents(
        chat_history=history,
        settings=execution_settings,
        kernel=kernel,
        arguments=KernelArguments(),
    ))[0]
    print(result)

# Run the main function
if __name__ == "__main__":
    asyncio.run(main())

セマンティック カーネルを使用した計画の詳細については、 計画に関する記事を参照してください

ペルソナ: エージェントにジョブの説明を提供する

ほとんどの場合、プラグインを使用して LLM の組み込みの計画機能を使用するだけでエージェントを構築できますが、ドメイン固有のエージェントをさらに構築する場合は、エージェントにペルソナを追加できます。

ペルソナとは、エージェントに提供する指示であり、ユーザーが必要な役割をより効果的に実行できるようにします。 最も簡単に言えば、ペルソナは AI に対して、丁寧に指示したり、必要に応じて明確化を求めたり、特定の役職 (顧客サービス担当者など) としてのロールプレイを求めたりすることができます。

ただし、エンタープライズ シナリオの場合は、エージェントにさらに詳細な手順を提供することが必要な場合があります。 たとえば、特定のルールに従うようにエージェントに指示したり、アクションを実行する前に承認を求めたり、AI がタスクを完了できない場合は人間にエスカレートしたりできます。

エージェントにペルソナを提供するには、ペルソナを説明するチャット履歴にシステム メッセージを事前に入力するだけです。 その後、AI はこのペルソナを使用して、ユーザーとの対話をガイドします。

// Create chat history
ChatHistory chatMessages = new ChatHistory("""
    You are a friendly assistant who likes to follow the rules. You will complete required steps
    and request approval before taking any consequential actions. If the user doesn't provide
    enough information for you to complete a task, you will keep asking questions until you have
    enough information to complete the task.
    """);
chatMessages.AddUserMessage("Can you help me write an email for my boss?");

// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
    history,
    executionSettings: openAIPromptExecutionSettings,
    kernel: kernel
);
# Create a history of the conversation
history = ChatHistory(system_message="""
    You are a friendly assistant who likes to follow the rules. You will complete required steps
    and request approval before taking any consequential actions. If the user doesn't provide
    enough information for you to complete a task, you will keep asking questions until you have
    enough information to complete the task.
    """)
history.add_user_message("Can you help me write an email for my boss?")

# Get the response from the AI
result = (await chat_completion.get_chat_message_contents(
    chat_history=history,
    settings=execution_settings,
    kernel=kernel,
    arguments=KernelArguments(),
))[0]

効果的なペルソナの作成の詳細については、 personas の記事を参照してください

要素の統合

エージェントの主要な構成要素を理解したので、それらを組み合わせて最初のエージェントを構築できるようになりました。 そのためには、プラグイン、プランナー、ペルソナを使用して Kernel オブジェクトを初期化します。 その後、 Kernel オブジェクトを使用してプランを生成し、そのプランを実行します。

// Create the kernel
var builder = Kernel.CreateBuilder();
builder.Services.AddLogging(c => c.SetMinimumLevel(LogLevel.Trace).AddDebug());
builder.Services.AddChatCompletionService(kernelSettings);
builder.Plugins.AddFromType<EmailPlugin>();
Kernel kernel = builder.Build();

// Retrieve the chat completion service from the kernel
IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

// Create the chat history
ChatHistory chatMessages = new ChatHistory("""
    You are a friendly assistant who likes to follow the rules. You will complete required steps
    and request approval before taking any consequential actions. If the user doesn't provide
    enough information for you to complete a task, you will keep asking questions until you have
    enough information to complete the task.
    """);

// Start the conversation
while (true)
{
    // Get user input
    System.Console.Write("User > ");
    chatMessages.AddUserMessage(Console.ReadLine()!);

    // Get the chat completions
    OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
    {
        FunctionCallBehavior = FunctionCallBehavior.AutoInvokeKernelFunctions
    };
    var result = chatCompletionService.GetStreamingChatMessageContentsAsync(
        chatMessages,
        executionSettings: openAIPromptExecutionSettings,
        kernel: kernel);

    // Stream the results
    string fullMessage = "";
    await foreach (var content in result)
    {
        if (content.Role.HasValue)
        {
            System.Console.Write("Assistant > ");
        }
        System.Console.Write(content.Content);
        fullMessage += content.Content;
    }
    System.Console.WriteLine();

    // Add the message from the agent to the chat history
    chatMessages.AddAssistantMessage(fullMessage);
}
import asyncio

from semantic_kernel import Kernel
from semantic_kernel.contents.chat_history import ChatHistory
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.connectors.ai.function_call_behavior import FunctionCallBehavior
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.connectors.ai.open_ai.prompt_execution_settings.azure_chat_prompt_execution_settings import (
    AzureChatPromptExecutionSettings,
)
from semantic_kernel.functions.kernel_arguments import KernelArguments

async def main():
    # Initialize the kernel
    kernel = Kernel()

    # Add Azure OpenAI chat completion
    kernel.add_service(AzureChatCompletion(
        deployment_name="your_models_deployment_name",
        api_key="your_api_key",
        base_url="your_base_url",
    ))

    # Add a plugin (the EmailPlugin class is defined above)
    kernel.add_plugin(
        EmailPlugin(),
        plugin_name="Email",
    )

    chat_completion : AzureChatCompletion = kernel.get_service(type=ChatCompletionClientBase)

    # Enable planning
    execution_settings = AzureChatPromptExecutionSettings(tool_choice="auto")
    execution_settings.function_call_behavior = FunctionCallBehavior.EnableFunctions(auto_invoke=True, filters={})

    # Create a history of the conversation
    history = ChatHistory()

    # Start the conversation
    while True:
        # Get user input
        user_input = input("User > ")
        history.add_user_message(user_input)

        # Get the response from the AI
        result = (await chat_completion.get_chat_message_contents(
            chat_history=history,
            settings=execution_settings,
            kernel=kernel,
            arguments=KernelArguments(),
        ))[0]

        # Print the response
        print("Assistant > " + str(result))
        history.add_assistant_message(str(result))

# Run the main function
if __name__ == "__main__":
    asyncio.run(main())

エージェントを試す

これでプログラムが完了したので、テストの実行を行うことができます。 gpt-4 モデルを使用している間のエージェントとの会話例を次に示します。

ロール メッセージ
🔵User 上司にメールを書くのを手伝っていただけますか?
🔴アシスタント もちろん、上司にメールを書いていただけると嬉しいです。 詳細をお知らせください。 具体的には、私は知る必要があります:
1. 電子メールのトピックまたは目的。
2. 上司のメールアドレス。
🔵User 私は彼女に先月の売上の更新を与えたい。 私は彼女と共有したいレコードの束を破ったが、我々はX4321モデルを販売する挑戦を持っていました。
🔴アシスタント それは電子メールの素晴らしいトピックのように聞こえます。 上司のメールアドレスをお知らせください。
🔵User もちろんです。 これは sarah@contoso.com
🔴アシスタント 完了。 メールのプランを次に示します。
1. 件名とあいさつ文をクリアして開始します: 件名行は、"先月の売上の更新と X4321 モデルチャレンジ" など、簡潔で有益である必要があります。 「親愛なるサラ」のようなプロの挨拶でメールを開始します。
2. 個別の段落の高い実績と課題:記録的な実績に関する肯定的なニュースから始めます。 成功を示すために、特定のデータと例を使用します。 次に、X4321 モデルを使用して課題に移行します。 問題を正直に明確にするだけでなく、これらの課題に対処するための潜在的な解決策や手順を提案します。
3. 行動喚起とプロフェッショナルクロージングで終わる: 何らかのアクションを行う必要がある場合は、メールの末尾に明確に記載してください。 これは、彼女の入力、さらに話し合う会議、またはその他の関連するアクションを求めている可能性があります。 メールをプロフェッショナルに閉じ、"Best regards" や "Sincerely" などの語句の後に名前を付けます。
メールを送信する前に、文法上のエラーや不明な文を忘れずに校正してください。 これにより、メッセージがプロフェッショナルでわかりやすいものになります。
これらの手順に基づいてメールの下書きを作成しますか?
🔵User はいお願いします!
🔴アシスタント 確かに、ここで説明した手順に基づく下書きを次に示します。
件名: 先月の売上および X4321 モデルチャレンジの更新
親愛なるサラ、
私はこの電子メールがうまく見つけることを願っています。 私は過去1ヶ月間の販売実績を更新するために書いている。
先月、複数の売上記録を破ったことを報告させて頂き、嬉しい思いをしております。 私たちのチームの努力と努力が報われ、売上全体の数字が大幅に増加しました。 [ここでは、破損したレコードの特定のデータまたは例を追加できます]
ただし、X4321 モデルではいくつかの課題に直面しました。 私たちの努力にもかかわらず、このモデルの販売は私たちの期待を満たしませんでした。 [ここでは、直面する課題の詳細を説明できます]
現在、X4321モデルの販売改善戦略に取り組んでいます。 [ここでは、問題に対処するために必要な特定の手順または計画について説明できます]
この件に関するご意見をお待ちしています。 必要に応じて、会議のスケジュールを設定して、これについてさらに話し合うことができます。
引き続きご支援、ご指導を賜り、ありがとうございます。
よろしくお願いいたします
[自分の名前]
この下書きを確認し、送信する前に変更を加えるかどうかをお知らせください。
🔵User 収益を 20% 増やしたことを追加できますか? また、ほとんどのお客様がY5000モデルにアップグレードして以来、X4321も売れなかったことを共有することもできますが、これは収益の増加に役立ったので、それほど悪くはありません。
🔴アシスタント 絶対に、更新されたドラフトは次のとおりです。
件名: 先月の売上および X4321 モデルチャレンジの更新
親愛なるサラ、
私はこの電子メールがうまく見つけることを願っています。 私は過去1ヶ月間の販売実績を更新するために書いている。
先月、複数の売上記録を破ったことを報告させて頂き、嬉しい思いをしております。 チームの努力と努力が報われ、全体の収益が大幅に20%増加しました。 この成長は、当社のチームのコミットメントと製品の品質の証です。
ただし、X4321 モデルではいくつかの課題に直面しました。 私たちの努力にもかかわらず、このモデルの販売は私たちの期待を満たしませんでした。 興味深いことに、ほとんどのお客様は Y5000 モデルにアップグレードされ、収益の増加に大きく貢献しました。 私たちはすべてのモデルの売上向上を目指していますが、この顧客の好みの変化は完全に否定的ではありません。
現在、この傾向を分析し、将来の販売に活用するための戦略に取り組んでいます。 あなたの洞察と提案は非常に高く評価されます。
引き続きご支援、ご指導を賜り、ありがとうございます。
よろしくお願いいたします
スティーブン
この更新された下書きを確認し、送信する前に変更を加えるかどうかをお知らせください。
🔵User ステファンと一緒に署名してください。その後、先に進んでサラに送ることができます
🟢ツール メールが送信されました。
🔴アシスタント メールが Sarah に送信されました。 他にサポートが必要な場合は、お気軽にお問い合わせください。

次のステップ

最初のエージェントを構築したので、セマンティック カーネルのさまざまなコンポーネントについて詳しく調べることができるようになりました。

セクション 説明
カーネル コア カーネル オブジェクトの設定と使用
AI サービス さまざまな AI サービスの統合と使用
プラグイン ネイティブ コードと API をセマンティック カーネルと統合する
プランナー AI エージェントが複数ステップのタスクを完了できるようにする
ペルソナ AI エージェントをカスタマイズして他のユーザーとの共同作業を強化する