Amazon Bedrock のはじめ方

「 AWS には ChatGPT ないの ? 」そんな疑問に、バーでグラスを滑らせるように [Amazon Bedrock](https://aws.amazon.com/jp/bedrock/) をお送りします。 Amazon Bedrock は Web API 経由で様々な基盤モデルを扱える AWS のサービスです。特に、 [Anthropic Claude](https://aws.amazon.com/jp/bedrock/claude/) は日本語においても ChatGPT と同等精度であることが各種リーダーボードで示唆されています ([Rakuda Ranking](https://yuzuai.jp/benchmark), [Nejumi Leaderboard](https://wandb.ai/wandb/LLM_evaluation_Japan/reports/Nejumi-LLM---Vmlldzo0NTUzMDE2?accessToken=u1ttt89al8oo5p5j12eq3nldxh0378os9qjjh14ha1yg88nvs5irmuao044b6eqa)) 。

Anthropic Claude 、 また Amazon の基盤モデルである Titan だけでなく、 AI21 Labs 、 Cohere 、 Meta 、 Stability AI といった先進的なスタートアップが開発したモデルが選択できる「品揃え」、そして AWS の基盤に支えられたセキュリティ、安定性、そしてコスト効率の良さが Amazon Bedrock の特徴です。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 24
}
</style>
footer AWS Console で Amazon Bedrock を開いた画面
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/fd5e3211-4f62-3a16-78b9-375da8e09fee.png>
@enduml
```



本記事では、 Amazon Bedrock を始める方法を 1) 準備 2) 利用 3) 監視 4) 応用、の 4 ステップでご紹介しようと思います。スライドで見たい方は [Amazon Bedrock のはじめ方](https://speakerdeck.com/icoxfog417/amazon-bedrock-nohazimefang) をご参照ください。

## 1. Amazon Bedrock の準備

Amazon Bedrock を利用できるように準備します。このセクションの手順を終えると、次の図のように AWS Console 上で基盤モデルの返答を試すことができます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 24
}
</style>
footer Amazon Bedrock の Playground でモデルの出力を試している様子
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/6891cb3e-0c29-fb03-1a8c-d89db6c68ebc.png>
@enduml
```



Amazon Bedrock を利用開始する手順を次に示します。なお、リージョンにより利用可能なモデルが異なります。東京リージョンでも日本語が扱える Claude は利用できます。すべて利用したい場合は `us-east-1` や `us-west-2` がお勧めです。

|   | スクリーンショット | 操作 | 
|---- | ----------------- | ---- | 
|1 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/75c0eb26-2bf3-0f40-a058-d0e6486bd730.png) | [AWS Console](https://aws.amazon.com/jp/console/) の検索バーで "Amazon Bedrock" を入力し、 Services のリストから Amazon Bedrock の画面に遷移。 | 
|2 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/92f5d76f-a6dc-61b1-15ab-37ecf38541e3.png) | "Get started" をクリック。 | 
|3 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/182b718c-6e55-19fa-7f7c-cdca57c9ba9b.png) | 左側のメニューから "Model Access" を選択。|
|4 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/6711a1be-9fcd-e99e-6d7c-dfd56a8b1c3d.png) | 利用したいモデルのチェックボックスをクリック。 |
|5 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/c998d26f-4e18-0fb5-078b-8ee667ee9489.png) | (現在は不要?)  "Submit use case details" が必要な場合、申請。会社での使用を前提としたフォームになっているので、所属の会社の情報を入力。社内検証用の建付けであれば Internal employees を選択、ユースケースについては検証したい内容を記載 ( 日本語で書いて Amazon Translate で英訳すると楽 ) 。申請が通るまでしばらく待つ。 |
|6|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/f45de113-da15-3bdc-5568-f0d236cb943b.png) |使いたいモデルをチェックし終えたら、「次へ」を押下すると確認画面へ遷移し、送信するとモデルアクセスが有効化される。|
|7| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/a9df1849-b6b0-4123-0e81-7f146e1889cc.png) | Playground のメニューからモデルを利用する。|


SageMaker Studio から利用したい場合、 SageMaker Domain の利用している Execution role に Amazon Bedrock へのアクセス権限が必要です。

