DifyでAWSのAmazon Bedrockが提供するLLMを安全に利用するための設定方法を詳しく解説します。
なぜDifyでAmazon Bedrockのモデルを使うのか
- 設定が簡単:他のAIプロバイダーと比べ、API利用のための設定が簡単だと思います。
- AWSアカウントとの連携:既存のAWSアカウントを活用できるため、新たな登録や支払い設定が不要です。他のプロバイダーのAPIを利用する場合は別途支払い情報などの登録が必要です。
- 豊富なモデル:Bedrockを通じて、AnthropicのClaude 3シリーズを含む様々な最新のLLMが利用できます。
Bedrockのモデルを利用する方法
Difyでモデルを追加するには
まず、Difyで利用できるモデルを追加するには利用したいモデルを追加する必要があります。初期状態だと、OpenAIとAnthropicが表示されています。
利用するための流れ
それでは、Amazon Bedrockと連携する方法を紹介します。連携するために必要な情報やIAMでの権限設定など含めて紹介します。
簡単にまとめると以下のステップで連携できます。
- 【AWS】適切な権限を持つIAMユーザーの作成
- 【AWS】IAMユーザーのアクセスキー、シークレットアクセスキーを作成
- 【Dify】使用したいモデル名とIAMユーザーのアクセスキー、シークレットアクセスキーDifyに登録
- 【Dify】DifyのLLMでモデルを選択
必要な情報
上記でも触れていますが、DifyがBedrockと連携しモデルを利用するために必要な情報は以下となります。この必要な情報を準備するため以下の手順で解説します。
項目 | 内容 |
---|---|
Access Key | アクセスキー |
Secret Access Key | シークレットアクセスキー |
AWS Region | リージョン |
Available Model Name | モデルID |
【AWS】IAMユーザーの作成
アクセスキー、シークレットアクセスキーを作成するためにはIAMユーザーを作成します。アクセスキーなどを発行するということで、まずは最低限の権限を持ったユーザーを作成するためのIAMポリシーを作成します。
IAMポリシー設定
以下のIAMポリシーを作成します。Difyではチャットボットのような対話型アプリケーションでストリーミング出力されるため下表の権限を追加します。
今回は「AllowClaudeHaikuInvocation」というポリシー名で作成しました。
ポリシー | 説明 |
---|---|
bedrock:InvokeModel | ・Bedrock の基盤モデルを呼び出して推論を実行するために必要 |
bedrock:InvokeModelWithResponseStream | ・ストリーミングレスポンスをサポートするモデルに対して推論を実行するために使用される ・チャットボットのような対話型アプリケーションで、リアルタイムでレスポンスを受け取りたい場合に有用 |
IAMポリシー(JSON)
今回はClaude 3 Haikuのみ利用するためのIAMポリシーを作成しました。Resourceには利用するBedrockのモデルのARNを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0"
}
]
}
IAMユーザーを作成しポリシーをアタッチ
下表のように設定し、ユーザーを作成します。
項目 | 値 |
---|---|
ユーザー名 | dify |
許可のオプション | ポリシーを直接アタッチする |
許可ポリシー | AllowClaudeHaikuInvocation(上記で作成したカスタマー管理ポリシー) |
アクセスキーを入手
作成したIAMユーザーの「セキュリティ認証情報」タブへ移動し、「アクセスキーを作成」をクリックします。次に、ユースケースで「AWS の外部で実行されるアプリケーション」(他なんでも良いと思うが)を選択の上「アクセスキーを作成」をクリックします。
アクセスキー、シークレットアクセスキーが生成されるため安全な場所へ保存しておいてください。
【Dify】Bedrockのモデルを利用するための設定
アクセスキー・モデル名登録
「Difyの設定→モデルプロバイダー」からAWS,Bedrockの「セットアップ」を選択します。
下図のような入力画面が表示されるため、先ほど取得したアクセスキーなどの情報を入力します。
項目 | 値 |
---|---|
Access Key | 取得したアクセスキー |
Secret Access Key | 取得したシークレットアクセスキー |
AWS Region | 利用するモデルのリージョン (ポリシーで指定したARNに記載のリージョン) |
Available Model Name | 利用するモデルID |
アクセスキーなど設定完了後
アクセスキーなどを入力して保存するとモデルプロバイダー一覧にAWS,Bedrockが表示されていることが確認できます。
「モデルの表示」をクリックすると利用できるモデル一覧が表示されます。ここに表示されるのは、あくまでもDifyとBedrockを連携することで利用できるようになるモデル一覧で、IAMポリシーで許可したモデルとは関係ないみたいです。デフォルトで多くのモデルが利用できそうに見えています。
【Dify】Bedrockのモデルをチャットボットに設定する
チャットボットの作成
以前作成したチャットボットが残っていたので利用します。変数のみ設定しているだけで他プロンプトなどは設定していない状態です。
モデルの変更
右上の現在gpt-3.5となっている箇所をクリックするとモデルの各種設定を変更できます。その中でもモデルの右のgpt-3.5を再度クリックすると、下図の表示となるため利用するモデルを選択します。(先ほどのアクセスキーなどを登録しないとこのBedrockのモデル一覧はここに表示されない)
今回はClaude 3 Haiku を選択します。(Claude 3 Haiku(US.Cross Region Inferene)などのモデルもありますが許可したHaikuとは別物です)
無事設定できました。
Bedrockのモデルを呼び出す
上記までの設定が完了したら後は呼び出すだけです。以前の記事でも紹介したとおりチャット形式で質問をしていきます。
「あなたはどこの会社のLLMで、モデル名は何ですか」と質問したところ、「ClaudeというLLMで、Anthropicが開発した」という回答が返ってきました。やったね。
トラブルシューティング
[bedrock] Error: AccessDeniedExceptionが表示される場合
「Error: AccessDeniedException」が表示され以下のような内容のエラーの場合は以下の原因が考えられます。
- IAMユーザーの権限が不足している。IAMポリシーを見直してください。
- モデルIDの指定が間違っている。IAMポリシーで許可したモデルIDを選択しているか確認してください。
なお、今回のエラーの場合は、IAMポリシーでClaude 3 Haikuしか許可していないのにMistral smallをDifyで利用するよう選択した場合に発生しました。
[bedrock] Error: AccessDeniedException: User: arn:aws:iam::<アカウントID>:user/dify is not authorized to perform: bedrock:InvokeModelWithResponseStream on resource: arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-small-2402-v1:0 because no identity-based policy allows the bedrock:InvokeModelWithResponseStream action
また、IAMポリシーで「bedrock:InvokeModel」「bedrock:InvokeModelWithResponseStream」のどちらかが抜けている場合でも[bedrock] Error: AccessDeniedExceptionのエラーが発生するので注意が必要です。
[bedrock] Error: AccessDeniedException: User: arn:aws:iam::<アカウントID>:user/dify is not authorized to perform: bedrock:InvokeModelWithResponseStream on resource: arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0 because no identity-based policy allows the bedrock:InvokeModelWithResponseStream action
選択したモデルに切り替わっていない気がする
モデルを切り替えたけど出力内容を見ると切り替える前のLLMが呼び出されている気がする場合は、「公開する→更新」で解決すると思います。もし解決しない場合は「アプリを実行」なども試すと良いと思います。