会社のTeamsからBedrockを呼ぼう！AWS Chatbotの新機能でコード書かずにAIボット作成

# TeamsやSlackから簡単にBedrockを呼べるように！

今週9/17のAWSアップデートで、AWS ChatbotというサービスからAmazon Bedrockのエージェントを簡単に呼び出せるようになりました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/09/aws-chatbot-amazon-bedrock-agent-microsoft-teams-slack/

公式ドキュメントはこちらです。

https://docs.aws.amazon.com/chatbot/latest/adminguide/connect-bedrock-agents.html

今回は多くの会社員が利用しているであろうMicrosoft Teamsから使える、Bedrockの生成AIチャットボットをノーコードで開発する手順を紹介します。

**30分もあれば簡単にできます！**

![スクリーンショット 2024-09-20 23.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fe3155d4-5434-0e10-0edf-d631e1f66649.png)

※Teamsではなく、Slackから使いたい方は以下の森田さん記事を参照ください！

https://qiita.com/moritalous/items/b63d976c2c40af1c39e5


# 1. Teams環境の準備

Teamsには家庭用と法人用の2種類あり、ややこしいですが別サービスとなっています。

今回は会社用Teamsを想定した検証のため、Teams Essentialsを無料試用してみました。

![スクリーンショット 2024-09-20 22.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b6f1247b-b512-4e5b-6157-657eb82fc339.png)

https://www.microsoft.com/ja-jp/microsoft-teams/compare-microsoft-teams-business-options

この記事は会社でTeamsを利用されている読者を想定しているため、Bedrockとチャットする用のチーム＆チャネルのみ用意いただければOKです。

この記事では「Bedrockファンクラブ」というチームに、生成AIチャットボットを追加してみます。

![スクリーンショット 2024-09-20 22.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/458bb48a-b673-f552-68c8-57b1341c6b77.png)


# 2. Bedrockエージェントの作成

AWSアカウントを用意し、マネジメントコンソールにサインインします。

:::note info
今回はバージニア北部リージョンを例として利用します。（東京リージョンでも実施可能）
:::

Amazon Bedrockのコンソールを検索して移動し、左メニュー下部の「モデルアクセス」からAnthropic社のClaude 3 Sonnetを有効化します。

※最新のClaude 3.5 Sonnetも今回利用するBedrockエージェントで利用可能なのですが、メモリー（長期記憶）機能にまだ対応していないため今回はClaude 3 Sonnetを利用します。

![スクリーンショット 2024-09-20 23.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/551b9e3e-0373-05fe-a9e9-a5f32af24507.png)

その後、左メニューの「エージェント」より、Bedrockエージェントを新規作成します。
エージェント名は `teams-chatbot` など好きな名前を付けます。

![スクリーンショット 2024-09-20 23.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/69a35cf4-5143-164e-b49f-b9cc7bce9cf8.png)

エージェントビルダーが開くので、以下のように設定します。

- モデルを選択：`Anthropic > Claude 3 Sonnet`
- エージェント向けの指示：`あなたはTeams用のチャットボットです。ユーザーと同じ言語で、親切に応対してください。`
- Additional Settings > ユーザー入力：`Enabled`（不明点がある際に聞き返してくれる）
- Memory > Enable memory：`Enabled`

他はデフォルトのまま、画面上部の「保存して終了」をクリックします。

画面右側のテスト用サイドバーで「準備」をクリックし、エージェントの動作確認をしてみましょう。

![スクリーンショット 2024-09-20 23.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/114ac09e-7840-2254-5d66-83730a52b228.png)

その後、「エイリアスを作成」します。いわばバージョンのようなものです。
エイリアス名は `v1` など好きな名前を付けましょう。

作成できたら、このエージェントの「エージェントARN」と「エイリアスID」をメモしておきます。


# 3. AWS Chatbotの設定

AWSマネジメントコンソールで「AWS Chatbot」を検索し、Teams用のクライアントを設定します。

![スクリーンショット 2024-09-20 22.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b1657a65-3143-36a1-05f1-fed81022fd4c.png)

AWS Chatbotを接続したいTeamsチャネルのURLを求められるので、取得してコピペします。

![スクリーンショット 2024-09-20 22.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/eec3d2e8-90c3-04bb-5a7b-405d4156d652.png)

うまく設定できると、AWS Chatbotの「設定済みクライアント」にTeamsチャネルが出現します。

![スクリーンショット 2024-09-20 22.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/2da8dc4e-c626-fb14-235e-da82da8abc25.png)

「新しいチャネルを設定」します。

