LAC WATCH

セキュリティとITの最新情報

RSS

株式会社ラック

メールマガジン

サイバーセキュリティや
ラックに関する情報をお届けします。

Facebook X Instagram
ラックピープル | 

マルチエージェント&グループチャットで広がるAI活用の最前線

こんにちは、AIエンジニアリンググループでAIを活用した新規案件創出に携わっている高畑です。

本記事では、AIや最新技術に関心のある開発者の皆さまに向けて、Microsoftが開発中のオープンソースAIフレームワーク「Semantic Kernel」をご紹介します。特に、Semantic Kernelの中でも注目される「エージェント機能」と「エージェントグループチャット機能」にフォーカスし、具体的なサンプルコードを交えながら解説します。

近年、AIを活用したサービスやプロダクトの開発現場では、生成AIや大規模言語モデル(LLM)を既存システムにどのように組み込むかが、大きな課題となっています。筆者も新規案件の検討やプロトタイピングの過程で、Semantic Kernelの最新動向や正しい活用方法を追いかけるのに苦労してきました。

そこで本記事では、筆者が実際に動作確認した「エージェント機能」、「グループチャット機能」に関するサンプルコードの一部を交えながら、Semantic Kernelの特徴やその活用イメージについてわかりやすく解説します。特に、複数のAIエージェントが協調しながらタスク解決を目指す「グループチャット機能」に興味がある方にとって、効率よく最初の一歩を踏み出せる内容となっています。

Semantic Kernelとは

Semantic Kernel(セマンティックカーネル)は、Microsoftが開発しているオープンソースのAIフレームワーク(SDK)です。このフレームワークは、ChatGPTなどの大規模言語モデル(LLM)と、従来のプログラムロジックや外部サービス(API)を柔軟に連携させることを目的としています。

Semantic Kernelを利用することで、AIによる自然言語処理(チャットボット、要約、質問応答など)と、独自の業務ロジックや外部システム連携をシームレスに統合したアプリケーションを簡単に開発できます。例えば、「AIがユーザーからの問い合わせに自動応答し、必要に応じて社内データベースやインターネット検索も活用する」といった高度なシナリオも、簡潔なコードで実装可能です。

Semantic Kernelの主な特徴

  • 大規模言語モデル(LLM)と既存プログラムの統合
    AIによる柔軟な自然言語処理と、従来型の制御やデータ処理を組み合わせて利用できます。
  • プラグイン機能
    外部APIやサービス、自作のビジネスロジックなどを「プラグイン」として追加でき、拡張性の高いアプリケーション構築が可能です。
  • マルチエージェント対応
    複数のAIエージェントが役割分担し、協調してタスクを解決する高度な対話システムも構築できます。
  • マルチプログラミング言語対応
    C#やPythonなど複数のプログラミング言語で利用でき、開発者のスキルやシステム要件に合わせて選択可能です。

このように、Semantic KernelはAIの可能性を最大限に活用した次世代アプリケーションの開発を、より手軽かつ強力にサポートします。

Semantic Kernelのマルチエージェント機能

Semantic Kernelの大きな特徴のひとつが「エージェント機能」です。エージェントとは、特定の役割や知識を持ち、ユーザーや他のシステムと対話しながらタスクを実行するAIコンポーネントです。

例えば、AIによる文章作成支援を行う場合、次のような複数のエージェントを設計できます。

  • リサーチエージェント:外部情報を収集・要約する
  • ライティングエージェント:文法やスタイルに沿って文章を作成する
  • レビューエージェント:生成された文章を校正・フィードバックする

このように、用途に応じて個々のエージェントを設計し、それぞれに必要な知識や振る舞いを持たせることができます。

エージェントは単独でも活用できますが、Semantic Kernelではさらに発展的な使い方として、複数のエージェントが協調して動作する「グループチャット機能」も提供されています。

グループチャット機能とエージェントの協調

グループチャット機能では、複数のエージェントが1つのグループ内で役割分担しながら、ユーザーの複雑な要望や問題に対応できます。各エージェントは自分の専門分野で意見や提案を行い、必要に応じて他のエージェントと情報をやりとりしながら、最適な解決策を導き出します。

