Amazon Bedrockを使ってClaudeを業務利用したい！

Anthropic Claude Advent Calendar 2023 の 13日目の記事です。

## 業務でLLMを活用したい
LLMってすごく便利ですよね！
できることなら、業務に使って生産性を爆上げしたいですよね！
LLMのサービスを使いたいけど、社外サービスの業務利用が制限されていたり、利用申請が大変だったりする会社も多いのではないでしょうか？

この記事を読んでいる方の中に、「既にAWSの社内申請は通っていて、AWSは比較的自由に使える」という方はいませんか？その方に朗報です！
AWSで簡単にLLMチャットアプリを構築するアセットをご紹介します！

 ## bedrock-claude-chat
 AWSサービスだけで、LLMチャットが実現できる[bedrock-claude-chat](https://github.com/aws-samples/bedrock-claude-chat)を開発したので、そちらをご紹介します！（日本語マニュアルは[こちら](https://github.com/aws-samples/bedrock-claude-chat/blob/main/docs/README_ja.md)）
こちらは、GitHubのaws-samplesとして公開しており、OSSプロジェクトのため、どなたでもご自由に利用できます。
[CloudShellを使ったデプロイ](https://github.com/aws-samples/bedrock-claude-chat/blob/main/docs/README_ja.md#-%E3%81%BE%E3%81%9A%E3%81%AF%E3%81%8A%E8%A9%A6%E3%81%97)と[CDKを使ったデプロイ](https://github.com/aws-samples/bedrock-claude-chat/blob/main/docs/README_ja.md#deploy-using-cdk)の2種類のデプロイ方法をサポートしており、どちらも簡単な手順でデプロイできるので、興味を持った方はぜひデプロイしてみてください！

### アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/da048b9c-02bc-606b-2d8f-dd0a082e6af5.png)

アーキテクチャは上記の通り、サーバレスサービスを使ったものとなっています。
AWSサービスに閉じた構成なので外部にデータが送信されることはありませんし、入出力データがサードパーティ（今回だとAnthropic社）に提供されることもありません。
また、入力したデータがLLMの学習データとしても利用されることもありませんので、安心して業務データをLLMチャットで利用することができます（業務データを入力する前に、社内規約は確認するようにしましょう）。
参考：[Amazon Bedrock よくある質問](https://aws.amazon.com/jp/bedrock/faqs/)

今回の利用技術の主要な要素については、以下の通りとなっています。

**LLM**
Amazon Bedrockを利用しており、[Anthropic社のClaude](https://aws.amazon.com/jp/bedrock/claude/)というモデルで推論します。
こちらのモデルは、日本語の質問に対しても高い精度で応答することができ、AWSでLLMを利用する場合に第一候補となるモデルの一つと言って良いでしょう。

**Frontend**
React + ViteのSPA構成です。
認証の処理は、[Amplify UI Authenticator](https://ui.docs.amplify.aws/react/connected-components/authenticator)で実装しています。

**Backend API**
[Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter)を利用したモノリシックなLambda構成です。
言語はPythonで、フレームワークにFastAPIを利用しています。
Lambda Web Adapterは、[こちらの記事](https://aws.amazon.com/jp/builders-flash/202301/lambda-web-adapter/?awsf.filter-name=*all)で詳しく解説されていますので、ぜひご覧ください！

**Streaming Response**
Amazon Bedrcokは推論結果を段階的に出力することができます。
Streaming Responseを実現することで、ユーザは推論が完了するまで待ち続けるのではなく、段階的に出力された回答を読みながら待つことができるのでUXが良くなります。
今回は、WebSocketを利用してStreaming Responseを実現しています。
同期処理で実行すると30秒でAPI GatewayとLambdaの統合がタイムアウトするので、非同期処理でレスポンスを返すようにしています。

### 機能紹介
それでは、機能の紹介をしたいと思います！

#### ログイン
デプロイしたページにアクセスすると、以下のようにログイン画面が表示されるので、「アカウントを作る」から、ご自身のアカウントを作成してログインしてください（メールを受信できるメールアドレスが必要です）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/003ca775-c78b-b20d-4022-3f65d6a4b765.png)

鋭い方は気づいたかもしれません！
この状態だと、デプロイ後のURLを知っていて、有効なメールアドレスを持っている人は全員サインアップ＋ログインが可能です。
必要に応じて、[セルフサインアップの無効化](https://github.com/aws-samples/bedrock-claude-chat/blob/main/docs/README_ja.md#%E3%82%BB%E3%83%AB%E3%83%95%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B)とAWS WAFによるIPアドレス制限（[こちら](https://github.com/aws-samples/bedrock-claude-chat/blob/c2eec81489497e6ccabcd4d6009e64053b44a12d/cdk/cdk.json#L52-L56)で設定可能）を行ってください。

#### 利用可能なモデル
ログインすると以下のような画面が表示されて、Claudeとチャットをすることができます（言語切り替えはMenuから行えます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/b48f9fcb-56a7-c72f-e0e0-b3aed1fe9f1c.png)

画面上部に「Claude Instant」と「Claude v2」という切り替えボタンが表示されていますが、こちらはLLMのモデル切り替えボタンです。状況によって、2つのモデルを切り替えてチャットを行うことができます。
各モデルの特徴は以下の通りです（[公式ドキュメント](https://aws.amazon.com/jp/bedrock/claude/)より引用）。
※料金とリージョンの情報は、2023/12/12現在のものです。最新の情報は[公式ドキュメント](https://aws.amazon.com/jp/bedrock/pricing/)で確認してください。
※料金はリージョンにより異なります。以下の表では、米国東部 (バージニア北部) と米国西部 (オレゴン)　を`US`、東京を`JP`と表現しています。

|モデル名|ユースケース|特徴|1000トークンあたりの料金（入力）|1000トークンあたりの料金（出力）|
|---|---|---|---|---|
|Claude 2|よく練られた対話、コンテンツ作成、複雑な推論、創造性、コーディング|複雑なコンテキストのタスクを実行可能|US:0.00800 USD|US:0.02400 USD|
|Claude Instant|カジュアルな対話、テキスト分析、要約、文書理解|高速なレスポンス<br/>**東京リージョンで利用可能**|US:0.00163 USD<br/>JP:0.00223 USD|US:0.00551 USD<br/>JP:0.00755 USD|

Claude 2と比較して、Claude Instantは利用料金がかなり安いですね！
「安いってことはどうせ賢くないんでしょ？」「どうせ使うなら賢いLLM一択でしょ！」と思う方もいるかもしれませんが、Claude Instantもすごく魅力的なモデルです！
bedrock-claude-chatを利用しながら、Claude Instantの魅力もご紹介していきます！

#### モデルの出力を比較してみる
アセットの詳しい説明に入る前に、Claude InstantとClaude 2で出力内容を比較してみましょう！
質問内容：AWSについて、主要なサービスを紹介しつつ500文字程度でまとめてください
|Claude Instant|Claude 2|
|--|--|
|はい、AWSの主要なサービスについて500文字程度でまとめます。<br/><br/>AWSの基盤となるサービスはEC2とS3です。EC2は仮想サーバーで、様々なOSで自由にインスタンスを作成できます。S3はオブジェクトストレージサービスで、任意のデータを安価に長期保存できます。<br/><br/>その他主なサービスは、RDSでRDBMSをクラウド上で使用、VPCで仮想ネットワーク、Route 53でDNSサービス、Elastic Load Balancingで負荷分散、Auto Scalingで自動スケール機能、Lambdaでサーバーレスコンピューティング、Elastic Container Serviceでコンテナオーケストレーション、Elastic Compute CloudでGPUインスタンス、Simple Storage Serviceで低コストオブジェクトストレージ、CloudFrontでCDNサービス、Elastic BeanstalkでPaaS機能、CloudWatchでリソース監視とアラート機能など多岐に渡ります。<br/><br/>これらのサービスを組み合わせることで、スケーラブルで可用性の高いシステムをクラウド上で構築できます。| AWS(Amazon Web Services)は、Amazon.comが提供するクラウドコンピューティングサービスです。AWSの主要なサービスは以下の通りです。<br/><br/>- EC2(Elastic Compute Cloud):仮想マシン(インスタンス)を提供するサービスです。CPU、メモリ、ストレージなどのコンピューティングリソースを柔軟に設定できます。<br/><br/>- S3(Simple Storage Service):オブジェクトストレージサービスです。画像、動画などの静的コンテンツを安価に保存できます。デュラビリティが高く、99.999999999%の耐障害性が特徴です。<br/><br/>- RDS(Relational Database Service):リレーショナルデータベースを簡単にセットアップ・運用できるマネージドサービスです。MySQL、PostgreSQL、Oracleなどに対応しています。<br/><br/>- Lambda:サーバーレスコンピューティングサービスです。コードをアップロードするだけで、自動的にリソースが割り当てられ、実行されます。マイクロサービスアーキテクチャに適しています。<br/><br/>- API Gateway:APIを作成、公開、管理、監視できるサービスです。認証、アクセスコントロール、レートリミットなどの機能が備わっています。<br/><br/>AWSはグローバルなインフラを提供し、迅速にサービスを開始できるのが特徴です。パブリッククラウドの先駆けとして市場をリードしています。|

Claude 2の方が詳細に解説してくれていますね。では、「もっと詳細に解説してください」とお願いしたらどうなるでしょうか。試してみましょう！
|Claude Instant|Claude 2|
|--|--|
|<br/>AWSの主要なサービスの詳細を説明します。<br/><br/>EC2は仮想サーバーインスタンスを提供します。性能の異なるインスタンスタイプとオペレーティングシステムから選択でき、スケールアップ/ダウンも可能です。<br/><br/>S3はスケーラブルなオブジェクトストレージサービスで、任意のデータオブジェクトをアップロードできます。セキュアで高可用性が特徴です。<br/><br/>RDSはリレーショナルデータベースサービスで、MySQL、Oracle、SQL Server、PostgreSQL、MariaDBを使用できます。自動バックアップ&リカバリ機能があり管理は容易です。<br/><br/>VPCは仮想プライベートクラウドで、仮想ネットワーク、サブネット、ルーティングテーブル、ネットワークACLなどを設定できます。<br/><br/>Route 53は高信頼性のDNSサービスで、レコードセット作成/変更が可能で、健全性チェック機能もあります。<br/><br/>Elastic Load Balancingはアプリケーションサーバーへのトラフィック配分を行い、自動スケーリングもサポートします。<br/><br/>Lambdaはサーバーレスコンピューティングサービスで、特定のイベントに応答する関数を登録できます。<br/><br/>以上がAWSの主要なインフラサービスの詳細説明です。必要なサービスを組み合わせることで、スケーラブルなシステムアーキテクチャを構築できます|はい、AWSの主要なサービスについてもっと詳しく解説いたします。<br/><br/>EC2(Elastic Compute Cloud)<br/>CPU、メモリ、ストレージ、ネットワークなどのコンピューティングリソースを柔軟に設定できる仮想マシンサービスです。インスタンスタイプが豊富で、用途に合わせて最適なリソース割り当てが可能です。Auto Scalingで負荷に応じたスケールアウト/スケールインも実現できます。<br/><br/>S3(Simple Storage Service)<br/>強力なデュラビリティとスケーラビリティを備えたオブジェクトストレージです。標準的なストレージクラスのほか、アクセス頻度が低いデータ向けのInfrequent Accessやアーカイブデータ向けのGlacierクラスも提供しています。<br/><br/>RDS(Relational Database Service)<br/>MySQL、PostgreSQL、Oracle、SQL Serverなどのリレーショナルデータベースをマネージドサービスとして提供します。バックアップ、フェイルオーバー、セキュリティパッチの適用など、データベースの運用管理が簡単になります。<br/><br/>Lambda<br/>コードをアップロードするだけでサーバーレスコンピューティングを実現できます。処理時間に応じた課金なので、間欠的な処理に適しています。Event-drivenなアーキテクチャを実現できます。<br/><br/>API Gateway<br/>APIの作成、運用、管理を一元的に行うことができます。認証、アクセスコントロール、レートリミットなどの機能が備わっており、セキュアなAPIの実現が可能です。<br/><br/>このように、AWSは幅広いサービスメニューを揃えており、用途に応じて柔軟に利用できるのが強みです。|

やはり、Claude 2の方が詳細に解説していますね。
「やっぱりClaude Instantはダメじゃん」と思うのは時期尚早です！「EC2をより詳細に説明してください」と、より細かい指示を出してみます。

|Claude Instant|Claude 2|
|--|--|
| EC2の詳細な説明は以下のとおりです:<br/><br/>- EC2インスタンスタイプは、CPU、メモリ、ストレージ容量などのスペックが異なる計9種類あります。用途に合わせたタイプを選択できます。<br/><br/>- サポートOSは、Amazon Linux、Ubuntu、Windows Serverなど多岐に渡り、自由にインスタンスにインストールできます。<br/><br/>- インスタンスはオンデマンド、スポットインスタンス、サポート終了予定インスタンスなど、支払い方法が選択できます。<br/><br/>- EBSボリュームを接続し、インスタンスから独立した永続的ストレージを使用できます。<br/><br/>- セキュリティグループでインバウンド/アウトバウンドトラフィックのフィルタリングが可能です。<br/><br/>- アウトオブメモリ高速NVMe SSDを搭載した新世代のi3インスタンスタイプも提供されています。<br/><br/>- 複数のアベイラビリティゾーンに自動的に配置されるスポットブロックインスタンスも利用可能です。<br/><br/>- インスタンスのライフサイクルはAPIやCLI、コンソールから管理でき、スケールアップ/ダウンも自由自在です。<br/><br/>以上がEC2の主な機能と特徴の詳細説明です。必要なリソースと性能を選択できる柔軟性がEC2の強みです。| EC2(Elastic Compute Cloud)について、さらに詳細に説明します。<br/><br/>- インスタンスタイプ<br/>コンピューティングパワーやメモリ、ストレージの容量が異なる多数のインスタンスタイプが用意されています。汎用的なt2/t3シリーズをはじめ、メモリ最適化のrシリーズ、コンピュート最適化のcシリーズ、ストレージ最適化のiシリーズなどニーズに合わせて選択可能。<br/><br/>- EBS<br/>EC2インスタンスに接続できるブロックストレージです。インスタンスから切り離して別のインスタンスに再接続することもできます。SSDベースのgp2/io1やHDDのst1など複数のボリュームタイプがあります。<br/><br/>- 自動スケーリング <br/>Auto Scalingにより、負荷に応じて自動的にインスタンスの数を増減させることができます。朝の通勤時間帯などのトラフィック増加に対応できます。<br/><br/>- ロードバランシング<br/>Elastic Load Balancingにより、複数のインスタンスへトラフィックを自動配分することができます。インスタンスの可用性を高められます。<br/><br/>- セキュリティグループ<br/>ファイアウォールのような機能を持ち、インバウンドとアウトバウンドの通信を細かく制御できます。セキュリティを強化できます。<br/><br/>このように、EC2はコンピューティングリソースを柔軟に設定し、スケールできるサービスです。|

Claude 2の方が詳細な説明がされていますが、Claude Instantでも必要十分なぐらい詳細な説明になっていますね！
Claude Instantに限らずLLM全般の話として、精度の高い回答を得るためには「具体的かつ詳細な指示を出すこと」が重要です。人間に指示をする場合と同じで、雑に指示をして「賢くない」と判断するのではなく、しっかり指示を出すことが大事ですね！

#### チャット機能でタスクを実行させる
LLMは「（事前学習済みの）情報を調べる」以外に、「タスクを実行させる」という部分に非常に大きな価値があります。
※LLMを応用した情報検索の手法で、RAG（検索拡張生成）というものがありますが、こちらは事前学習データではなく、検索したドキュメントをもとに回答を生成するので、「タスクを実行する」に分類されるかと思います。

それでは、実際にいくつかタスクを実行させて、精度を確認してみましょう！
aws-samplesである[generative-ai-use-cases-jp](https://github.com/aws-samples/generative-ai-use-cases-jp)には、プロンプトサンプル集の機能があり、さまざまなプロンプトを試すことができます。今回はこちらで紹介されているプロンプトを使って検証をします。

少し脱線しますが、このgenerative-ai-use-cases-jpは生成系AIのユースケースを気軽に試すことができるアセットで、簡単にデプロイができるので、興味のある方はこちらもデプロイしてみてください！[こちらのClassmethod様のブログ記事](https://dev.classmethod.jp/articles/introduce-aws-samples-gen-ai-app-repo/)で非常にわかりやすく紹介されています。
私も[generative-ai-use-cases-jpについての記事](https://qiita.com/wadabee/items/d073238588d9022489cf)も書いているので、こちらも読んでいただけると嬉しいです！
generative-ai-use-cases-jpをインストールして、「チャット」機能を開くとプロンプトサンプル集にアクセスすることができます。プロンプトエンジニアリングの勉強になると思うので、ぜひこちらも使ってみてください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/8bd6df42-a76e-94a1-70fa-ae1b91800368.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/fedfc4f2-b04f-92e2-4ad2-45d5917645d3.png)

それでは話を本題に戻して、実際にタスクを実行してみましょう！
まずは、以下の創造性が試される「返信メールの作成」のプロンプトを試してみます。
```
あなたは丁寧で礼儀正しくメールを返すプロフェッショナルです。
以下の <mail></mail> の xml タグで囲まれたメール文面に対して、<intention></intention> の xml タグで囲まれた内容で返信メールを作成してください。

<mail>
鈴木様

出品されていらっしゃる、キリマンジャロのコーヒー豆 5kg について、１万円で出品されていますが、1000 円に値下げしていただくことは可能でしょうか。

山田
</mail>

<intention>やだ</intention>

メールを作成する際、以下の<rule></rule>に囲まれたルールを遵守してください。
<rule>
* 文面の最初には宛先を様づけで書くこと
* いきなり本題に入らず挨拶を入れること
* 相手の幸せを祈ること
* 文面の最後に自分の名前を敬称なしで入れること
* 丁寧で礼儀正しいこと
* 出力は<output></output>タグで囲い、<output>から始めること
</rule>
```
|Claude Instant|Claude 2|
|--|--|
|<output> 鈴木様<br/>お元気でしょうか。本日は。<br/><br/>申し訳ありませんが、キリマンジャロのコーヒー豆の価格の値下げについては、残念ながらお受けできません。<br/>価格設定は販売戦略として慎重に検討した結果となっております。<br/>今後の販売に向けて、引き続きご理解とご協力を賜れますと幸いです。<br/><br/>山田<br/></output>| <output><br/>山田様<br/><br/>いつもお世話になっております。<br/>この度は弊社の商品にご興味をお持ちいただき、誠にありがとうございます。<br/>値下げのご要望につきましては、生産コストや販売価格の兼ね合いもございますので、現時点では対応が難しい状況です。<br/>何卒ご理解いただけますと幸いです。<br/>今後とも変わらぬご愛顧を賜りますよう、よろしくお願い申し上げます。<br/><br/>山田のご健康とご多幸を心よりお祈り申し上げます。<br/><br/>鈴木<br/></output>|

Claude Instantは宛先と送り主が逆になっていたり、文章が不自然になっていますが、Claude 2は、コンテンツ作成が得意と謳われていることもあって、非常に自然な返信文が生成されていますね。
創造的なタスクについては、Claude 2に優位性がありそうですね！

次は、創造的なタスクではなく、ルールに沿って実行するタスクを実行させてみます。
「選択肢を与えて分類する」というメール分類のプロンプトを実行します。
```
あなたは、電子メールをタイプ別に分類しているカスタマーサービス担当者です。
<mail></mail> の xml タグに囲われた文章を <category></category> の xml タグに囲われたカテゴリーに分類してください。
<mail>
こんにちは。私の Mixmaster4000 は、操作すると奇妙なノイズを発生します。
また、電子機器が燃えているような、少し煙のような、プラスチックのようなにおいがします。交換が必要です。
</mail>
<category>
(A) 販売前の質問
(B) 故障または不良品
(C) 請求に関する質問
(D) その他(説明してください)
</category>
出力は <output>からはじめ、</output> タグで終え、タグ内には A,B,C,D のどれかだけを記述してください。
ただし D の場合のみ説明を記述してください。
```

|Claude Instant|Claude 2|
|--|--|
|B|B|

どちらも正しく分類できましたね！メールの内容がわかりやすかったのかもしれないので、以下の通りもっと曖昧なメール文章にしてみます。

```
Mixmaster4000の使い方がわかりません。マニュアルは間違って捨ててしまいました。マニュアルをダウンロードすることはできますか？
```
|Claude Instant|Claude 2|
|--|--|
|<output> D このメールはMixmaster4000のマニュアルのダウンロード方法について質問しているため、カテゴリD(その他)に分類します。 </output>|A|

なんと、Claude Instantの方が正しい回答を導き出していますね！！
このプロンプトは分類のルールが曖昧であるため、このような結果になっていると考えられます。
タスクを正確にこなすためには、モデルの賢さはもちろんですが、プロンプトが非常に重要であるということを示すいい例ですね。
思うように回答精度が上がらない場合は、モデルのせいにするのではなく、まずはプロンプトを見直しましょう！

最後に、「個人情報削除」のプロンプトを試してみます。
```
テキストを提供します。このテキストから個人を特定する情報をすべて削除し、XXXに置き換えたい。名前、電話番号、自宅や電子メールアドレスなどのPIIをXXXに置き換えることは非常に重要です。

入力者は、文字と文字の間にスペースを挿入したり、文字と文字の間に改行を入れたりして、PIIを偽装しようとするかもしれません。

テキストに個人を特定できる情報が含まれていない場合は、何も置き換えずに一字一句コピーしてください。

以下の <example></example> の xml タグに囲まれた内容は例です。
<example>
<text>
私の名前は山田太郎です。メールアドレスは taro.yamada@example.com、電話番号は 03-9876-5432 です。年齢は 43 歳です。私のアカウント ID は 12345678 です。
</text>
求める出力は以下の通りです。
<output>
私の名前はXXXです。メールアドレスは XXX、電話番号は XXX です。私は XXX 歳です。私のアカウント ID は XXX です。
</output>
<text>
山田花子は邪馬台国記念病院の心臓専門医です。連絡先は 03-1234-5678 または hy@yamataikoku-kinenbyoin.com です。
</text>
求める出力は以下の通りです。
<output>
XXXは邪馬台国記念病院の心臓専門医です。連絡先は XXXまたは XXX です。
</output>
</example>

以下 <text></text> の xml タグに囲まれたテキストから個人情報を XXX に置き換えてください。

<text>
私は源頼朝です。鎌倉時代の武将です。連絡先は yoritomo-minamoto
@kamakura-bakuhu.go.jp もしくは 0467-
12-
3456
です。
</text>

個人情報を XXX に置き換えたテキストを <output>からはじめ、</output> タグで終えて出力してください。
```
|Claude Instant|Claude 2|
|--|--|
| 私はXXXです。鎌倉時代の武将です。連絡先は XXX もしくは XXX です。| 私はXXXです。鎌倉時代の武将です。連絡先は XXXもしくは XXXです。|

どちらのモデルも正しく出力されましたね！
比較的単純で、創造性が求められないタスクについては、Claude InstantとClaude 2がほぼ同じ精度であることがお分かりいただけたかと思います！

#### レスポンス比較
先程は、精度面の比較をしましたが、次はレスポンスの比較を行なってみます。

「個人情報削除」のプロンプトでレスポンスを比較してみます。textの部分はもっと長いものを設定してみました（LLMで自動生成した文章です）。
```
テキストを提供します。このテキストから個人を特定する情報をすべて削除し、XXXに置き換えたい。名前、電話番号、自宅や電子メールアドレスなどのPIIをXXXに置き換えることは非常に重要です。

入力者は、文字と文字の間にスペースを挿入したり、文字と文字の間に改行を入れたりして、PIIを偽装しようとするかもしれません。

テキストに個人を特定できる情報が含まれていない場合は、何も置き換えずに一字一句コピーしてください。

以下の <example></example> の xml タグに囲まれた内容は例です。
<example>
<text>
私の名前は山田太郎です。メールアドレスは taro.yamada@example.com、電話番号は 03-9876-5432 です。年齢は 43 歳です。私のアカウント ID は 12345678 です。
</text>
求める出力は以下の通りです。
<output>
私の名前はXXXです。メールアドレスは XXX、電話番号は XXX です。私は XXX 歳です。私のアカウント ID は XXX です。
</output>
<text>
山田花子は邪馬台国記念病院の心臓専門医です。連絡先は 03-1234-5678 または hy@yamataikoku-kinenbyoin.com です。
</text>
求める出力は以下の通りです。
<output>
XXXは邪馬台国記念病院の心臓専門医です。連絡先は XXXまたは XXX です。
</output>
</example>

以下 <text></text> の xml タグに囲まれたテキストから個人情報を XXX に置き換えてください。

<text>
私、田中太郎は東京都港区に住んでいる35歳の会社員です。仕事はIT関係の営業をしていて、平日は朝の9時から夕方の6時まで会社にいます。休日は友人と食事に行ったり、趣味のギターを弾いたりして過ごしています。連絡先はメールアドレスがtanaka.taro@example.com、自宅の電話番号が03-1234-5678、携帯電話番号が090-1234-5678です。

私の大学時代からの親友に山田花子さんがいます。花子さんは東京都江東区に住んでいて、飲食店を経営しています。花子さんのメールアドレスはyamada.hanako@example.com、店の電話番号は03-5678-9012、携帯電話番号は090-5678-9012です。

先日、花子さんからハワイ旅行に誘われ、花子さんの婚約者である鈴木健次郎さんと一緒にハワイに行ってきました。健次郎さんは都内の大手商社に勤めているサラリーマンで、メールはsuzuki.kenjiro@example.com、携帯電話番号は090-9876-5432です。

ハワイでは、ワイキキビーチでのマリンスポーツを楽しんだり、ダイヤモンドヘッドをハイキングしたり、現地のグルメを堪能したりと、日常生活では味わえない貴重な体験をしました。夜は三人で花子さんと健次郎さんの婚約披露宴の話に花を咲かせ、二人の幸せな未来を想像し合いました。旅の思い出として、現地の雑貨店で購入したウクレレのストラップを大切にしています。

</text>

個人情報を XXX に置き換えたテキストを <output>からはじめ、</output> タグで終えて出力してください。
```

横並びで表示された方がわかりやすいので、bedrock-claude-chatではなく、マネジメントコンソールのChat Playgroundを利用して、レスポンス比較をしました。

![output-palette-none.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/6310bfd4-d525-541a-0121-ea5f8bc63bdc.gif)

結果は、Claude Instantが約6秒、Claude 2が約18秒とClaude Instantの方がレスポンスが早いですね！
この例は入出力が比較的短いのでこの程度の差ですが、もっと大きな文量を扱う場合は体感的にかなり変わってくるでしょう。

条件によって異なりますが、2023/12/12現在はClaude Instantの方が2〜3倍ほど早くレスポンスが返ってきます。
レスポンスの速さはUXに直結しますので、実行するタスクの種類やアプリケーションの属性によっては、Claude Istantを使った方が良い場合も多いでしょう。
盲目的に一律で賢いLLMを使うのではなく、状況によってモデルを使い分けることが重要ですね！


#### チャットを使ってみる
前置きが長くなりましたが、チャットをしてみましょう！
モデルを選択してチャットを行うと、以下のようにLLMから回答が返ってきます。
もちろん、会話履歴も登録されて、いつでも見返すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/6543775b-5306-1ff1-d390-72cc8e560123.png)

会話の流れも考慮する作りですので、「箇条書きにして」「もっと簡単に説明して」というような追加の指示も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/398dc32a-e60a-0c7c-d1c5-37ab37591734.png)

創造的なタスクをこなす際によくあるのが、LLMの出力した内容があまり気に入らないパターンですね。
このアセットのデフォルト設定は、LLMがある程度ランダム性を持たせた出力をするようになっているので、「再生成」ボタンを押して再出力してもらいましょう！（[パラメータの設定値](https://github.com/aws-samples/bedrock-claude-chat/blob/main/docs/README_ja.md#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%9F%E6%88%90%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E8%A8%AD%E5%AE%9A)）

**初回生成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/404cdaa7-751e-1fd5-e3c7-bf9e225217b6.png)

**再生成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/1dda1535-0d0b-fe07-792e-411f17fc4bc3.png)

このように、再生成をすることで全然違った回答を得ることができました。
創造的なタスクを行う際は、お気に入りの出力が得られるまで、再生成を繰り返してみてください！

また、試行錯誤を行う過程で、プロンプトを変えながら出力結果を見比べたい場合もあるでしょう。
その場合は、編集の機能を使いましょう！

右側のボタンを押すことで編集モードにすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/32b39045-8abf-b390-4f88-452f480af6ee.png)

プロンプトを書き換えたら、「変更＆送信」ボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/f29465f0-5008-9327-4cff-eeb387fb3950.png)

すると、変更後のプロンプトで回答が生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/b268670c-33b0-fbea-f918-2ee3dc3ead61.png)

再生成結果や修正したプロンプトは、すべて履歴として保存されているので、いつでも見返すことができます。
会話の左側に表示されている `<`と`>`はボタンになっていて、このボタンを押すことで履歴表示を切り替えられます。
履歴はツリー形式で管理しているので、会話の途中で修正することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/a4d85eaa-dff1-24a1-e515-5cf9ed17e752.png)

#### カスタムボット機能を使ってみる
このアセットには、カスタムボットという機能があるので、実際に動かしながらその機能をご紹介します！

メニューの「ボットコンソール」でボットの管理画面を開くことができます。
「ボットを新規作成」ボタンで、ボットを新規作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/f08cef38-393f-4282-914a-551bea7c218c.png)

カスタムボットとは、事前に定義したプロンプトに沿って回答を生成する機能です。
チャット機能でも、「英語翻訳して」「要約して」などとLLMに指示をすると思いますが、その指示の部分を事前に定義しておくことで、カスタムボット利用者は「LLMへの指示」の部分を意識することなく、その機能を利用することができます。

今回は、AWSサービスを小学生にもわかるように説明するボットを作成してみます。
以下のように定義をしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/ca1e0373-895a-c1b3-359f-cc80b3ae6618.png)

