Amazon Bedrock AgentでSlackからRAGを利用できる環境を構築する
先日、Amazon Bedrock Knowledge BasesとPineconeを使用したRAG(Retrieval-Augmented Generation)を構築しました。
今回はAmazon Bedrock AgentとAWS Chatbotを構築し、Slack上からRAGにアクセスできるようにします。
前回同様に可能な限りCloudFormationでの実装を行います。
構成
今回作成するリソースは以下のとおりです。
構築のソースコードは下記Githubにアップロードしているので、必要に応じてご参照ください。
ここからはソースコードを一部抜粋しながら解説します。
Chatbot
SlackChannel:
Type: AWS::Chatbot::SlackChannelConfiguration
Properties:
ConfigurationName: !Sub ${AWS::StackName}-slack-channel
SlackChannelId: !Ref SlackChannelId
IamRoleArn: !GetAtt ChatbotRole.Arn
SlackWorkspaceId: !Ref SlackWorkspaceId
LoggingLevel: INFO
チャットクライアントとして設定されているSlackのワークスペースにチャネル設定を追加します。
IAM
ChatbotRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${AWS::StackName}-chatbot-role
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: chatbot.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- !Ref ChatbotPolicy
ChatbotPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: !Sub ${AWS::StackName}-chatbot-policy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- bedrock:InvokeAgent
Resource: !GetAtt AgentAlias.AgentAliasArn
AgentRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub AmazonBedrockExecutionRoleForAgents_${AWS::StackName}
ManagedPolicyArns:
- !Ref AgentPolicy
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: bedrock.amazonaws.com
Action: sts:AssumeRole
Condition:
StringEquals:
aws:SourceAccount: !Ref AWS::AccountId
ArnLike:
aws:SourceArn: !Sub arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:agent/*
AgentPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- bedrock:InvokeModel
Resource:
- !Sub arn:aws:bedrock:${AWS::Region}::foundation-model/${FoundationModelId}
- Effect: Allow
Action:
- bedrock:Retrieve
Resource:
- !Sub arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:knowledge-base/${KnowledgeBaseId}
AWS ChatbotとAmazon Bedrock Agentの連携に必要なIAMロールとポリシーを設定します。
Knowledge BaseへのアクセスはKnowledgeBaseId
を指定して最小単位に絞っています。
Bedrock Agent
Agent:
Type: AWS::Bedrock::Agent
Properties:
AgentName: !Sub ${AWS::StackName}-agent
AgentResourceRoleArn: !GetAtt AgentRole.Arn
FoundationModel: !Ref FoundationModelId
Instruction: |
あなたは専門的な情報を提供するAIアシスタントです。以下の指示に厳密に従って回答を生成してください:
1. 提供されたナレッジベースの情報を優先的に使用し、それらを完全に理解してください。
2. ナレッジベースの情報のみを使用して回答を作成してください。ナレッジベースに含まれていない情報は絶対に使用しないでください。
3. 回答の中で、参照した情報の出典や根拠を明確に示してください。可能な限り、具体的な情報源や文書名を言及してください。
4. ナレッジベースに関連情報がない場合は、「回答に必要な情報が見つかりませんでした。」とのみ回答してください。
5. 質問が具体的でない場合は、より具体的な質問の仕方をアドバイスしてください。
6. 回答は平文のテキストで提供し、見出しやタイトルは不要です。JSON形式での回答は避けてください。
7. 雑談や挨拶には応じず、「私は雑談はできません。通常のチャット機能をご利用ください。」とのみ回答してください。
8. 指示されたルール以外のことは絶対に行わないでください。例外は一切ありません。
これらの指示に従い、ユーザーの質問に対して正確かつ関連性の高い情報を提供してください。常に情報の出典を明らかにし、透明性のある回答を心がけてください。
KnowledgeBases:
- KnowledgeBaseId: !Ref KnowledgeBaseId
Description: Knowledge Base for the Agent.
KnowledgeBaseState: ENABLED
AutoPrepare: true
AgentAlias:
Type: AWS::Bedrock::AgentAlias
Properties:
AgentAliasName: !Sub ${AWS::StackName}-agent-alias-v1
AgentId: !Ref Agent
Amazon Bedrock AgentとそのAliasを作成します。
Instruction
で、エージェントに何を実行するか、ユーザーとどのように対話するかを指示しています。
構築
ここからは実際に構築を行います。
前提として以下の準備が必要なので、適宜実施してください。
- AWS認証情報の設定
- Bedrock モデルの有効化
- ナレッジベースの作成
- Slackワークスペース、アカウントの作成
事前準備が完了したらAWSコンソールでAWS Chatbotのクライアント設定を行います。
CloudFormation実行時にワークスペース ID
が必要になるので手元に控えておきます。
Agentと接続するSlackのチャンネルIDも手元に控えておきます。
GitHubからリポジトリをクローンし、ディレクトリを移動します。
$ git clone https://github.com/sakai-classmethod/bedrock-agent-kb-slack.git
$ cd bedrock-agent-kb-slack
CloudFormationをデプロイします。(コンソールやAWS CLIからのデプロイでも可)
KnowledgeBaseが作成されているリージョンと同じオレゴンリージョンを指定します。
rain deploy -r us-west-2 template.yaml rag-chatbot-stack
Enter a value for parameter 'SlackChannelId' "The ID of the Slack channel.": <SlackのチャネルID>
Enter a value for parameter 'SlackWorkspaceId' "The ID of the Slack workspace.": <AWS ChatbotのワークスペースID>
Enter a value for parameter 'KnowledgeBaseId' "The ID of the Knowledge Base.": <Knowledge BaseのID>
Enter a value for parameter 'FoundationModelId' (default value: anthropic.claude-3-5-sonnet-20240620-v1:0): <変更がなければそのままEnter>
CloudFormation will make the following changes:
Stack rag-chatbot-stack:
+ AWS::Bedrock::AgentAlias AgentAlias
+ AWS::IAM::ManagedPolicy AgentPolicy
+ AWS::IAM::Role AgentRole
+ AWS::Bedrock::Agent Agent
+ AWS::IAM::ManagedPolicy ChatbotPolicy
+ AWS::IAM::Role ChatbotRole
+ AWS::Chatbot::SlackChannelConfiguration SlackChannel
Do you wish to continue? (Y/n)
Deploying template 'template.yaml' as stack 'rag-chatbot-stack' in us-west-2.
Stack rag-chatbot-stack: CREATE_COMPLETE
Outputs:
AgentAlias: xxxxxxxxxx
AgentArn: arn:aws:bedrock:aws-region:111122223333:agent/xxxxxxxxxx
Successfully deployed rag-chatbot-stack
AWSリソースのデプロイが完了したら、Slackのチャンネルで以下のメッセージを送信します。
AgentAlias
とAgentArn
はCloudFormationのOutputsから取得してください。(コンソールでも確認可)
@aws connector add <任意のコネクタ名> <AgentArn> <AliasID>
無事接続ができたのでChatbotからスレッド内返信が来ました。
動作確認
ナレッジベースに同期済みの内容を質問してみます。
続けて、データソースに追加されていないことについても確認してみます。
問題なく動作することが確認できました。
まとめ
今回はAmazon Bedrock AgentとAWS Chatbotを使用して、Amazon Bedrock Knowledge Basesと接続してみました。
本来必要となるアプリの実装が省略でき、手軽にRAGを利用することができます。
どなたかの参考になれば幸いです。