例えば、ユーザーが「冷蔵庫の余り食材や予算に配慮した献立を考えてほしい」といった複雑な指示を出した場合でも、レシピ担当・健康管理担当・家計管理担当など複数のエージェントが連携し、それぞれの専門性を活かして意見を出し合い、最終的にユーザーに最適な提案を返すことができます。

サンプルコード

以下に、グループチャット機能を利用したC#のサンプルコードを掲載します。このサンプルは、「レシピ生成」「健康管理」「家計管理」の3つの役割を持つエージェントが、ユーザーからの要望(例:冷蔵庫にある食材、予算など)に応じて協調し、最適な献立提案を行うものです。

サンプルコードの構成

Semantic Kernelの初期化とプラグイン登録

Azure OpenAIへの接続設定と、必要に応じてBing検索プラグインを登録します。これにより、エージェントが外部情報を活用できるようになります。

各エージェントの作成

それぞれのエージェントには「プロンプト(役割・流れ・出力内容)」が与えられており、以下の専門的な応答やレビューができるように設計されています。

  • レシピ生成エージェント(RecipeAgent):ユーザーの要望に応じた献立を生成
  • 健康管理エージェント(HealthAgent):献立を栄養バランスの観点からレビュー
  • 家計管理エージェント(FinancialAgent):献立を材料費の観点からレビュー

エージェントグループチャットの構成

3つのエージェントをグループチャットに登録し、発言の順序(SelectionStrategy)や終了条件(TerminationStrategy)を設定します。

  • ユーザーの入力受付とチャットへの流し込み
    ユーザーからの要望を受け取り、グループチャットに追加します。
  • グループチャットの実行と出力
    各エージェントが順に発言し、最終的にユーザーに最適な提案を返します。
using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Chat;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
using Microsoft.SemanticKernel.Connectors.OpenAI;
 
// Semantic Kernelの初期化を行います。
IKernelBuilder kernelBuilder = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(
        deploymentName: "xxxx Deployment name xxxx",
        endpoint: "xxxx AI Foundry Endpoint xxxx",
        credentials: new DefaultAzureCredential()
    );
 
// Kernelインスタンスを作成します。
Kernel kernel = kernelBuilder.Build();
 
// Bing検索プラグインを登録します。
// BingPluginの詳細は割愛しますが、BingPluginを利用する前提のプロンプトになっているため、プラグインがない場合はプロンプト内の指示を調整してください。
kernel.Plugins.AddFromObject(new BingPlugin());
 
// レシピ生成エージェント(RecipeAgent)を作成します。
#pragma warning disable SKEXP0110
ChatCompletionAgent recipeAgent = new ChatCompletionAgent
{
    Name = "RecipeAgent",
    Instructions = $$$"""
        ## 目的
        あなたは料理の献立の専門家です。
        グループチャットに参加し、ユーザーの要望に沿った料理の献立を生成してください。
 
        ## グループチャットにはあなたの他に以下のエージェントが参加しています。
        User : 献立生成の条件を提示します。この条件を満たす献立を生成してください。
        HealthAgent : あなたの生成した献立に対し、健康管理の面から修正点を提示します。HealthAgent の提示する献立の修正点を取り入れた献立を生成してください。
        FinancialAgent : あなたの生成した献立に対し、家計管理の面から修正点を提示します。FinancialAgent の提示する献立の修正点を取り入れた献立を生成してください。
 
        ## 会話履歴
        {{$_history_}}
 
        ## 出力内容
        1. 献立を出力。それ以外の情報は一切出力しないこと。
        2. 献立毎に使用する食材と調味料の量を出力。それ以外の情報は一切出力しないこと。
        3. 新規購入が必要な食材の量を出力。それ以外の情報は一切出力しないこと。
        4. 味を際立たせる上での調理の時に気をつけるポイントや盛り付け方法などの調理の上のアドバイスがあれば出力。それ以外の情報は一切出力しないこと。
    """,
    InstructionsRole = AuthorRole.Assistant,
    Kernel = kernel,
    Arguments = new(new AzureOpenAIPromptExecutionSettings
    {
        // BingPluginを利用できるように設定します。
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
        Temperature = 0.7,
    }),
};
 