ボットを登録すると以下のように表示されます。
スターを付けておくと、左側のメニューに表示されるので、よく使うボットはスターを付けておくと便利です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/5e6e3af0-fec2-0f7a-98be-2b032c996920.png)

では、早速使ってみましょう！
ボットをクリックすると以下のように、通常のチャット画面のようにメッセージ入力欄が表示されるので、チャット形式で入力をしていきます。
今回は創造性が求められるタスクなので、Claude 2を使って生成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/39020ca5-3ac0-0d2c-0864-c290c02308ae.png)

EC2の説明をしてもらいました。
これで小学生が理解できるかはわかりませんが、なんかそれっぽい回答が生成されていますね！
精度や生成内容に納得がいかない場合は、ボットの「インストラクション」を修正すること対応できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/7c518b77-b858-7ce5-cf56-1b67e4f43497.png)

ついでに、Lambdaも説明させてみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/5dd00621-229e-42cb-0988-7c1b657876fd.png)

うーん、、なんか違う気がしますね笑
今回は紹介用に雑に作ったボットなので、仕方ないです！
正確性が求められるタスクの場合は、「インストラクション」をより詳細かつ具体的に書くようにしましょう！

#### カスタムボットを共有する
作成したボットは他のユーザに共有することができます。
（**共有範囲はデプロイしたアプリケーション内のユーザのみです。インターネット上には共有されません。**）

