Amazon Bedrockで生成AIアプリケーションを構築する際に最初に考えること4選

# 目的
もうどこもかしこも話題は生成AIばかりですね。
今や中学生でもchatGPTをブラウザ上から遊ぶ程度には触っているのではないでしょうか。

今回は実際にAmazon Bedrockを使って生成AIアプリケーションを構築する際に、
考えるべき事柄4選を順番にまとめました。

 :::note warn
※ここではそれぞれを深ぼりません。
　詳細は各ドキュメントを参照ください。
:::

公式サイトはこちら↓
https://aws.amazon.com/jp/bedrock/

本記事は[AWS INNOVATE AI/ML AND DATA EDITION](https://aws.amazon.com/jp/events/aws-innovate/apj/aiml-data/)の内容を参考にしています。

# 1. 基盤モデル（FM）の選択
まずは兎にも角にもモデルの選択を行います。
2024年3月現在、Amazon Bedrockでは様々な基盤モデルが扱えます。
各々のやりたいことに沿ったモデルを選びます。

- AI21labs -> [JURASSIC-2](https://aws.amazon.com/jp/bedrock/jurassic/)
- ANTHROPIC -> [CLAUDE](https://aws.amazon.com/jp/bedrock/claude/)
- co:here -> [COMMAND & EMBED](https://aws.amazon.com/jp/bedrock/cohere-command-embed/)
- Meta AI -> [LLAMA 2](https://aws.amazon.com/jp/bedrock/llama-2/)
- stability.ai -> [SDXL 1.0](https://aws.amazon.com/jp/bedrock/stable-diffusion/)
- amazon -> [AMAZON TITAN](https://aws.amazon.com/jp/bedrock/titan/)

それぞれのモデルでできること（テキスト生成・画像生成・埋め込み）が異なります。
各ページを確認しましょう。

2024年3月時点では日本語のテキスト生成を行いたい場合、**Claude**一択かと思われます。

中には同じことができるモデルがあります。
その場合はユースケースに最適なモデルを選択する必要があります。

## ユースケースに最適なモデルの選択
2023年末、[Model Evaluation on Amazon Bedrock](https://aws.amazon.com/jp/blogs/aws/evaluate-compare-and-select-the-best-foundation-models-for-your-use-case-in-amazon-bedrock-preview/) という機能がBedrock上で利用可能になりました。
これは複数の基盤モデルをコード不要で比較・評価し、ユースケースに最適なモデルを選択可能にします。

# 2. 独自データの活用方法を考える
Bedrockの基盤モデルをそのまま扱うだけでも、生成AIアプリケーションを作ることは可能でしょう。
ただし、それでは一般的な汎用性しか持ちません。
加えて、基盤モデルは学習データに含まれていないような情報は回答できません。（例えば最近起きたニュースなど）
生成AIアプリケーションを作ろうと考えた場合、他と差別化を図るために大抵は独自データの活用を視野に入れます。

:::note alert
基盤モデルは最新のデータや特定の組織独自のデータには対応できない（学習していない）
:::

そこで重要になってくるのが**RAG(検索拡張生成)** と **ファインチューニング** になります。
先に答えを言うと以下のように使い分けます

:::note info
プロンプトの調整 -> RAG(検索拡張生成)
モデル自体の更新(再学習) -> Fine Tuning / Continued Pre-training
:::

## RAG(検索拡張生成)
RAGを使うケースは以下が考えられます。
- 検索システムのレスポンスを元に基盤モデルの回答を出力させたい場合
- **最新情報を出力に反映**させたい場合
- **プロンプト内で与えられた知識**のみで**十分対応可能**な場合

:::note info
### RAGとは
基盤モデルの裏に独自データを格納しておくデータベースを用意しておくことで、
ユーザーからクエリを受け取った際に基盤モデルは自身が持つデータに加え、データベースからも関連情報を取得し回答することができる。
:::

### BedrockでRAGを行うためには
[Knowledge Bases for Amazon Bedrock](https://aws.amazon.com/jp/bedrock/knowledge-bases/) 機能を活用します。
これは基盤モデルと自社データソースを組み合わせたRAGをフルマネージドに提供してくれます。


## ファインチューニング
ファインチューニングを使うケースは以下が考えられます。
- 独自のデータを用いて追加の学習を行うことで、モデル自体のカスタマイズを行いたい場合
- 出力のスタイルやドメイン知識の補完など、**モデルの振る舞いをカスタマイズ**したい場合
- **特定のユースケース**における推論の**コストパフォーマンスを最大限に高めたい**場合

:::note info
### ファインチューニングとは
独自データを用いて追加の学習を行うことで、モデル自体のカスタマイズを行う。
:::

### Bedrockでファインチューニングを行うためには
Bedrockでのファインチューニングは [カスタムモデル](https://docs.aws.amazon.com/bedrock/latest/userguide/custom-models.html) を作ることになります。
その方法は2つあります。
- **Fine Tuning**
    - ラベル付きデータを新たに学習して、**特定のタスクの精度を高める**手法
    - 入力と出力のペアを用意してファインチューニングを行う
    - 主に出力のスタイルをカスタマイズしたい場合に有効
- **Continued Pre-training**
    - 大量のラベル無しデータを用いて**モデルに新たなドメイン知識を習得させる**手法
    - テキストデータを用意してファインチューニングを行う

以下のブログも参考にしてください。

https://aws.amazon.com/jp/blogs/aws/customize-models-in-amazon-bedrock-with-your-own-data-using-fine-tuning-and-continued-pre-training/

:::note warn
ファインチューニングをする際の選択肢として**Amazon SageMaker JumpStart**も挙げられる。
ここでは割愛！
ただ、SageMaker JumpStartでは**より詳細なカスタマイズが可能**。
:::

## RAG(検索拡張生成)とファインチューニング
:::note info
プロンプトの調整 -> RAG(検索拡張生成)
RAGとファインチューニングで特徴は異なる。
**目的に応じて使い分けたり、併用したりする**
:::

# 3. 外部のデータやAPIとの連携を考える
基盤モデル単体では外部との連携が必要なタスクの実現は難しいものになります。
そのため、外部API連携と組み合わせてタスクの完了までを実現させる必要があります。

:::note alert
基盤モデルはそのままでは外部API連携ができない
:::

そこで重要になってくるのが **Agent** になります。

## Agent
Agentはユーザーの入力を複数のタスクに分割し、タスクごとに適切なAPIを呼び出すことで回答を生成します。
たとえばユーザー入力に対してAgentの役割はこのような感じになります。

```:ユーザー入力
ARIの会社情報を教えてください。
それと、ARIに関する最近のニュースを教えてください。
```

```:Agent
思考：
（文脈によると、ARIは企業名だな。）
（会社情報は回答できそうだ。最近のニュースについてはWebやKnowledge Baseから検索してくる必要があるな。）
（これらの情報をまとめたら、回答が生成できそうだ。）

回答：
ARIの会社情報は○○です。
最近のニュースは××です。
```

### BedrockでAgentを行うためには
[Agents for Amazon Bedrock](https://aws.amazon.com/jp/bedrock/agents/) 機能を活用します。
これはAPIを呼び出しタスクを実行するAgent機能をフルマネージドで提供してくれます。

## その他
他には以下のような候補があります
- LangChainの活用
- AWS Step Functionsとの統合

※ ここでは割愛します。

# 4. 生成AIアプリの適切な利用状況の維持と安定稼働を考える
生成AIアプリを作る場合、生成AIが不適切な利用や有害な結果の出力を避けられているか、
ユーザーのリクエストに安定的にこたえられているか、管理・維持する必要があります。

その際に活躍するのが以下の機能になります。
ここでは詳細は割愛しますが、アプリのリリース前には考慮するようにしましょう。

- [Guardrails for Amazon Bedrock](https://aws.amazon.com/jp/bedrock/guardrails/)
    - 基盤モデルの不適切な入出力をブロックし、責任あるAIポリシーを実現します
- [Model invocation logging](https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html)
    - 基盤モデルの入出力結果をログとして記録します
- [Provisioned Throughpu](https://docs.aws.amazon.com/bedrock/latest/userguide/prov-cap-console.html)
    - スループットを確保し安定したAPI実行を可能にします


# まとめ
これからは生成AIが使えて当たり前の世の中になります。
アプリケーションを作る際にもいかに生成AIを活用するかが今後生き残れるかの分かれ道になるといっても過言ではありません。

今回はAmazon Bedrockに焦点を当てましたが、興味がある人もない人も知識だけでも入れるようにしときたいですね。