// 健康管理エージェント(HealthAgent)を作成します。
ChatCompletionAgent healthAgent = new ChatCompletionAgent
{
    Name = "HealthAgent",
    Instructions = $$$"""
        ## 目的
        あなたは食材の栄養素の専門家です。
        グループチャットに参加し、他のエージェントと共にユーザーのための栄養バランスの良い料理の献立を生成してください。
 
        ## グループチャットにはあなたの他に以下のエージェントが参加しています。
        User : 献立生成の条件を提示します。この条件を満たす献立を生成してください。
        RecipeAgent : 料理の献立と新規購入が必要な食材を生成します。
        FinancialAgent : RecipeAgentが提示した献立を家計管理の面から条件を提示します。
 
        ## ポイント
        RecipeAgent が生成した献立を分析し、以下の栄養素が十分かつ過剰でないかを確認してください。
        エネルギー、タンパク質、脂質、炭水化物、食物繊維、カリウム、カルシウム、鉄、亜鉛、ビタミンA、ビタミンB1、ビタミンB2、ビタミンC、ビタミンD、ビタミンE、葉酸、食塩相当量
 
        ## 会話履歴
        {{$_history_}}
 
        ## 出力内容
        1. 献立1人分の栄養素分析結果を出力。それ以外の情報は一切出力しないこと。
        2. RecipeAgentに伝える献立の栄養面の修正依頼を出力。献立の修正依頼が見つからない場合は「なし」と出力。それ以外の情報は一切出力しないこと。
        3. 調理の時に気をつけるポイントや食べる順序などの健康上のアドバイスがあれば出力。それ以外の情報は一切出力しないこと。
    """,
    InstructionsRole = AuthorRole.Assistant,
    Kernel = kernel,
    Arguments = new(new AzureOpenAIPromptExecutionSettings
    {
        // BingPluginを利用できるように設定します。
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
        Temperature = 0.7,
    }),
};
 
// 家計管理エージェント(FinancialAgent)を作成します。
ChatCompletionAgent financialAgent = new ChatCompletionAgent
{
    Name = "FinancialAgent",
    Instructions = $$$"""
        ## 目的
        あなたは家計管理の専門家です。
        グループチャットに参加し、他のエージェントと共にユーザーのために家計に負担の少ない料理の献立を生成してください。
 
        ## グループチャットにはあなたの他に以下のエージェントが参加しています。
        User : 献立生成の条件を提示します。この条件を満たす献立を生成してください。
        RecipeAgent : 料理の献立と新規購入が必要な食材を生成します。
        HealthAgent : RecipeAgentが提示した献立を健康管理の面から条件を提示します。
 
        ## ポイント
        新規購入が必要な食材の本日の販売価格をBingPluginを使用して毎回必ずインターネットから入手してください。
        その合計金額が、ユーザーの提示する予算以内かを確認してください。
 
        ## 会話履歴
        {{$_history_}}
 
        ## 出力内容
        1. 新規購入が必要な食材の価格を出力。それ以外の情報は一切出力しないこと。
        2. 新規購入が必要な食材の合計金額を出力。それ以外の情報は一切出力しないこと。
        3. RecipeAgentに伝える献立の金銭面の修正依頼を出力。献立の修正依頼が見つからない場合は「なし」と出力。それ以外の情報は一切出力しないこと。
        4. 保存食の利用や、食材の保存の仕方などの家計管理上のアドバイスがあれば出力。それ以外の情報は一切出力しないこと。
    """,
    InstructionsRole = AuthorRole.Assistant,
    Kernel = kernel,
    Arguments = new(new AzureOpenAIPromptExecutionSettings
    {
        // BingPluginを利用できるように設定します。
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
        Temperature = 0.7,
    }),
};
 
