LangChainを使用してBedrockのモデルを呼び出してみる

# はじめに
この記事ではLangChainでBedrockのモデルを呼び出す方法について紹介します。
LangChainを使用することでLLMモデルやプロンプトの管理を効率的に行うことができます。

Amazon SageMakerのNotebookを使用します。

初めて触る方向けに画像多めで説明していきます。

この記事を読むことで、Bedrockのモデルの呼び出し方法の他、
Jupyterの基本操作についても知ることができます。


記事の構成は以下になります。

1.**使用するもののリンク紹介**
- Amazon SageMaker
- Amazon Bedrock　
- LangChain

2.**実際に呼び出しを行う**
- 事前準備
- Jupyter基本操作
- 実行


3.**まとめ**



# 使用するものの概要説明

#### Amazon Bedrock
いろいろな生成AIモデルを簡単に使えるようにしたプラットフォームです。
インフラ管理が不要で、必要なときに使いたいモデルを選んで利用できます。

https://aws.amazon.com/jp/bedrock/



#### Amazon SageMaker
Amazon SageMakerは、AWSが提供する機械学習プラットフォームで、データ準備、モデル構築、トレーニング、デプロイまでを簡単に行えるツールです。
今回は、SageMaker上でJupyter Notebookを使い、Amazon Bedrockのモデルを呼び出す部分にフォーカスします。


https://aws.amazon.com/jp/sagemaker/


#### LangChain
言語モデル（LLM）の活用をより簡単かつ強力にするためのPythonライブラリです。
複雑なタスクを構築可能なモジュール化された設計が特徴で、プロンプト作成やモデルとの対話を効率化します。

https://python.langchain.com/docs/introduction/


## 事前準備
本記事では、東京リージョンで作成していきます。

#### Bedrockモデルの選択

最初に使用したいモデルを有効にします。
今回はClaudeのモデルだけ有効化したいので、特定のモデルを有効にするを選択します。

![スクリーンショット 2024-12-22 18.35.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/36fc8c50-2479-6402-b271-79228c64576a.png)


画像のようにモデルを選択し、次へ
![スクリーンショット 2024-12-22 18.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/1a2cd8ae-209b-e318-4cff-40417019c30d.png)

選択したモデルを確認したら、送信します。
![スクリーンショット 2024-12-22 18.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/d9a5a6cf-c916-1b0d-584e-53930ec9bf7f.png)

アクセスが付与されたのを確認したらBedrockのモデル選択は完了です。
![スクリーンショット 2024-12-22 18.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/438f2dc7-7117-8081-faba-3e8048189803.png)

※時間差でAWS Marketplaceからアクセス許可のオファーが受け入れられた旨のメールが来ます。


#### IAMの準備
SageMakerでNotebookインスタンスを作成する前に、アタッチするIAMロールを作成しておきます。

##### IAMポリシーの準備
今回ロールにアタッチするのポリシーは以下の二つです。

- AmazonSageMakerFullAccess（検証用の為フルアクセスを選択）
- Bedrockのカスタムポリシー

Bedrockのポリシーはカスタムポリシーになるため先に作成しておきましょう。
Bedrockのモデルを呼び出しの許可と、使用できるLLMのリストを取得できるポリシーになります。
以下のコードをコピーして、IAMのポリシー作成画面からJSONを貼り付けます。

```json:bedrock_policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModel",
                "bedrock:ListFoundationModels"
            ],
            "Resource": "*"
        }
    ]
}
```

IAMポリシーの作成画面をビジュアル→JSONに切り替えて、上記のコードをコピペし次へ進みます。
![スクリーンショット 2025-01-03 17.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/6878ef82-4e1d-e17a-c5fa-4dcf850723ad.png)

今回は「bedrock-policy」という名前でポリシーを作成しましょう。
![スクリーンショット 2025-01-03 17.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/4caf51c0-11b0-61cc-4ada-3998e826226a.png)

これで本記事で使用するBedrock用のIAMポリシーの作成は完了です。
続いてIAMロールの作成を行なっていきます。

##### IAMロールの準備

IAMロールの画面から新しいロールの作成をクリックし、ユースケースはSageMakerを選びます。
IAMロール名は「sagemaker-bedrock-role」とします。
![スクリーンショット 2024-12-30 22.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/2d9b93ef-5966-a1b3-40d8-9357fc33e134.png)


まずはAmazonSageMakerFullAccessのみをアタッチして作成します。
![スクリーンショット 2024-12-30 22.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/11b6c50c-43ec-fae9-d219-9dfb86f61fd3.png)

IAMロール一覧から「sagemaker-bedrock-role」を選択し、
許可タブから許可を追加→ポリシーをアタッチをクリックします。
事前に作成しておいた「bedrock-policy」を選択し、許可を追加します。
![スクリーンショット 2025-01-03 17.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/f01c31f5-abc3-7b6a-a958-da204a02ddac.png)


二つのポリシーがアタッチされたことを確認できたらIAMの準備は完了です。
![スクリーンショット 2025-01-03 17.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/099aa2fb-e495-e252-4a8f-bfa9f9701765.png)



#### Notebookインスタンスの設定
SageMakerのページからNotebooksをクリックしノートブックインスタンスの作成を行います。
![スクリーンショット 2024-12-22 18.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/e7c3f08c-f10f-bd91-6377-b816d2e5376d.png)


