Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Bedrock × Confluenceで簡単(?)社内RAG
Search
iharu
April 21, 2025
Programming
1.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Bedrock × Confluenceで簡単(?)社内RAG
登壇資料
JAWS-UG東京 ランチタイムLT会 #22
https://jawsug.connpass.com/event/349480/
iharu
April 21, 2025
More Decks by iharu
See All by iharu
Skill Builderチームサブスクリプション 導入してみた
iharuoru
0
500
S3静的ホスティング+Next.js静的エクスポート で格安webアプリ構築
iharuoru
0
490
Other Decks in Programming
See All in Programming
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
240
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
610
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
330
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
130
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
130
自分的「カンファレンスの楽しみ方」
syumai
0
200
What We Talk About When We Talk About XP
m_seki
2
580
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
160
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
590
Heart of Swift Concurrency
koher
0
350
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
120
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
Done Done
chrislema
186
16k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
530
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
520
Ethics towards AI in product and experience design
skipperchong
2
370
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
270
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Transcript
Bedrock × Confluence で簡単(?) 社内RAG Slack Bolt でアプリ実装 JAWS-UG 東京
ランチタイムLT 会 #22 haruka takai (@iharuoru) 1
自己紹介 Takai Haruka 株式会社Ridge-i AI アプリエンジニア(Python, LangChain ) X, Zenn
(@iharuoru ) AWS 初心者なので間違えている点は遠慮なくご指摘ください! 2
LT の目的 3
社内RAG を簡単に作りたい Amazon Bedrock の活用 ナレッジベースのConfluence 接続で簡単・セキュアにRAG 構築 アプリ・インフラ構築の実践 Slack
Bolt でアプリ実装 LT の目的 4
アーキテクチャ Bedrock ナレッジベースでConfluence のRAG 構築 Lambda でSlack アプリを構築 LT の目的
5
目次 1. Bedrock まわりのおさらい 2. Knowledge Bases 構築 3. 余談:AWS
Chatbot について 4. Bedrock SDK 実装 5. Slack アプリの設定 6. Slack Bolt 実装 LT の目的 6
Bedrock まわりのおさらい 7
Amazon Bedrock とは? 複数の基盤モデルを統一的なAPI で利用できるマネージドサービス 主な特徴 複数のAI モデルを利用可能 サーバーレスで利用可能 Knowledge
Bases でRAG 構築 (最近盛り上がってるエージェントやフローはキャッチアップできておらず) Bedrock まわりのおさらい 8
Knowledge Bases とは? Bedrock の機能の1 つで、簡単にRAG を実装できるサービス 主な特徴 複数のデータソースから自動取り込み ベクトルDB
・グラフDB の自動構築 引用元へのリンク付き回答生成 参考:Amazon Bedrock Knowledge Base “ “ Bedrock まわりのおさらい 9
Confluence 接続 Knowledge Bases のデータソース接続の1 つ(2024/7 ~プレビュー中) 主な特徴 メインドキュメントフィールドの自動検出 包含/
除外コンテンツフィルター 追加、更新、削除されたコンテンツの増分同期 参考:Amazon Bedrock のナレッジベースが追加のデータソース のサポートを開始 ( プレビュー版) “ “ Bedrock まわりのおさらい 10
Confluence 接続 実際のRAG 作成の流れ データソースを指定(Confluence など) Bedrock の埋め込みモデルを指定(Titan Text Embeddings
v2 など) 埋め込みモデルからOpenSearch にインデックスが作成 Bedrock まわりのおさらい 11
Knowledge Bases 構築 12
Confluence API トークンの取得 参考:Atlassian アカウントの API トークンを管理する “ “ Knowledge
Bases 構築 13
Secrets Manager へ登録 参考:ナレッジベースの Confluence に接続する “ “ Knowledge Bases
構築 14
Knowledge Bases の作成 データソースを選択 Knowledge Bases 構築 15
Knowledge Bases の作成 Confluence URL を入力 Knowledge Bases 構築 16
Knowledge Bases の作成 Confluence のAPI トークンを入れたシークレットを指定 Knowledge Bases 構築 17
Knowledge Bases の作成 お好きな埋め込みモデルを選択 ナレッジベースを作成 を押してしばらく待つ Knowledge Bases 構築 18
Knowledge Bases の作成 リソースは作成されましたが、まだデータは取り込まれていません データソースを選択して 同期 を押す モデルアクセスがない場合エラーになるので確認しましょう:Model access Knowledge
Bases 構築 19
Knowledge Bases の動作確認 ナレッジベースをテスト から確認( 回答を生成 をオフでベクトル検索のみ) Confluence のページ Knowledge
Bases 構築 20
余談:AWS Chatbot について 21
これまでのお話 Knowledge Bases ができたので後は使えるようにしたい 普段使っているSlack に連携したら便利 Slack アプリを開発 Slack Bolt
LT 作成中に気づいたのですが、もっと簡単な方法がありました ノーコードでBedrock とSlack を連携 AWS Chatbot 参考:AWS Chatbot が Microsoft Teams や Slack からの Amazon Bedrock エージェントとのやり取りに対応 “ “ 余談:AWS Chatbot について 22
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
ここからのお話 以下の理由で、今回はSlack Bolt を使用 コマンドを使わずアプリを呼び出したい インタラクティブなUI を実現したい タイトルが 簡単(?) となっているのは、コーディングが必要なため
余談:AWS Chatbot について 24
Bedrock SDK 実装 25
パッケージのインストール npm install @aws-sdk/client-bedrock-agent-runtime 環境変数の設定 KNOWLEDGE_BASE_ID=xxx # ナレッジベースID: ベクトル検索で使うナレッジベースを指定 MODEL_ARN=arn:aws:bedrock:...
# モデルARN: 回答生成で使うモデルを指定 Bedrock SDK 実装 26
クライアントの初期化 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
RAG の設定 RetrieveAndGenerate タイプを使用 const ragConfig = { // ナレッジベースのRAG(ベクトル検索+回答生成)を使用
type: RetrieveAndGenerateType.KNOWLEDGE_BASE, // 環境変数からナレッジベースID・モデルARNを設定 knowledgeBaseConfiguration: { knowledgeBaseId: KNOWLEDGE_BASE_ID, modelArn: MODEL_ARN, }, }; Bedrock SDK 実装 28
RAG の実行 RetrieveAndGenerate コマンドを使用 const command = new RetrieveAndGenerateCommand({ //
query: strをinputに渡す input: { text: query }, retrieveAndGenerateConfiguration: ragConfig }); const response = await bedrockClient.send(command); Bedrock SDK 実装 29
レスポンスのフォーマットについて 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
Slack アプリの設定 31
アプリの作成 基本設定 api.slack.com でアプリを作成 From scratch オプションを選択 アプリ名とワークスペースを設定 アプリをワークスペースにインストール 参考:Quickstart
“ “ Slack アプリの設定 32
権限の設定 必要なスコープ app_mentions:read メンションの読み取り chat:write メッセージの送信 im:history DM の履歴閲覧 im:write
DM の送信 設定手順 OAuth & Permissions ページで 設定 Bot Token Scopes に追加 Slack アプリの設定 33
イベントの設定 アプリがメッセージに反応するようにする Enable Events をオン Request URL を設定 API Gateway
のエンドポイントを指定 イベントのサブスクリプションを選択 message.group : グループメッセージ message.im : DM Slack アプリの設定 34
インタラクティブの設定 アプリがボタンに反応するようにする Interactivity をオン Request URL を設定 API Gateway のエンドポイントを指定
Slack アプリの設定 35
Slack Bolt 実装 36
パッケージのインストール npm install @slack/bolt アプリの初期化 const app = new App({
token: process.env.SLACK_BOT_TOKEN, signingSecret: process.env.SLACK_SIGNING_SECRET }); 参考:リファレンス(App インターフェイスと設定) “ “ Slack Bolt 実装 37
メッセージリスナー app.message : 正規表現 pattern にマッチしたメッセージを受け取ったときの処理が かける say : レスポンスを返せる
app.message(pattern, async ({ message, say }: { message: any, say: SayFn }) => { response // strやslack block形式 await say(response); }); Slack Bolt 実装 38
ブロックを使ったレスポンス 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
アクションリスナー app.action : ボタンクリックなどインタラクティブなアクションがあ った時の処理がかける app.action('feedback_good', async ({ ack, body
}) => { await ack(); // フィードバック処理 // DynamoDBに保存するなど }); Slack Bolt 実装 40
ミドルウェア app.use を使うと、リスナーの前にしたい処理がかける app.use(async ({ payload, context, next, client })
=> { isAllowed: bool // 特定のチャンネルに入っているメンバー、などの条件 if isAllowed { await next(); // リスナーの処理に進む } }); 参考:グローバルミドルウェア “ “ Slack Bolt 実装 41
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
まとめ 43
所感 ナレッジベースとConfluence の連携はかなり簡単 Slack とBedrock の連携は簡単ではない 生成AI でなんとか初心者でもBolt をかけた 今回紹介できなかったインフラもCDK
と生成AI で簡単にできる 改善ポイント はやりのMCP でもっとBedrock 主体に実装できるかも? まとめ 44