|   | スクリーンショット | 操作 | 
|---- | ----------------- | ---- | 
| a | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/facc925f-5607-915d-a397-fcfd83b12cb2.png)| SageMaker Domain の settings から Execution role を特定 |
| b | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/2afeeae5-42ea-40e1-4945-2ede676679a6.png) | IAM ロールの画面で Execution role を検索し、Create inline policy を実行 |
| c | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/847fcbd7-70cc-c01c-ea6e-03494b66f465.png) | JSON を選択し ( ※ 1) のポリシーを貼り付け  |

※ 1 : 貼り付けるポリシー
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BedrockFullAccess",
            "Effect": "Allow",
            "Action": ["bedrock:*"],
            "Resource": "*"
        }
    ]
}
```

CLI や SDK などから使うロールを作る時も、上記のポリシーを参考にしていただければと思います。

これで準備は万端です。

## 2. Amazon Bedrock の利用

Amazon Bedrock は AWS Console 上の Playground やプログラムから呼び出す AWS SDK から利用できます。

### 2.1 Playground

|   | スクリーンショット | 操作 | 
|---- | ----------------- | ---- | 
| 1 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/289caddf-f631-125e-2101-1fdc8db1726f.png) | 左側のメニューから Text / Chat / Image のいずれかを選択。今回は Chat を選択します。  |
| 2 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/dc32f2a5-208d-4d51-82ca-a63db2018789.png) | Playground で使用するモデルを選択。|
| 3 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/e9ca248a-680f-25d2-35a5-d3836f65c6d9.png) | ハイパーパラメーターを設定し、モデルと Chat する ( パラメーターについては下記を参照 ) 。 |

推論時に設定できるパラメーターについて簡単に解説します。モデルによって設定できるパラメーターが異なるので、詳細はドキュメントを参照ください ( 例 : [Anthropic Claude のドキュメント](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-claude.html) ) 。

* Temperature: 低いほど確実な単語のみ採用する
* Top P: 出現確率が高い順に並べ合計 P になるまで採用
* Top K: 出現確率が高い上位 N 個から採用する
* Length: 出力長を制限
* Stop sequences: この文字列が出たら生成を停止する

Anthropic Claude は Human / Assistant の会話形式でやり取りするので、人間側の発話の頭につける "Human:" が出てきたら止めるよう指定しています。

Text を使うと対話形式にこだわらず入力したテキストに続くテキストを作成させることができます。次の図は、左図で入力したテキストの続きが右図で生成されています ( 緑のテキストの箇所 ) 。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/5db5181c-9f96-263a-cbe3-0c5e33942785.png)

Image では入力したテキストから画像が生成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/871203c5-c41b-8a2c-70b2-04176c99adff.png)

### 2.2 Bedrock API

CLI や SDK から API を呼び出すことで Bedrock を使うこともできます。 Bedrock には使える基盤モデルの情報を得たりカスタマイズするための [Bedrock API](https://docs.aws.amazon.com/cli/latest/reference/bedrock/) と推論を実行するための [Bedrock Runtime API](https://docs.aws.amazon.com/cli/latest/reference/bedrock-runtime/) の 2 種類があります。後者は現時点で invoke-model しかできません。 使えるモデルを Bedrock API で確認、実際に推論するには Bedrock Runtime API を呼び出す流れになります。

**Bedrock API** で、特定リージョンで使えるモデルを確認するための Python コードの例を示します。前述の Amazon SageMaker Studio で使うためのセットアップをしたうえで動作確認をしています。

```python
import boto3 
bedrock = boto3.client(service_name='bedrock', region_name='us-east-1')

bedrock.list_foundation_models()
```

AWS CLI の場合次のコマンドになります

```bash
aws bedrock list-foundation-models --region us-east-1
```

**Bedrock Runtime API** で、モデルを使った推論をするための Python コードの例を示します。

```python
import boto3
import json


brt = boto3.client(service_name='bedrock-runtime', region_name='us-east-1')

body = json.dumps({
    "prompt": "\n\n Human: カレーの作り方を教えてください。\n\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.1,
    "top_p": 0.9,
})

modelId = 'anthropic.claude-v2'
accept = 'application/json'
contentType = 'application/json'

response = brt.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)

response_body = json.loads(response.get('body').read())

# text
print(response_body.get('completion'))
```

出力は↓のような感じになります。

```
 はい、カレーの簡単な作り方を説明します。

