以前の記事「TeamsにChatGPTを組み込むことで起こる業務変革4選」では、Microsoft TeamsにChatGPTを組み込むことで生じる業務変革について説明しました。この度は、具体的な実装方法に焦点を当て、どのようにしてMicrosoft TeamsにChatGPTを組み込むかについて解説します。
本記事では、Microsoft Graph APIとPythonを活用し、Microsoft Teams内でChatGPTを活用する手順について説明します。この実装を通じて、社内コミュニケーションや業務効率の向上を実現することができます。
しかし、実装にはいくつかの課題や困難が伴います。それらに対処するために、適切なリソースやツールを利用することが重要です。本記事では、これらの課題にどのように対処するか、実践的な解決方法についても紹介していきます。
まず、実装にあたってMicrosoft Graph APIを利用する際の注意点やドキュメントの入手方法について触れます。その後、実際の実装プロセスについて、手順を追って説明していきます。また、途中で遭遇するであろう課題や問題に対処するためのアプローチについても取り上げます。
最後に、実装後に期待できる効果や改善点について検証し、今後の展望について言及します。これにより、Microsoft TeamsにChatGPTを組み込むことが、企業や組織にとってどのような価値をもたらすか、具体的なイメージを持つことができるでしょう。
それでは、次の章から具体的な手順について説明していきます。本記事を参考に、Microsoft TeamsにChatGPTを組み込み、業務効率やコミュニケーションの向上を実現しましょう。
はじめに
本記事では、OpenAI APIを利用して、Microsoft TeamsにChatGPTを組み込む方法を解説します。これにより、社内の様々な業務でChatGPTが役立ちます。以下の2つの内容について説明します。 なお、実際のコードを含めると非常に長くなるため、流れを解説します。- Microsoft Graphを使うための準備
- プログラム概要
- TeamsからChatGPTの回答をユーザーに対して投稿
- Teamsに投稿される事をトリガーに処理実施
- Teamsに投稿された内容を取得
- 回答への返信に対して更に投稿
Microsoft Graphを使うためのAzure AD設定手順
Microsoft Graph APIを活用するためには、まずAzure Active Directory (Azure AD) でアプリケーションを登録し、適切な設定を行う必要があります。本章では、Azure ADの設定手順をわかりやすく説明します。![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fazure-recipe.kc-cloud.jp%2Fwp-content%2Fuploads%2F2023%2F04%2Fgraph.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=eaa02304b09130dfd8ceff63786bcfc9)
- Azureポータルへのログイン Azure ADの設定を行うには、まずAzureポータル (https://portal.azure.com) にアクセスし、Microsoftアカウントでログインしてください。
- Azure Active Directoryの選択 Azureポータルの左側のメニューから、「Azure Active Directory」をクリックしてください。
- アプリの登録 「アプリの登録」タブを選択し、画面右上の「新しい登録」ボタンをクリックします。
- アプリケーションの詳細を入力 以下の情報を入力し、画面下部の「登録」ボタンをクリックします。
-
- 名前: アプリケーションの名前を入力(例: "TeamsChatGPTIntegration")
- サポートされているアカウントの種類: 組織ディレクトリのアカウント(例: "この組織ディレクトリ専用 - {your-organization-name} のみ")
- リダイレクトURI: 必要に応じてリダイレクトURIを設定(例: "https://localhost")
- APIアクセス権の付与 アプリ登録後、「APIアクセス権」タブを選択し、「APIアクセス権の追加」ボタンをクリックします。
- APIアクセス権の選択 「APIの選択」ウィンドウで、「Microsoft Graph」を選択し、「選択」ボタンをクリックします。
- アクセス権の選択 「アクセス権の選択」ウィンドウで、「デリゲートされたアクセス権」または「アプリケーションアクセス権」タブを選択し、必要なアクセス権を選択して「追加」ボタンをクリックします。
- 「デリゲートされたアクセス権」として以下を付与
- Chat.Read(チャットの読み取り)
- Chat.ReadWrite(チャットの読み書き)
- ChannelMessage.Read.All(すべてのチャネルメッセージの読み取り)
- ChannelMessage.Send(チャネルメッセージの送信)
- 設定の保存 「APIアクセス権」タブに戻り、画面下部の「保存」ボタンをクリックして設定を保存します。
- 「デリゲートされたアクセス権」として以下を付与
- クライアントIDとシークレットの取得 「概要」タブを選択し、以下の情報をメモしておきます。
-
- アプリケーション (クライアント) ID: これは、アプリケーションを一意に識別するIDです。後でAPIリクエストを行う際に使用します。
- ディレクトリ (テナント) ID: これは、Azure ADテナントを一意に識別するIDです。後でAPIリクエストを行う際に使用します。
- クライアントシークレットの生成 「証明書とシークレット」タブを選択し、「新しいクライアントシークレット」ボタンをクリックします。
- クライアントシークレットの詳細を入力 以下の情報を入力し、画面下部の「追加」ボタンをクリックします。
-
- 説明: クライアントシークレットの説明(例: "ChatGPT Integration Secret")
- 有効期間: シークレットの有効期間を選択(例: "1年間")
- クライアントシークレットの取得 生成されたクライアントシークレットの値をメモしておきます。後でAPIリクエストを行う際に使用します。注意: この値は、生成直後にしか表示されません。ページを離れると取得できなくなるため、必ずメモしておいてください。
Pythonを使ったTeams⇔OpenAI実装
Subscriptionを登録することで、指定したチャネルの更新情報を取得しています。Subscriptionの有効期限は1時間程度しかなく頻繁に更新する必要があります。他には一定時間間隔で取得する方法もありますが1回あたり0.1円(1ヶ月で4000円以上)発生し、さらにメッセージ取得分なども含めると数万円発生する可能性が高いです。また、Subscriptionの更新をするためにはAccess Tokenが必要ですが、同じく1時間程度しか有効期限がないための対応方法が見つかりませんでした。acquire_token_by_authorization_code
メソッドの戻り値にRefresh tokenが含まれていることがわかり、Refresh tokenを使ってAccess Tokenを更新させることで、無事動作させることが出来ました。
- Access tokenの取得
msal
ライブラリを利用して、Azure ADからAccess tokenを取得します。msal.ConfidentialClientApplication
を使用して、アプリケーションのインスタンスを作成し、acquire_token_by_authorization_code
メソッドを呼び出すことで、Access tokenとRefresh tokenが取得できます。 - Access tokenの更新 Access tokenは通常1時間の有効期限があります。そのため、
refresh_token
を使って定期的にAccess tokenを更新することが必要です。 - Microsoft Graphのsubscription Microsoft Graph APIを使って、Teamsチャネルの更新情報を取得するために、subscriptionを作成します。これにより、指定したチャネルで新しいメッセージが投稿されるたびに、通知が送られます。
- 通知の受信 設定したWebhookのエンドポイントに通知が送られます。通知が届いたら、チャネルからメッセージを取得するために、Microsoft Graph APIを使って、そのメッセージの詳細を取得します。
- ChatGPTに投げる 取得したメッセージを、GPT-4に投げて解析や回答を求めます。OpenAI APIを使って、メッセージをGPT-4に送信し、生成された結果を受け取ります。
- 結果をTeamsに投稿 GPT-4から受け取った結果を、Microsoft Teamsのチャネルに投稿します。Microsoft Graph APIを使って、チャネルにメッセージを投稿するリクエストを行います。
さらにユーザーからの投稿に対して、投稿が届いたことを確認するいいね「👍」でのリアクション、返信に対してさらに回答などを組み込むことでユーザビリティをあげる事が出来ます。