// エージェントグループチャット(AgentGroupChat)を作成し、各エージェントを登録します。
AgentGroupChat agentChat = new AgentGroupChat(recipeAgent ,healthAgent, financialAgent)
{
    ExecutionSettings = new AgentGroupChatSettings
    {
        // エージェントの発言順序を制御する戦略(Strategy)を設定します。
        SelectionStrategy = new SequentialSelectionStrategy(),
        // 会話終了条件を判定する戦略(Strategy)を設定します。
        TerminationStrategy = new KernelFunctionTerminationStrategy(
            kernel.CreateFunctionFromPrompt($$$"""
                会話履歴を確認し、以下の条件全てを満たしている場合は「Done」と出力してください。それ以外の場合は「Continue」と出力してください。
 
                ## 条件
                1. 会話履歴を確認し、最新の RecipeAgent の発言の後に HealthAgent と FinancialAgent が発言している。
                2. 会話履歴を確認し、最新の HealthAgent の発言で「献立の修正点がない」としている。
                3. 会話履歴を確認し、最新の FinancialAgent の発言で「献立の修正点がない」としている。
 
                ## 会話履歴
                {{$_history_}}
            """),
            kernel)
        {
            // 終了判定プロンプトの出力結果を解析します。Doneなら終了、それ以外(Continue)なら継続と判定します。
            ResultParser = result =>
            {
                return result.GetValue<string>() == "Done";
            },
            // 会話履歴のうち、直近3件のみを終了判定に渡すように設定します。
            HistoryReducer = new ChatHistoryTruncationReducer(3),
            // 最大12回(4ターン)まで会話を繰り返せるように設定します。
            MaximumIterations = 12,
        }
    },
};
 
// ユーザーからの入力を受け付けます。
Console.Write("User > ");
string userInput = Console.ReadLine();
 
// ユーザーの入力内容をグループチャットに追加します。
agentChat.AddChatMessage(new ChatMessageContent(AuthorRole.User, userInput));
 
// グループチャットを実行し、各エージェントの発言ごとに結果を出力します。
await foreach (ChatMessageContent message in agentChat.InvokeAsync())
{
    // 各エージェントの発言内容を出力します。
    #pragma warning disable SKEXP0001 
    Console.WriteLine($"[{message.AuthorName}]¥n{message.Content}");
}

エージェントグループチャットの主要設定

  • SelectionStrategy
    エージェントの発言順序を制御する仕組みです。本サンプルでは「SequentialSelectionStrategy」を指定しており、エージェントが登録順に順番に発言します。他にも状況や発言内容に応じて動的に順序を決める戦略(Strategy)も用意されています。
  • TerminationStrategy
    チャットの終了条件を定義する仕組みです。本サンプルでは「KernelFunctionTerminationStrategy」を利用しています。これは、会話履歴に基づいて、エージェント間のやり取りが十分に完了し、ユーザーに返すべき最終提案がまとまったかどうかを自動で判定するものです。具体的には、終了判定用のプロンプト(終了条件を明示した指示文)をもとに、Semantic Kernelが会話履歴を分析します。会話が終了条件を満たしていれば「Done」、満たしていなければ「Continue」と出力することで、会話の継続可否をプログラム側で判断します。

また、TerminationStrategyには以下のようなカスタマイズ要素もあります。

  • ResultParser:終了判定プロンプトの出力結果を解析し、「Done」なら終了、「Continue」なら会話継続と判定します。
  • HistoryReducer:会話履歴のうち、何件分を判定エージェントに渡すかを調整します。本サンプルでは直近3件のみを参照しています。
  • MaximumIterations:最大で何ターンまで会話を繰り返すかを制御します。

会話履歴と $_history_

プロンプト内に記載されている「$_history_」は、エージェントが呼び出される際に自動的に会話履歴で置換されます。この会話履歴はエージェントグループチャットが管理しており、ユーザーの発言と各々のエージェントの発言の全てが含まれます。

サンプルコード実行結果

以下にサンプルコードの実行結果の一部を抜粋して掲載します。