インスタンスの設定について、今回は画像のように設定します。

![スクリーンショット 2024-12-22 19.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/bd4c90dd-a8af-2522-515a-750fd50381c0.png)


IAMロールは先ほど作成したロールを選択します。
他の項目は今回変更せずに作成します。
![スクリーンショット 2024-12-22 19.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/1a8a4c98-7e25-98b9-047e-c94eeb0bb9e2.png)

ステータスが緑になり、起動を確認したら、Jupyterを開きます。

![スクリーンショット 2024-12-22 20.16.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/8c19ce38-83bb-8a8d-48ba-b4564f9e9f61.png)

## Jupyter操作
基本操作の説明を行います。
不要な場合はスキップしてください。
- ファイル作成
- ファイル名の編集
- セルの説明
- セルのマークダウン

#### ファイルの作成
Newから新しいファイルを作成できます。
今回はconda_python3を選択します。

![スクリーンショット 2024-12-22 20.21.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/f082f4dd-97df-e1ee-4b75-c51022f7ed49.png)

#### ファイル名の編集
Untitledをクリックすると編集できるので、変更してみましょう。
※名前の変更時、拡張子を削除しないように注意してください。
　無いと表示がjson形式になってしまいます。
![スクリーンショット 2024-12-22 20.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/276d1bed-aa12-35c9-d8ed-292bd4ec9a0f.png)

#### セルの説明
青く囲われている箇所が現在選択している「セル」と呼ばれるものです。
このセルにコードを記述していきます。

Shift + Enterで選択しているセルのコードを実行することが出来ます。
Jupyterの特徴の一つとして、コードの実行をセル単位で行うことができる点が挙げられます。

![スクリーンショット 2024-12-22 20.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/e903a3a7-6ad9-2ade-f8b8-62fb2e6c4656.png)

セルの端にあるアイコンは左から以下のような意味があります。
複製、セルを上に移動、セルを下に移動、上にセルを追加、下にセルを追加、削除
![スクリーンショット 2024-12-22 20.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/88a89c2f-31ac-437d-a3ea-cc7998a2e9a2.png)


セルを折りたたむこともできます。
対象のセルを選択して、横の太い線をクリックすると折りたたむことができます。
長いコードや出力結果がある際に、使用しない時は折り畳んでおくことでノートブックのスクロールがしやすくなります。


折りたたむ前
![スクリーンショット 2024-12-22 20.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/a234219b-6ffb-3d28-9b84-51b52879f1e4.png)

折りたたんだ後
![スクリーンショット 2024-12-22 20.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/d62c700c-2084-7cbc-a5f9-745381fcd64c.png)


#### セルのマークダウン
また、Notebookにマークダウンをつけることもできます。
セルを選択して、codeからMarkdownを選択します。
画像は「# 見出し」と入力して、Shift + Enterを叩いた例になります。
![スクリーンショット 2024-12-22 20.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/02a5f979-811c-1ee6-19d9-2bb03697d720.png)


## 実行
#### 必要なライブラリなどのインストール・設定
画像のように各コードを実行していきます。
![スクリーンショット 2024-12-22 21.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/9efa53be-ed43-17e2-c87c-d99c7f0f09ad.png)


```python:cell_1
# ライブラリのインストール
pip install langchain langchain-aws
```


```python:cell_2
# クラスのインポート
from langchain_aws import ChatBedrock
from langchain.prompts import PromptTemplate
```

```python:cell_3
# LLMの設定
model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0"

llm = ChatBedrock(
    model_id=model_id,
    region_name="ap-northeast-1"
)
```


region_nameの値は東京リージョンでの例です。使用するリージョンに応じて変更してください。
Model IDはBedrockのModel catalogから確認することができます。
使用したいモデルのページを参照してください。
![スクリーンショット 2024-12-22 21.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/46a228f4-b595-3d08-1117-0d045a349d3c.png)


#### システムプロンプトの設定
templateにシステムプロンプトを設定します。
ここで、回答のフォーマットを事前に指定したり、回答生成の際に使用する事前情報を設定ことができます。
今回は語尾が「ナレ」になるように設定してみます。

![スクリーンショット 2024-12-22 21.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885031/27d4cbd6-7ec9-3e2f-8ebb-ae547b2cf0ff.png)

```python:cell_4
# システムプロンプト
template = """
語尾に「ナレ」を付けて質問に回答してください。

{question}
"""

# プロンプトに入力される値の設定
# この例ではユーザーからの質問のみを入力
prompt = PromptTemplate(input_variables=["question"], template=template)

# どのプロンプトをLLMに渡して生成させるか設定
chain = prompt | llm
```


#### ユーザープロンプトの設定
```python:cell_5
# ユーザーからの質問
question_apple = """
リンゴは何色？
"""

# 回答の呼び出し
answer = chain.invoke({"question": question_apple})
print(answer.content)
```

# まとめ
この記事ではLangChainを使用してBedrockのClaude 3.5 Sonnetモデルの呼び出しを行いました。
システムプロンプトには、出力フォーマットの定義や情報の追加など、いろいろ設定することが出来ます。
LangChainを使用することで、語尾を「ナレ」にするプロンプト以外も個別に作成して管理しやすくなり効率的にLLMを実行することができます。

先月のre:Inventで発表されたAmazonの新しい基盤モデル「Nova」など、Bedrockでは様々なモデルを使用することができるのでぜひ試してみてください。