Microsoft 365 Copilot System と Semantic Kernel による実装

Microsoft は 3月16日、「[Microsoft 365 Copilot](https://news.microsoft.com/ja-jp/2023/03/17/230317-introducing-microsoft-365-copilot-your-copilot-for-work/)」を発表しました。Microsoft 365 Copilot は、これまで皆さんがお使いの Word、Excel、PowerPoint、Outlook、Teams と大規模言語モデル (LLM) のパワー、Microsoft Graph や Microsoft 365 アプリ内のデータを組み合わせて、これまでになかった体験ができるようになります。

[公式動画](https://www.youtube.com/watch?v=E5g20qmeKpg)でも紹介されているように、Microsoft 365 Copilot の中枢は Copilot System と呼ばれるオーケストレーターです。勘のいい方はすでに気づかれているかと思いますが、このアーキテクチャ、[Semantic Kernel](https://qiita.com/nohanaga/items/430b59209b02c298ef2a) で簡単に実現できるじゃないか・・・と。

# 1. Copilot System

ではまず Copilot System の処理の流れについて簡単に紹介しましょう。システムの構成要素は Copilot System、Microsoft 365 Apps、[Microsoft Graph](https://learn.microsoft.com/graph/overview)、LLM(GPT-4) です。

# 1.1. 前処理 Grounding
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/cfff96fb-beed-eb40-e270-3df762c45670.png)

Copilot System はまず、Microsoft 365 の Word、Excel、PowerPoint、Outlook、Teams 等からユーザーのプロンプト入力（指示）を受け取ります。その指示はプロンプトとしてそのまま GPT-4 へ送られるのではなく、Microsoft Graph を通じて必要なコンテキストを付加します。これを Grounding と言い、例えばメールの返信プロンプトであれば、自分のメールアカウント情報などです。

## 1.2. プロンプトを LLM へ送信
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/c4efc353-6426-f15e-b8cf-26851b2a5ef6.png)

Grounding によってコンテキストが付加されたプロンプトは、Copilot System を通じて LLM に送信されます。

## 1.3. 後処理

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/a00f3955-da69-f454-560e-acf7d9f1e0ff.png)

Copilot System は、LLM からの応答を受け取り、後処理を行います。この後処理には、Microsoft Graph の追加の呼び出し、責任ある AI チェック、セキュリティ、コンプライアンス、プライバシーのレビュー、Microsoft 365 アプリ操作のためのコマンド生成などが含まれます。 

## 1.4. レスポンス＋アプリ操作実行
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0faabaef-0874-cbc3-98b0-8c0c9d6f4eea.png)

後処理工程を通過した処理結果とアプリ操作コマンドが Microsoft 365 の呼び出し元アプリへ返却されます。

アプリ操作コマンドは例えば、PowerPoint に図を追加したり、文字サイズを整えたりといった機能の操作を行うための内部のコマンドです。

![008_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/e2db67c1-8f0c-55fc-3b0a-e9c13e0a6f64.png)

# 2. Semantic Kernel での実装
さて、このようなアーキテクチャを自分の組織のシステムに対して実装するにはどのようにしたらよいでしょうか。

## 2.1. Grounding
Semantic Kernel における Grounding の例では、[私が動画](https://youtu.be/tFgqdHKsOME?t=4687)で解説しているように、**デフォルトでビルトイン**されている Microsoft Graph コネクターを通じて以下のようなプロンプトにコンテキスト情報を付加します。[コネクター](https://qiita.com/nohanaga/items/430b59209b02c298ef2a#%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%83%BC)は[スキル](https://qiita.com/nohanaga/items/430b59209b02c298ef2a#%E3%82%B9%E3%82%AD%E3%83%AB)の一部ですが、以下では分けて説明しています。

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/adfd5553-126a-99ac-487b-8766a277005e.png)

また、[メモリー](https://qiita.com/nohanaga/items/430b59209b02c298ef2a#%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC)機能を使ってインメモリ Key-value ストアやベクトルデータベースから記憶や事前知識を検索して付加することも可能です。もちろんスキルやコネクターはご自分でカスタマイズが可能です。Azure Cognitive Search とつなげてもいいですね。

## 2.2. Planning
Business Chat のような Microsoft 365 アプリやユーザーデータ (カレンダー、メール、チャット、ドキュメント、ミーティング、連絡先) を横断して機能するようなアプリの場合、バックエンドにユーザーの質問意図を判断して、タスクに分解し、アクションと紐づけるプランナーの機能が必要になってきます。
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/df951ee4-218d-aaad-4b44-5988ce20dfa5.png)

「Mona との次の会議の準備を手伝ってくれ！製品のリード タイムに関連することを教えて！」 (“Help me prep for my upcoming meeting with Mona and bring up anything related to product lead times”) 的な自然言語のプロンプト (指示) を入力すると、会議、メール、チャットのスレッドに基づいて、ステータスアップデートが生成されます。

Semantic Kernel にはユーザーからの複雑な指示をタスクに分解するための[プランナー](https://qiita.com/nohanaga/items/430b59209b02c298ef2a#%E3%83%97%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC)機能が搭載されています。プランナーを使って、企業内のシステムのそれぞれの機能をスキルにマッピングしましょう。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/bee6ea9a-3ab1-e343-8361-984fa073c280.png)
プランナーの実体は GPT-3 によるプロンプトの処理によって実現しており、詳しい内部動作については[動画](https://youtu.be/tFgqdHKsOME?t=4687)の解説を見ていただくとして、スキルの開発方法については[こちらの記事](https://qiita.com/nohanaga/items/430b59209b02c298ef2a)も参照ください。

![スクリーンショット 2023-04-28 17.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/12ceec5d-582e-e68e-092b-22b909c818fe.png)

# Build 2023 上記のアーキテクチャを「プラグイン」として実装できるようになりました
https://learn.microsoft.com/microsoftteams/platform/copilot/how-to-extend-copilot

[Microsoft 365 Copilot 用のプラグイン](https://developer.microsoft.com/en-us/microsoft-teams/ai)は、早期アクセス プレビュー段階であり、参加するには[開発者プレビュープログラム](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR06na7ADVcFBoFXEJ5M8YD1UNkdQODE5VDNKOUQ2UlBSVUJJRlJDVktTVS4u)への申請が必要です。Microsoft 365 Copilot では、Teams メッセージ拡張機能や [Microsoft Graph コネクタ](https://developer.microsoft.com/en-us/graph/connectors)が提供されます。

# このアーキテクチャは「Copilot stack」フレームワークとして整備されました
https://qiita.com/nohanaga/items/c3e92c9adeca7c84a8d5

# さいごに
LLM をシステムのオーケストレーションに使用する例について解説しました。Semantic Kernel を使うと企業内の様々なシステムをオーケストレーションするためのコアをスピーディに開発可能です。ぜひ使用するモデルはエンタープライズセキュリティが充実した [Azure OpenAI Service](https://azure.microsoft.com/products/cognitive-services/openai-service) をご利用ください。

https://qiita.com/nohanaga/items/430b59209b02c298ef2a

https://github.com/microsoft/semantic-kernel