レシピ生成エージェントが生成した献立に対し、健康管理エージェントが食物繊維やビタミンDの不足を指摘し、家計管理エージェントがアスパラガスやしじみの購入量についてアドバイスを行っています。それを受けてレシピエージェントが再度献立を生成し、他のエージェントも合意する形で最終的な提案がまとまっています。

※ Semantic Kernel 1.54、LLMモデルにGPT-4.1を使用し、2025年5月下旬に実行しました。

ユーザー入力:
冷蔵庫にニンニク2片、長ネギ1本、キムチ100g、牛乳100mlほど残っています。それを使い切る献立を考えてください。献立は3人分で、現在の旬の食材を使い、ご飯、味噌汁、主菜、副菜、果物で構成してください。新たに購入する食材の材料費は1,000円以内にしてください。なお、白米と調味料は既に揃っています。

レシピ生成エージェントの発言

【献立】
■ご飯
■味噌汁(新玉ねぎ、アスパラガス2本、しじみ150g、長ネギ)
■主菜
・豚肉とキムチの牛乳炒め(豚もも肉200g、キムチ、ニンニク、牛乳)
■副菜
・アスパラガスとそら豆の白和え(アスパラガス2本、そら豆、絹ごし豆腐)
■果物(甘夏)

健康管理エージェントの発言

食物繊維とビタミンDがやや不足気味なので、きのこ類(エリンギやしいたけなど)や青菜(小松菜やほうれん草など)を副菜または味噌汁に追加してください。

家計管理エージェントの発言

食材費合計:約1,140円 合計が1,000円を超過しています。アスパラガスを2本に減らす、しじみを100g程度に減らす、または甘夏を安価な果物に変更するなどの調整をお願いします。

レシピ生成エージェントの発言

【献立】
■ご飯
■味噌汁(新玉ねぎ、アスパラガス1本、しじみ100g、長ネギ、エリンギ1本、小松菜1/4束)
■主菜
・豚肉とキムチの牛乳炒め(豚もも肉150g、キムチ、ニンニク、牛乳)
■副菜
・アスパラガスとそら豆の白和え(アスパラガス1本、そら豆、絹ごし豆腐)
■果物(バナナ3本)

健康管理エージェントの発言

・全体としてバランス良好(700kcal/食、タンパク質・ビタミン・ミネラル・食物繊維も充足)。
・不足・過剰傾向は見られません。

家計管理エージェントの発言

食材費合計:約960円
【献立の金銭面の修正依頼】なし

応用・活用イメージ

今回のサンプルコードでは、余り物を活用する献立を生成しましたが、Semantic Kernelのエージェント協調・グループチャット機能は、さまざまな業務課題やサービス開発に応用可能です。例えば、以下のようなシナリオでの活用が期待できます。

  • 業務支援AIアシスタント
    • -顧客対応AI(問い合わせ受付→回答案作成→法務・品質部門AIによるレビュー→最終回答の自動生成)
    • -社内ナレッジ検索やFAQ自動化
  • 研究・ドキュメント作成支援
    • -リサーチ担当AI、要約担当AI、執筆担当AIが連携してレポートを自動生成
    • -複数の専門分野AIによる論文レビューや校正
  • 業務プロセス自動化・最適化
    • -プロジェクト管理AI(進捗管理→リスク検知→調整案の自動提案)
    • -複数部門(営業・経理・法務)エージェントによる見積もり・契約業務の自動化

Semantic Kernelを活用することで、従来は人手や多部門調整が必要だった業務プロセスも、AIエージェント同士の協調によって効率化・自動化することが可能となります。

さいごに

本記事を通じて、Semantic Kernelの概要や具体的な活用イメージをお伝えしました。最新の情報やサンプルコードを足がかりに、ぜひSemantic Kernelを実際に触れてみてください。まずは公式ドキュメントや本記事のサンプルを動かすことで、新しいAIアプリケーション開発の可能性を実感できるはずです。皆さまの挑戦が、これまでにないユニークなサービスやプロダクトの創出につながることを楽しみにしています。

この記事は役に立ちましたか?

はい いいえ

page top