材料(2人分)
- 牛肉または鶏肉 100g
- 玉ねぎ 1/2個  
- カレールウ 50g 
- カレー粉 大さじ1
- ガーリックミンチ 1/2小さじ
- トマトケチャップ 大さじ1
- 牛乳 大さじ2
- 塩コショウ 適量

作り方
1. 肉は適当な大きさに切る
2. 玉ねぎはみじん切りにする
3. フライパンに油を熱し、玉ねぎを炒める
4. 肉とガーリックミンチを加えて炒める
5. カレールウとカレー粉を入れてさらに炒める
6. トマトケチャップと牛乳を加え、水
```

AWS CLI の場合次のコマンドになります (AWS CLI v2 の場合、テキストが base64 でエンコードされるので `-cli-binary-format raw-in-base64-out \` の指定が必要です ) 。 AWS CLI 

```bash
aws bedrock-runtime invoke-model \
     --model-id anthropic.claude-v2 \
     --body "{\"prompt\": \"\n\nHuman: 肉じゃがの作り方を教えて\n\nAssistant:\", \"max_tokens_to_sample\" : 1024}" \
     invoke-model-output.txt
```

`invoke-model-output.txt` に返却された JSON データが保存されます。

### 2.3 LangChain

LangChain から Bedrock を使うこともできます。[公式ドキュメントの例](https://python.langchain.com/docs/integrations/llms/bedrock)がわかりやすいです。

```python
from langchain.llms import Bedrock
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory


llm = Bedrock(
    model_id="anthropic.claude-v2"
)

conversation = ConversationChain(
    llm=llm, verbose=True, memory=ConversationBufferMemory()
)

conversation.predict(input="Hi there!")
```

### 2.4 Anthropic SDK

Anthropic オフィシャルの SDK からも Bedrock を呼び出すことができます。公式ドキュメントの [Amazon Bedrock API](https://docs.anthropic.com/claude/reference/claude-on-amazon-bedrock) から使い方を確認できます。 

```python
import anthropic_bedrock
from anthropic_bedrock import AnthropicBedrock

client = AnthropicBedrock(
    aws_region="us-east-1",
)

completion = client.completions.create(
    model="anthropic.claude-v2",
    max_tokens_to_sample=256,
    prompt=f"{anthropic_bedrock.HUMAN_PROMPT} トンカツの作り方を教えて {anthropic_bedrock.AI_PROMPT}",
)
print(completion.completion)
```

### 2.5 Cohere AWS

Cohere からも AWS 専用の SDK が公開されています。 Cohere のモデルは AWS Marketplace で販売されているので、 Bedrock 以外に SageMaker にホスティングしたモデルの推論、 Fine Tuning を行う API も用意されています。次のコードは Bedrock を使って推論する例です。詳細は [cohere-aws](https://github.com/cohere-ai/cohere-aws) を参照ください。

```python
import cohere_aws

co = cohere_aws.Client(mode=cohere_aws.Mode.BEDROCK, region_name='us-east-1')
prompt = "Write a LinkedIn post about starting a career in tech:"
response = co.generate(prompt=prompt, max_tokens=50, temperature=0.9,
                       return_likelihoods='GENERATION', model_id='cohere.command-text-v14', stream=False)