![スクリーンショット 2024-09-20 22.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/0a8d9c98-f051-5c6d-5796-47aa9f1c9599.png)

- 設定名：`bedrock-funclub`
- チャネルURL：先ほどと同じチャネルURL
- アクセス許可
    - ロール名：`bedrock-funclub`
    - ポリシー名：`AmazonBedockFullAccess` を追加

他はデフォルトで「設定」します。

作成したチャネル詳細を開き、「チャネルロール」をクリックして遷移先でBedrock用のポリシーを追加します。

![スクリーンショット 2024-09-20 22.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a4333db4-00b3-91f2-f950-ec0c553fcfc3.png)

IAMロールの設定画面に飛ぶので、「許可を追加 > ポリシーをアタッチ」から `AmazonBedrockFullAccess` を追加しましょう。

![スクリーンショット 2024-09-20 22.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ff9a4212-0bc7-80da-c00a-cfdc6525cfd4.png)

これでAWS Chatbotの設定は完了です。


# 4. Teamsの設定

Teamsから「AWS」アプリを検索して、「Bedrockファンクラブ」チームに追加します。

![スクリーンショット 2024-09-20 22.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b9237e85-74df-e26c-5bbc-af41d3400f16.png)

:::note info
会社によっては、追加できるアプリが情シス部門によって管理されており、AWSアプリを利用するために社内申請などが必要になる可能性があります。
:::

チャネル内で `@aws connector` と投稿すると、AWSアプリからエージェント接続方法のヘルプコメントが返ってきます。

![スクリーンショット 2024-09-20 23.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f3f31bfe-4640-1e95-7601-a0bffccf7628.png)

接続コマンドは以下のようです。

`@aws connector add <好きな接続名> <BedrockエージェントのARN> <エージェントのエイリアスID>`

AWSアプリに送信してみると、接続成功メッセージが返ってきました！

![スクリーンショット 2024-09-20 23.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/9275385b-fc92-aa45-8724-d2fc38751323.png)

Bedrockエージェントへの会話送信コマンドは以下のようです。

`@aws ask <接続名> <チャット内容>`

職場の悩みごとを相談してみると、必要な情報をうまく聞き返しながら解決策を提案してくれました🎉

![スクリーンショット 2024-09-20 23.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fe3155d4-5434-0e10-0edf-d631e1f66649.png)


# あれ、なんか応答遅くない？

これまでもTeamsやSlackからLLMのAPIを呼べるチャットボットを作っていた方はいると思いますが、今回のチャットボットはレスポンスに少し時間がかかります。

理由は、LLMのAPIを直接呼ぶのではなく **AIエージェントのAPIでラップされたLLMを呼んでいるから** です。

- 通常のLLM：ユーザーの質問 → LLMの回答生成
- エージェント：ユーザーの質問 → エージェントが行動計画を生成 → LLMの回答生成

さらに、AWS ChatbotはTeamsから呼び出す際、接続に時間がかかることがあるようで「送信中…」というステータスで数秒待つケースもありました。

※エージェントって何？という方は以下スライドをご覧ください！

https://speakerdeck.com/minorun365/sutatoatupuderen-gazu-rinai-sorenaraaiezientowogu-ou



### 逆に、エージェントだからこその利点もある

今回のBedrockエージェントの場合、単純な「LLM呼び出し＋履歴保持」程度のチャットボットと異なり、もっと高度なふるまいを実行させることが可能です。

- ユーザーの依頼に対して、タスクを分解して行動計画を立てる
- ユーザーの依頼で不明瞭な点があれば聞き返してくれる **（Bedrockエージェントのユーザー入力機能）**
- スレッド内の会話の短期記憶だけでなく、同じユーザーとのやり取りをサマリーして長期記憶してくれる **（Bedrockエージェントのメモリー機能）**
- Lambdaを実行してアプリケーションを実行したり外部APIを叩ける **（Bedrockエージェントのアクショングループ機能）**
- RAGを使って社内のデータソースなどを参照できる **（Bedrockのナレッジベース機能）**
- 不適切な応答をフィルターしたり、ハルシネーションのチェックができる **（Bedrockのガードレール機能）**

ぜひ、Lambda関数を作って実行させたり、社内データのRAG機能もつけたりと、エージェントならではの追加機能も実装してみましょう！

- ナレッジベースの作成方法

https://qiita.com/minorun365/items/24dfb0ea3afde6ed0a56

- アクショングループ（Lambda）の追加方法

https://qiita.com/minorun365/items/85cb57f19fe16a87acff