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を利用できるのでぜひ試してみてください。
どなたかの参考になれば幸いです。