print(response.generations[0]['text'])
```

## 3. Amazon Bedrock の利用状況を監視する

基盤モデルにどんな入力がされていて、どんな出力がユーザーの手元に入っているか、モニタリングしたいこともあると思います。まず、モデルの呼び出し (InvokeModel / InvokeModelWithResponseStream) は CloudTrail に記録されます。そのため、どのモデルがいつ呼び出されたのかは監視ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/79d0d603-4cfa-ec6c-55a7-6af106ce2ec0.png)

具体的なプロンプトの中身を記録する場合は Settings から Model invocation logging をオンにする必要があります。 Amazon S3 か CloudWatch 、もしくは両方にログを保存することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/d068461f-eda8-e0c4-b0e0-281c303837bb.png)

ここでは、入力したプロンプト、出力された回答、またハイパーパラメーターを参照することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/a81a0876-ccd5-37a3-9562-dc90db3fbd24.png" width=640>

### 3.1 不適切な使用をブロックする : Guardrails for Amazon Bedrock (Preview)

監視していて不適切な利用を発見し、そうした利用をブロックしたいことがあると思います。 2023/12 時点では Preview ですが、そのための機能として  Guardrails for Amazon Bedrock があります。特定のトピックに対する回答を制限したり、いわゆるコンテンツフィルターの機能を提供するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/4da70f2e-fa58-45c3-fffc-374fd5d41ae2.png)


### 3.2 上限を緩和する : Provisioned Throughput

Amazon Bedrock には Quota が設定されており、上限を超える利用ははじかれてしまいます。

[Quotas for Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html)

モニタリングの結果、上限に触れることが多い場合 [Provisioned Throughput](https://docs.aws.amazon.com/bedrock/latest/userguide/prov-throughput.html) の購入が選択肢になります。 Provisioned Throughput は、時間単位課金のユニットで、 input token の処理か output token の処理に適用し処理できる量を増やすことができます (input と output 両方の処理量を上げたい場合、 2 つ必要になります ) 。ユニットは、利用期間が長いほどディスカウントされるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/e9506a8d-fe51-aeb1-0f86-f7aa7937850a.png)

### 3.3 モデルをチューニングする : Fine Tuning

モデルの監視をしていて、うまく返答できていない傾向が見えることもあるでしょう。モデルに対する入出力データを蓄積しておくことで、モデルの挙動を調整する Fine Tuning に利用できます。 2023/11 時点でチューニングできるのは Amazon Titan のみですが、 Fine Tuning 、あるいはドメイン知識を新たに追加するための Continuout Pre-training を簡単に実行することができます。インプットデータを S3 に置き、ハイパーパラメーターを設定するだけで実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/4f9e3594-5447-ccb9-653a-168e4a250fbd.png)

チューニングしたモデルを利用する際は、先の [Provisioned Throughput を購入する必要がある](https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-inference.html)点に注意してください。

### 3.4 モデルの性能を評価する : Evaluation (Preview)

チューニングしたモデルがデプロイしても問題ないかどうか、事前に評価したいものです。 Amazon Bedrock では [Model evaluation](https://docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation.html) の機能が提供されています。自動評価か、人手評価の 2 種類を選択できます。自動評価の場合、要約などのタスクを選択しビルトイン、もしくは自前のデータセットで評価します。人手評価の場合、自前のチームか AWS にお願いして人を集めてデータセットに対し評価ができます。結果はいずれもコンソールから見ることができます。

| 自動評価 | 人手評価 |
|---------| ---------|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/da04a87d-a290-cbd9-e4b7-44c7308f2071.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/b403d2cc-de86-9a66-196d-8b591aa07b6c.png)|

詳細は次のブログを参照してください。

[Evaluate, compare, and select the best foundation models for your use case in Amazon Bedrock (preview)](https://aws.amazon.com/jp/blogs/aws/evaluate-compare-and-select-the-best-foundation-models-for-your-use-case-in-amazon-bedrock-preview/)

## 4. Amazon Bedrock を応用しアプリケーションを作る

AWS では、 Amazon Bedrock で使える基盤モデルを素材として、プロセスやアプリケーションを構築する方法をいくつか提供しています。

### 4.1 Agents for Amazon Bedrock

Agents for Amazon Bedrock を使うことで、基盤モデルを旗振り役として適切なバックエンド処理を呼び出すアプリケーションを作成できます。バックエンド処理はプログラム処理か検索を設定できます。プログラム処理は、 OpenAPI 形式で定義し処理の実態を AWS Lambda で実装します。検索は Knowledge base で作成し、実体はベクトル検索エンジン ( デフォルトでは OpenSearch Serverless ) になります。次の図は[ドキュメントに掲載されている処理フロー](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html)です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/0f6a369a-30ef-2ef4-c278-629912514922.png" width=512>

今回は、 Knowledge base を使用し、与えた知識に基づき回答してくれるエージェントを作成してみます。

|   | スクリーンショット | 操作 | 
|---- | ----------------- | ---- | 
| 1   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/6b09c691-d7dc-2075-73fd-c415e1ffbc48.png) | メニューから "Knowledge base" を選択。データソースとなる Amazon S3 を選択するだけで作成できます。ベクトル表現には Amazon Titan 、ベクトル検索には OpenSearch Serverless がデフォルトでは選択されます。 |
| 2   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/6f0ca622-49e4-73ec-5ac3-63b4fa38f1f7.png)| Knowledge base を作成後、 Data source の Sync を実施 ( これを実施しないと、インデックスが作成されません ) 。 |
| 3   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/fa2b82a3-d42e-5aab-e93a-29d119c4b7f3.png) | Knowledge base の段階でテストを実施。 Amazon S3 に保管したドキュメントに関する質問をしてみてください。きちんと引用した答えが返ってきたら正常にインデックスが作成できています。 |
| 4   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/5c9a5fc5-a4a3-7ea1-a0e7-ce9f86a57799.png) | メニューから "Agent" を選択。  |
| 5   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/732a5772-c61f-ece4-117b-de7d5b4dc9da.png) | Add Action Groups はスキップし、作成した Knowledge base を選択。 |
| 6   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/d84c14a8-c5dc-297a-2fbc-501b3a65b145.png) | Knowledge base と同様にテストする。 Agent の返答の末尾にある "Show trace" を押すことで、エージェントがどのようなプロンプトで問い合わせたのか、どんな検索結果が帰ってきたのか参照できる。 |

Action Group 、 AWS Lambda を使った Agent は [Where Are You Christmas? At Agents for Amazon Bedrock! 世界最速(?) Agent for Amazon Bedrock デモ](https://qiita.com/kazuneet/items/36f6d42fecbad0469d35) で解説しています。

なお、 Knowledge base を削除しても Vector Store は消えない点に注意してください。

### 4.2 AWS Step Functions

AWS Step Functions からも Amazon Bedrock のイベントが呼べるようになりました。詳細は [Build generative AI apps using AWS Step Functions and Amazon Bedrock](https://aws.amazon.com/jp/blogs/aws/build-generative-ai-apps-using-aws-step-functions-and-amazon-bedrock/) で紹介されています。今回は AWS Lambda でプロンプトを作成して Amazon Bedrock で生成した結果を Amazon S3 に保存する Step Function を作成してみます。 2023/12/1 時点では、 Amazon Bedrock への入出力は Amazon S3 を経由する必要があります。

|   | スクリーンショット | 操作 | 
|---- | ----------------- | ---- | 
| 1   |  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/7f95e5dd-fffb-bab5-a398-009d4297b1ff.png) | プロンプトを生成し S3 に保存する AWS Lambda を作成。今回は Anthropic Claude 用のプロンプトを作成しました。サンプルコードは ( ※ 1 を参照してください) |
| 2   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/1d033886-fef2-9574-47fe-6fb869ae2c43.png) | StepFunction を作成。先ほど作成した AWS Lambda と BedrockInvokeModel をつないだ Function を作成しました。 BedrockInvokeModel の Configuration では、 Bedrock Model Parameters で入力となる S3 のパスと出力となる S3 のパスを設定します。 |
| 3  | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/544c6b1c-f0b3-a52a-9295-90326f65e1a3.png) | StepFunction を保存。私の場合、ロールの作成がうまくいかなかったので必要な権限をつけたロールを自前で作成しました。|
| 4 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/bc26972e-c135-ed8c-c0ce-573a717de2e4.png) | StepFunction を実行。設定した Amazon S3 のファイルに出力結果が記録されている。 |

※ 1 : プロンプトを生成する AWS Lambda のサンプルコード。 Node.js v18 で書いています。

```javascript
console.log('Loading function');
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
const client = new S3Client({});

