【社内勉強会資料】GenUのすすめ

## GenUとは

GenU（正式名称：Generative AI Use Cases JP）とは、
[Amazon Bedrock][bedrock]を使用した生成AIのWEBアプリケーションをすぐに実装できるよう設計された、AWS公式のオープンソースの生成AIデモアプリです。

https://github.com/aws-samples/generative-ai-use-cases-jp

- チャット
- RAGチャット
- 文章生成
- 校正
- 画像生成
etc...

上記のような生成AIアプリでよく利用されるユースケースが最初から実装された状態でコードが公開されています。
READMEの手順通りにコマンドを実行するだけで、すぐにこんなリッチなUIの生成AIのWEBアプリが構築できます。

![スクリーンショット 2024-11-22 16.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/3661effe-ecd8-c062-d0ac-55c0470c5ec3.png)

## GenUに実装されている機能

[ユースケース一覧](https://github.com/aws-samples/generative-ai-use-cases-jp?tab=readme-ov-file#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7)

### RAGチャット

社外秘の情報や社内規定など一般に公開されていないドキュメントを参照して回答を生成することができます。
GenUでは所定のフォルダにソースとなるドキュメントを配置し、オプションを有効にすることで簡単にRAGチャットを実装できます。

[RAGチャットの有効化の手順](https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/docs/DEPLOY_OPTION.md#rag-%E3%83%81%E3%83%A3%E3%83%83%E3%83%88-knowledge-base-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96)

自動車保険に関する資料をソースドキュメントして与えた場合のチャット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/fb412c32-0483-9641-8714-1c1d9c4650ee.png)


ソースドキュメントを参照して回答を生成しています。
次のファイル形式がサポートされているので、大抵の社内文書はそのままソースドキュメントして与えることができます。複数のファイル形式が混在していても問題ありません。

- `.txt`(文字コードはASCIIのみ）
- `.md`
- `.html`
- `.doc/.docx`
- `.csv`
- `.xls/.xlsx`
- `.pdf`

#### KendraとBedrock Knowledge Bases

- [Amazon Kendra][kendra]
- [Amazon Bedrock Knowledge Bases][knowkedge-base]

RAGチャットをAWSで実装する場合、上記2つのどちらを利用するか選択できます。
性能に大きな差はありませんが、Kendraの方がKnowledge Basesよりも対応しているファイル形式が多い、ドキュメントを格納しておくデータソース(S3など)の対応が多いなどの違いがあり、拡張がしやすいという特徴があります。
ただし料金が`1.4 USD/時間` 1ヶ月720時間とした場合`1,008 USD/月`とかなり高額のため、基本的にはKnowledge Basesを利用した方が良いです。

### その他の機能

他にWEBアプリの機能として以下の機能が標準で実装されています。

- ユーザー認証：Cognitoを利用したユーザーのサインアップ・サインイン
- 利用履歴の保持：利用者の入力、モデルの出力等をデータベースに保持
- 音声認識：リアルタイム、音声ファイルからの文字起こし

またオプションを有効化することで以下の機能も追加できます。

- セキュリティ設定：IPアドレス制限、利用できるドメインの制限など
  - Microsoft Entra IDとの連携も可能
- モニタリングダッシュボード：入出力のトークン数や直近で入力されたプロンプトなどが集計されたダッシュボード

## 費用感

RAGチャットを実装した場合の月額の料金試算例が以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/9016d34b-3a23-0f09-8418-e3c0311edc5f.png)

- ユーザー数：50人
- 1ヶ月間の入力トークンを11,000,000トークン

→ 1回の入力あたり500トークンとした場合22,000回
→ 1人あたり1ヶ月440回利用

ざっくり上記の条件での試算で月額70,641円の費用になります。
基本的には利用状況と比例する従量課金のサービスが主になるので、利用頻度に応じて変動します。
ChatGPTは中小企業向けのTeamsプランであっても1ユーザー当たり4,500円ほどかかりますが、GenUで構築すれば利用ユーザーが増えても料金が大きく跳ね上がることはありません。

## ライセンスについて

GenUのライセンスは`MIT-0`です。
内容としては以下のようなライセンスです。
- コードをコピー、変更、再配布してもOK
- 商用利用も可能
- 他のプロジェクトに組み込んでも問題なし
- 著作権表記が不要（通常のMITライセンスでは、元の著作権表記を残す必要がありますが、MIT-0では不要）
- 提供されるコードの保証はしない（例：「壊れても責任を負いません」）

なので、自社のサービス用にカスタマイズして販売できます。

## 社内で活用するには？

- 社内規定や通達への問い合わせ対応の自動化
- コールセンター業務のQAサポート
- 社内の技術ナレッジの蓄積、検索

## ハンズオン

### 事前準備

- Node.jsのインストール
  - `npm --version`が実行できること
  - 社内ネットワークから実行する場合[プロキシ設定](https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)をする
- AWSアカウントの作成
  - IAMユーザーを作成し、アクセスキーを発行する
- AWS CLIのインストール
  - `aws --version`が実行できること
- プロファイルの作成
  - [こちら](https://qiita.com/yyyyy__/items/e205ec5886b15396c686)を参考にプロファイルを作成 

### モデルの有効化

Bedrockのモデルを利用するには、利用するリージョンごとに[モデルアクセスの有効化](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-access.html)を行う必要があります。
GenUはデフォルトでバージニア北部(`us-east-1`)のモデルを利用するようになっているため、次の手順でモデルアクセスの有効化を行います。

1. AWSマネジメントコンソールにログインします
2. リージョンを`us-east-1`に切り替えます
3. Amazon Bedrockのサービス画面を開きます
4. 左側メニューから下の方の「モデルアクセス」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/7f76e653-cde3-c134-4a7b-879794dc3f75.png)

5. 「Claude 3 Sonnet」の「リクエスト可能」をクリックし、さらに「モデルアクセスをリクエスト」をクリックします。
すでに有効化されている場合は「アクセスが付与されました」が表示されます。その場合この手順は不要です。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/7df385f8-c2b2-58e9-45d8-167d60e19e5e.png)

