Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bedrock × Confluenceで簡単(?)社内RAG

Bedrock × Confluenceで簡単(?)社内RAG

登壇資料
JAWS-UG東京 ランチタイムLT会 #22
https://jawsug.connpass.com/event/349480/

iharuoru

April 21, 2025
Tweet

More Decks by iharuoru

Other Decks in Programming

Transcript

  1. 自己紹介 Takai Haruka 株式会社Ridge-i AI アプリエンジニア(Python, LangChain ) X, Zenn

    (@iharuoru ) AWS 初心者なので間違えている点は遠慮なくご指摘ください! 2
  2. 目次 1. Bedrock まわりのおさらい 2. Knowledge Bases 構築 3. 余談:AWS

    Chatbot について 4. Bedrock SDK 実装 5. Slack アプリの設定 6. Slack Bolt 実装 LT の目的 6
  3. Amazon Bedrock とは? 複数の基盤モデルを統一的なAPI で利用できるマネージドサービス 主な特徴 複数のAI モデルを利用可能 サーバーレスで利用可能 Knowledge

    Bases でRAG 構築 (最近盛り上がってるエージェントやフローはキャッチアップできておらず) Bedrock まわりのおさらい 8
  4. Knowledge Bases とは? Bedrock の機能の1 つで、簡単にRAG を実装できるサービス 主な特徴 複数のデータソースから自動取り込み ベクトルDB

    ・グラフDB の自動構築 引用元へのリンク付き回答生成 参考:Amazon Bedrock Knowledge Base “ “ Bedrock まわりのおさらい 9
  5. Confluence 接続 Knowledge Bases のデータソース接続の1 つ(2024/7 ~プレビュー中) 主な特徴 メインドキュメントフィールドの自動検出 包含/

    除外コンテンツフィルター 追加、更新、削除されたコンテンツの増分同期 参考:Amazon Bedrock のナレッジベースが追加のデータソース のサポートを開始 ( プレビュー版) “ “ Bedrock まわりのおさらい 10
  6. Confluence 接続 実際のRAG 作成の流れ データソースを指定(Confluence など) Bedrock の埋め込みモデルを指定(Titan Text Embeddings

    v2 など) 埋め込みモデルからOpenSearch にインデックスが作成 Bedrock まわりのおさらい 11
  7. これまでのお話 Knowledge Bases ができたので後は使えるようにしたい 普段使っているSlack に連携したら便利 Slack アプリを開発 Slack Bolt

    LT 作成中に気づいたのですが、もっと簡単な方法がありました ノーコードでBedrock とSlack を連携 AWS Chatbot 参考:AWS Chatbot が Microsoft Teams や Slack からの Amazon Bedrock エージェントとのやり取りに対応 “ “ 余談:AWS Chatbot について 22
  8. AWS Chatbot とSlack Bolt の比較 項目 AWS Chatbot Slack Bolt

    開発方法 ノーコード Python, TypeScript リソース AWS Chatbot, Bedrock エージェント Slack アプリ, Lambda, API Gateway 接続方法 aws のSlack アプリ追加 作成したSlack アプリ追加 呼出方法 @Amazon Q ask {params} 任意(DM, メンション等) UI 機能 テキストのみ Block Kit で拡張可能 権限管理 AWS IAM Slack Permission scopes 余談:AWS Chatbot について 23
  9. クライアントの初期化 import { BedrockAgentRuntimeClient } from "@aws-sdk/client-bedrock-agent-runtime"; const bedrockClient =

    new BedrockAgentRuntimeClient({ region: "us-west-2" // Bedrockが利用可能なリージョン }); 参考:AWS SDK for JavaScript v3 “ “ Bedrock SDK 実装 27
  10. RAG の設定 RetrieveAndGenerate タイプを使用 const ragConfig = { // ナレッジベースのRAG(ベクトル検索+回答生成)を使用

    type: RetrieveAndGenerateType.KNOWLEDGE_BASE, // 環境変数からナレッジベースID・モデルARNを設定 knowledgeBaseConfiguration: { knowledgeBaseId: KNOWLEDGE_BASE_ID, modelArn: MODEL_ARN, }, }; Bedrock SDK 実装 28
  11. RAG の実行 RetrieveAndGenerate コマンドを使用 const command = new RetrieveAndGenerateCommand({ //

    query: strをinputに渡す input: { text: query }, retrieveAndGenerateConfiguration: ragConfig }); const response = await bedrockClient.send(command); Bedrock SDK 実装 29
  12. レスポンスのフォーマットについて output にはテキスト出力 citations には引用情報 が含まれている start , url ,

    x-amz-bedrock-kb-title ( metadata に含まれる)を使うことで 引用を差し込むことができる # 実際はjson(紙面上yamlにしています) citations: - generatedResponsePart: textResponsePart: span: end: <number> # 終了位置(数値) start: <number> # 開始位置(数値) text: "<string>" # テキスト内容 retrievedReferences: - location: confluenceLocation: url: "<string>" # ConfluenceのURL metadata: # メタデータ(キーは任意、値はJSON形式) "<string>": <JSON value> output: text: "<string>" # 全体のテキスト出力 Bedrock SDK 実装 30
  13. 権限の設定 必要なスコープ app_mentions:read メンションの読み取り chat:write メッセージの送信 im:history DM の履歴閲覧 im:write

    DM の送信 設定手順 OAuth & Permissions ページで 設定 Bot Token Scopes に追加 Slack アプリの設定 33
  14. イベントの設定 アプリがメッセージに反応するようにする Enable Events をオン Request URL を設定 API Gateway

    のエンドポイントを指定 イベントのサブスクリプションを選択 message.group : グループメッセージ message.im : DM Slack アプリの設定 34
  15. パッケージのインストール npm install @slack/bolt アプリの初期化 const app = new App({

    token: process.env.SLACK_BOT_TOKEN, signingSecret: process.env.SLACK_SIGNING_SECRET }); 参考:リファレンス(App インターフェイスと設定) “ “ Slack Bolt 実装 37
  16. メッセージリスナー app.message : 正規表現 pattern にマッチしたメッセージを受け取ったときの処理が かける say : レスポンスを返せる

    app.message(pattern, async ({ message, say }: { message: any, say: SayFn }) => { response // strやslack block形式 await say(response); }); Slack Bolt 実装 38
  17. ブロックを使ったレスポンス json 形式でメッセージやリンク, ボタン を表示することができる ブロックを試すこともできます { "blocks": [ {

    "type": "section", "text": { "type": "mrkdwn", "text": "ナレッジベースの回答がここに入る(<example.com|引用>)" } }, { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": " " }, "action_id": "feedback_good" } // feedback_badも同様 ] } ] } 参考:Block Kit Builder “ “ Slack Bolt 実装 39
  18. ミドルウェア app.use を使うと、リスナーの前にしたい処理がかける app.use(async ({ payload, context, next, client })

    => { isAllowed: bool // 特定のチャンネルに入っているメンバー、などの条件 if isAllowed { await next(); // リスナーの処理に進む } }); 参考:グローバルミドルウェア “ “ Slack Bolt 実装 41
  19. Lambda ハンドラー Slack アプリでは3 秒以 内にレスポンスがない とリトライしてしまう ため、リトライ時は何 もしないといった処理 も必要

    import { App, AwsLambdaReceiver } from '@slack/bolt'; export const handler = async (event: any, context: any, callback: any) => { // lambda用レシーバーの初期化 const awsLambdaReceiver = new AwsLambdaReceiver({ signingSecret: process.env.SLACK_SIGNING_SECRET, }); // アプリの初期化 const app = new App({ token: process.env.SLACK_BOT_TOKEN, receiver: awsLambdaReceiver, }); // app.messageやapp.actionなどのリスナーを追加 // レスポンスを返却 const handler = await awsLambdaReceiver.start(); return await handler(event, context, callback); }; Slack Bolt 実装 42