export const handler = async (event, context) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('prompt=', event.prompt);
    var prompt = `\n\nHuman: Please answer the question as a professional consultant. \n\n <question>${event.prompt}</question> Assistant:`

    const command = new PutObjectCommand({
        Bucket: 'amazon.bedrock.stepfunction.001',
        Key: 'prompt/generated.json',
        Body: JSON.stringify(
        {
            "prompt":prompt,
            "max_tokens_to_sample": 200
        }
        ),
        ContentType: 'application/json'
    });
    

    try {
        const response = await client.send(command);
        console.log(response);
    } catch (err) {
        console.error(err);
    }

    return prompt;
    // throw new Error('Something went wrong');
};

```

StepFunction への入力例

```json
{
  "prompt": "Please tell me about Amazon S3"
}
```

AWS Lambda が保存する Amazon Bedrock への入力ファイル。

```json
{
  "prompt": "\n\nHuman: Please answer the question as a professional consultant. 
            \n\n<question>Please tell me about Amazon S3</question> Assistant:",
  "max_tokens_to_sample": 200
}
```

Amazon Bedrock が出力する Amazon S3 のファイル ( 適宜改行を入れています ) 。

```json
{
   "completion":" Here is how I would respond as a professional consultant:
   \n\nAmazon Simple Storage Service (Amazon S3) is a highly scalable cloud storage
   service that can be used to store and retrieve any amount of data from anywhere on
   the web. Some key things to know about Amazon S3:\n\n- Storage Model: S3 uses a 
   simple web services interface that can be used to store and retrieve any amount 
   of data, at any time, from anywhere on the web. Data is stored in \"buckets\" 
   which organize objects within the S3 namespace. \n\n- Scalability: S3 provides
   unlimited storage for any type of data including texts, media files, application 
   data, and more. It provides 99.999999999% durability with redundancies across 
   multiple data centers. Capacity can scale easily without performance degradation.
   \n\n- Access Control: S3 supports granular access control to objects stored using
   Identity and Access Management. You can set permissions for individual accounts 
   or groups to control who can",
   "stop_reason":"max_tokens",
   "stop":null
}
```

実際は入出力のファイルにタイムスタンプをつけて管理するとよいと思います。 StepFunction での処理は画像を生成した後に超解像して Crop して・・・といった一連の処理を実装するのに向いていそうです。

### 4.3 Amazon Q

Amazon Q は Business と Builder の 2 種類があり、まず「どっちの Q? 」を明確にする必要があります。ユーザー単位課金のため、外部向けのサービスを作るというより社内での生成系 AI 活用を促すサービスです。

#### [Amazon Q For AWS Builder Use](https://docs.aws.amazon.com/amazonq/latest/aws-builder-use-ug/what-is.html)

AWS Console から見える Amazon Q は "AWS Builder Use" です。月額 \\$25 / ユーザーの価格が提示されていますが、プレビュー中はコストがかかりません。将来的には、課金すると使えるようになるのだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/c787df3e-3fa4-a087-7dcd-a8eb95697aa6.png)

Pricing のページの通り、 "AWS Builder Use" は "Business Use" よりリッチなプランになります。そのため、 "Business Use" で使える機能は "AWS Builder Use" でも使うことができます。逆に言うと、 開発用途だから "Business Use" の機能を外して \\$25 を安くすることは現時点ではできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/beb7771c-1529-a1ab-8a0d-e4fe0a8b4123.png)

"AWS Builder Use" の Amazon Q は、先の図の通りアイコンを押せばいつでも呼び出すことができます。また、 [IDE にインストールして使うこともできます](https://docs.aws.amazon.com/amazonq/latest/aws-builder-use-ug/q-in-IDE-setup.html)。ドキュメントで言及されている Amazon Q のサービス提供範囲は次の通りです。

* AWS Management Console
* AWS Marketing Website
* AWS Documentation
* IDEs
* AWS Console Mobile Application

Pricing のページを見ると、 Amazon CodeCatalyst や Amazon RedShift の Query Editor 、 Amazon QuickSight も含まれます。 Amazon QuickSight にはすでに "Q" と呼ばれる機能があり、 Author の場合は月額 \\$34 がかかります。 Amazon Q 提供する機能と "Amazon QuickSight Q" で提供される機能は現時点で差異があるので、おそらく別々に料金がかかると考えています。この点については明確になり次第追記します。

[AWS Chatbot](https://aws.amazon.com/jp/chatbot/) を使うことで、チームの Slack や Microsoft Team に召喚することもできます。 Classmethod さんが早速ブログを書いてくれているのでご参考ください。

[Amazon QとSlackを連携してみた](https://dev.classmethod.jp/articles/tried-linking-amazon-q-and-slack/)

#### [Amazon Q For For Business Use](https://docs.aws.amazon.com/amazonq/latest/business-use-dg/what-is.html)

"Business Use" の主要な機能は生成系 AI を用いた業務用・開発用アシスタント、 Amazon Q application が作れることです ( 前述の通り、 "AWS Builder Use" は上位プランになるため Builder User でもこのアシスタントは作成できます) 。 月額 \\$20 / ユーザーの料金に加え、回答に使用する知識ベースについて 20,000 文書につき \\$0.14/ 時間 (\\$100/ 月 ) が必要です。また、 "Business Use" については最低 10 名が必要な点に注意してください。

[Amazon Q pricing](https://aws.amazon.com/jp/q/pricing/)

アプリケーションは裏側で Amazon Bedrock を使用しているものの、その存在を意識することはありません。画面をポチポチしていくだけでアプリケーションを作ることができます。次は AWS Console から "Amazon Q" のページにアクセスした画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/97d40d0f-428e-71b6-295e-e57fa9fbcd28.png)

Amazon Q でのアプリケーション作成方法は次の通りです。 Preview 時点では英語のみ対応のため、英語で試しています。また、 AWS アカウントの Organization への参加が必要なようです。

|No   | スクリーンショット | 操作 | 
|---- | ----------------- | ---- | 
| 1   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/1d738b39-8748-46e5-3ff4-6f730f8339ee.png) | "Create application" を実行。 |
| 2   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/1f858bae-cb4b-fa6d-4b58-d7c7329af4c3.png) | Retrievers を選択。 Kendra の検索エンジンがあれば選択できます。 "Index provisioning" は増やすほど固定で課金されるため、必要十分な値を設定することを推奨します。 |
| 3   | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/0e7288fa-5b2a-f15b-b5be-0a8af92a9077.png) | Data source を選択。今回は "Web crawler" を選択し、外部サイトからクローリングし情報をとるよう選択しました。 |
|4    | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/3ede23b6-8e88-aa6c-4ac3-9e949d01832c.png) | Data source で "Sync now" を実行 |
|5    | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/a88ebcb7-2ce7-60d4-e6e9-35aadd5bfe96.png) | "Preview we experience" で回答をテスト。 |

作成した Amazon Q のサンプルです。 [Anthropic Claude の Prompt Guideline](https://docs.anthropic.com/claude/docs/introduction-to-prompt-design) をクローリングして、プロンプトのアドバイスがもらえるボットを作ってみました。クローリングの時間は 20 分程度でした。取り込んだドキュメントを引用して回答していることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/e58158f7-7689-181e-ab05-8f7c4412952f.png)

外部の identity provider (IdP) と連携し、限られたユーザーにアプリケーションを公開することができます。また、次の GitHub のコードを使うことで Slack と連携できます。

[amazon-q-slack-gateway](https://github.com/aws-samples/amazon-q-slack-gateway/tree/main)

### 4.4 PartyRock

PartyRock は無料かつ AWS アカウント不要で生成系 AI を利用したアプリケーションが作れるサービスです。裏側は Amazon Bedrock が使われています。

https://partyrock.aws

アプリケーションの共有ができるので、アイデアをアプリケーションにしてみてもらうのに最適です。たとえば [レシピジェネレーター](https://partyrock.aws/u/icoxfog417/43Qqyv_kC) は、私が作成して公開したアプリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/d2bd0814-dd0f-865d-42bb-481cd2a30a53.png)

詳細な使い方は以下の記事を参照してください。

[PartyRock : 誰でも生成系 AI のアプリケーションを作成し共有できるサービス](https://aws.amazon.com/jp/blogs/news/create-generative-ai-app-with-partyrock-amazon-bedrock/)

### 4.5 AWS Sample

Amazon Q が魅力的なものの、日本語に対応していないとちょっと、という場合もあると思います。 AWS では、日本語が使える生成系 AI のサンプルを OSS で公開しているので最後にご紹介します。

#### [bedrock-claude-chat](https://github.com/aws-samples/bedrock-claude-chat)

日本語が扱える Anthropic Claude を使ったチャットシステムが簡単に作れるサンプルです。 CDK でデプロイでき、認証・ IP アドレス制限もできるのでセキュアに使用することができます。 Markdown のレンダリングにも対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/16422365-6e10-7bff-5055-c445ee306a4a.png)

#### [Generative AI Use Cases JP](https://github.com/aws-samples/generative-ai-use-cases-jp)

チャットだけでは物足りない時はこちらです。 RAG や要約、画像生成といった様々なユースケースを試すことができます。こちらも CDK でデプロイできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/9449dd96-d701-7446-063f-22e2b5843157.png)

## おわりに

本記事では、 Amazon Bedrock の準備方法からアプリケーション開発の方法まで幅広にご紹介しました。生成系 AI を使った開発の参考になれば幸いです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/a37e0b18-9c3d-032c-14bf-924b3c6767fb.png)