6. 「Claude 3 Sonnet」にチェックが入っていることを確認し「次へ」をクリックし、次の画面で送信ボタンを押してください
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/e1e4a22a-4593-ae7d-c160-6d42fa43c25b.png)

これでモデルアクセスの有効化はOKです。

### リポジトリのクローン

まずは任意の場所に公式リポジトリをクローンします。

https://github.com/aws-samples/generative-ai-use-cases-jp

```bash
git clone https://github.com/aws-samples/generative-ai-use-cases-jp.git
```

クローンしたフォルダに移動します。

```bash
cd generative-ai-use-cases-jp
```

### スタック名の変更

今回は複数人で同じAWSアカウントに環境構築をするため、作成するリソースの名前が被らないように以下の箇所を変更します。

ファイル`./packages/cdk/bin/generative-ai-use-cases.ts`の148行目 `'GenerativeAiUseCasesStack'`の末尾に社員番号を追加
例: `'GenerativeAiUseCasesStack123'`

### デプロイ

公式リポジトリのデプロイ手順を実施します。

```bash
export AWS_PROFILE=<事前準備で作成したプロファイル名> #デフォルトプロファイルを設定している場合は不要
npm ci
npx -w packages/cdk cdk bootstrap
npm run cdk:deploy
# Do you wish to deploy these changes (y/n)? → yを入力してEnter
```

実行後コンソールに出力されるURLをブラウザで開きます。

```bash
Outputs:
〜省略〜
GenerativeAiUseCasesStack123.WebUrl = <URL>
```

GenUではデフォルトでユーザ認証機能が実装されているため、アクセスすると以下のサインイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/409a5955-7f59-4652-b9ab-29fef0ef8f29.png)

「アカウントを作る」からアカウントを作成し、サインインしてください。
サインイン後以下の画面が表示されれば構築は完了です。

![スクリーンショット 2024-11-22 16.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/3661effe-ecd8-c062-d0ac-55c0470c5ec3.png)


### カスタマイズ

OSSで全てのコードが公開されているため、WEBのUI変更や不要な機能の削除など自社サービス用に変更することもできます。
なおGenUはインフラ構築を[AWS CDK][aws-cdk]、フロントエンドのコードはReact.js、バックエンドはNode.jsで書かれているため、カスタマイズするには多少これらの知識が必要になります。

例えばとってもAWS感が出ている画面の色を一部変更してみましょう。
`./packages/web/tailwind.config.js`の18行目`'aws-smile': '#ff9900',`を`'aws-smile': '#CCFCCB',`にして、`npm run cdk:deploy`を再度実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/a4aefc0a-47ea-bb05-1f36-4cd5ec9b9f04.png)

色変更ができました。

また元から搭載されている音声文字起こしとRAGチャットの機能を組み合わせて「問い合わせを音声で受付、回答をRAGで生成、音声で回答を返す」なんてことも実装できます。

![voiceToRagChat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649149/111cf791-fa9e-b571-44bc-79132fa8d0ca.gif)

※この動画に音声は入っていません

ソースを自由に変更できるため、ベースは公式リポジトリから持ってきて、自社用にカスタマイズして構築することが可能です。

### 環境削除

[リソースの削除](https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/docs/DESTROY.md)

お試し用で作成した環境は`npm run cdk:destroy`を実行して削除しましょう。

## おわりに

GenUを利用することで

- データを自社のAWSアカウント内で保持できる（外部に出さなくていい）
- 他社のサービスよりも安く利用できる
- Microsoft Entra IDとの連携により、社員に限ったアクセス制限が可能
- ソースが公開されておりカスタマイズできるため、細かい権限管理も可能（「〜〜システムのQA機能は〇〇部だけ使えるようにする」など）

などの利点があります。
またお客様から生成AIサービスの構築について引き合いがあった際も、一から作るよりも簡単に構築することができます。

[bedrock]: https://aws.amazon.com/jp/bedrock/
[aws-cdk]: https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html
[kendra]: https://aws.amazon.com/jp/kendra/
[knowkedge-base]: https://aws.amazon.com/jp/bedrock/knowledge-bases/