ボットコンソール画面から共有したいボットの「・・・」ボタンをクリックすることで、共有メニューを表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/818bb341-0209-10bb-80d5-c66384050ae4.png)

共有をONにすると、共有URLが表示されるので、このURLを共有したいユーザにチャット等で共有してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/3e463a53-4691-e69a-8c67-fad60b219c6f.png)

共有URLにアクセスすると、自作ボットと同様に会話を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/f569ab81-9140-966f-f783-fabc52f8d71e.png)

会話を行うと、ボットコンソールの「最近使用した公開ボット」に表示されるようになるので、共有されたボットを再度利用したい際にも簡単にアクセスすることが可能です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2434634/3b1f3d2c-8532-5b63-0270-1065684d0b82.png)

会社の業務に特化したボットを同僚に共有することで、職場のヒーローになれることでしょう！
ぜひ、皆さんもカスタムボットの機能を使ってみてください！

## 最後に
今後カスタムボットに独自ファイルをアップロードして、ファイルの情報をベースに回答する機能（ベクトル検索 + RAG）を実装する予定ですので、ぜひStarしてお待ちください！
興味を持った方は、ぜひbedrock-claude-chatをデプロイしていただけると幸いです。
AWSとClaudeを使って、業務効率化を目指していきましょう！！

また、[bedrock-claude-chat](https://github.com/aws-samples/bedrock-claude-chat)以外にも、生成系AIのユースケースを体験できる[generative-ai-use-cases-jp](https://github.com/aws-samples/generative-ai-use-cases-jp)とドキュメント検索に特化した[simple-lex-kendra-jp](https://github.com/aws-samples/simple-lex-kendra-jp)も開発していますので、こちらもぜひご覧ください！