Slack

Boltと外部LLMで作る最小構成のSlack AIボット

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
タイプ別にすぐ選べる

2026年、ビジネス競争力を上げる2ルート

"組織を動かす"立場と"個人スキルを伸ばす"立場では必要な打ち手が違います。自分の役割で選んでください。

▷ 部門・全社でAIリテラシー研修を入れたい管理職・人事・経営層

【Kindle本】イノベーションOps 組織を動かすDX&AI導入プロセスのすべて

▷ 個人のビジネススキル・思考法を"本から"底上げしたい実務担当者

Kindle Unlimited 30日無料|ビジネス書読み放題▶

※積極的な自己学習が成長への近道です

▶ 耳で学ぶビジネススキルなら オーディオブックAudible 。日経BP・東洋経済系の話題作も対象です。


Contents

スポンサードリンク

導入:Slack内蔵AIとカスタムSlackボットの違いとこの記事のゴール

Slack内蔵AIは導入が速いです。だが社内データ統合や細かな権限管理には限界があります。
ここではBolt(Node/Python)と外部LLM、ベクタDBを使い、実務で使える最小構成のSlack AI ボットを0→1で実装する手順とコード例を示します。OAuth、署名検証、埋め込み生成、ベクタ検索、ワーカー設計、テスト、運用まで扱い、Slack AI ボットの安全運用を目指します。

Slackアプリ作成とOAuthインストールフロー(実装手順)

実務フローの概要

  • Slackアプリを作成し、リダイレクトURLとスコープを設定します。
  • OAuthコードを受け取り、サーバー側で oauth.v2.access を呼びます。
  • 返却されたインストール情報をワークスペースごとに永続化します(bot/user トークン、scopes、authed_user 等)。
  • BoltのInstall/Storeを使うか、自前のエンドポイントで上書き/更新処理を実装します。
  • 再インストールやエンタープライズインストールに対応するため、team_id / enterprise_id をキーに upsert します。

推奨データスキーマ(例)

以下は実装で持つと便利な列例です。

  • team_id, enterprise_id, app_id
  • bot_token, bot_user_id, bot_scopes, bot_expires_at
  • authed_user (json), user_token (必要なら)
  • raw (json) — oauth.v2.access の生レスポンス
  • installed_at, updated_at

サンプルのテーブル定義(Postgres):

OAuthコード交換(Node / Express 実例)

この例は express を使った手動の交換ルートです。state の検証や CSRF 対策は必須です。動作確認は @slack/bolt v3 系で行っていますが、OAuth 自体は Slack API の仕様に依存します。

OAuthコード交換(Python / Flask 実例)

Bolt の Install/Store 利用例(Node)

Bolt を使う場合、installationStore を実装すると自動で OAuth の保存が可能です。以下は動作確認済みの簡易実装例です。

Python の Bolt でも同様の設計にできます。詳細は公式ドキュメントのインストールストア実装例を参照してください。

Events API と Socket Mode:署名検証と初期検証(challenge)

Events API:署名検証と challenge 応答(Node / Express)

Events API を使う場合は Slack からの POST を受け、まず署名を検証します。express の body を raw で受け取る点が重要です。

Events API:署名検証と challenge 応答(Python / Flask)

Socket Mode:有効化手順と app-level token(xapp-...)

  1. Slack App 管理画面の "Socket Mode" を有効化します。
  2. Basic Information -> App-Level Tokens でトークンを生成します。
  3. スコープとして connections:write を付与します。
  4. 生成されるトークンは xapp- で始まります。
  5. 環境変数に SLACK_APP_TOKEN を保存します。
  6. Socket Mode は公開 HTTPS を必要としないためローカル開発が容易です。

Socket Mode の実装例は次の通りです。Node と Python を示します。

Node(Bolt, socketMode=true):

Python(Bolt + SocketModeHandler):

注意点:Events API を使う場合は Express/Flask などでサーバーを起動し、app.start(port) 相当でポートを指定します。Socket Mode では app.start() にポートを渡さないのが一般的です。

LLM連携とRAGの実装(埋め込み、ベクタ検索、プロンプト注入対策)

連携の基本パターンと非同期化

  1. Slack イベントを受け取る。ack を即時に呼ぶ。
  2. 受信イベントはジョブキューへ入れる(SQS / RabbitMQ / BullMQ / Celery)。
  3. ワーカーがジョブを取り、会話履歴やコンテキストを集める。
  4. 必要なら埋め込み検索で文書を取得(RAG)。
  5. LLM に問い合わせ、結果を Slack に返す。

非同期化により Slack のタイムアウトを回避できます。LLM 呼び出しは時間がかかるためです。

埋め込み生成(OpenAI 例:Node / Python)

Node(fetch):

Python(requests):

テキストの分割は文字数やトークン数で行います。単純な例は 1000 文字ごとに分割する方法です。より高度には tiktoken 等でトークン数をベースにします。

ベクタ検索(pgvector と Pinecone の例)

pgvector(Postgres)の例。事前に pgvector 拡張を有効にします。

Node での検索(node-postgres):

Pinecone の例(簡略):

RAG のプロンプト組み立てと生成例

検索結果はメタ情報を付けてプロンプトに注入します。必ず「ソースを明示」し、引用の形式を統一します。

例のプロンプト構成(要点):

  • system メッセージ:安全ルールや出力フォーマットを指定する。
  • user メッセージ:検索結果を番号付きのコンテキストとして添付し質問を続ける。
  • 出力は JSON スキーマで返すよう指示する(パース容易化)。

短い例(擬似):

プロンプト注入対策(技術的対策)

  • 取得した文書は「引用」として扱う。直接的な命令は無視する旨を system に明記します。
  • 文書から「実行可能な命令構文」を削除またはマスキングします。たとえば "実行して" や "send to" のような行を正規表現で除去します。
  • LLM へは「必ず JSON で返す」等のルールを与え、パース失敗時はフォールバックを用意します。
  • レトリーバル結果はスコア閾値・上位 k 件に限定します。不要な長文の注入を避けます。
  • 生成物は出力検証(スキーマ検証、ブラックリスト語の検出)を行います。

注入検出の簡易例(Node):

LLM 呼び出しの堅牢化(タイムアウト・再試行・検証)

  • HTTP クライアントにタイムアウトを設定します。短めに設定し、タイムアウト時は代替応答を返します。
  • 429 や 5xx は指数バックオフとジッタで再試行します。再試行回数は管理可能な上限にします。
  • 生成結果は JSON スキーマでバリデーションし、失敗時は要約 or 再実行を行います。

テスト・デプロイ・運用(監視・スケーリング・セキュリティチェック)

テスト戦略:フィクスチャとモック化

  • 単体テストは LLM や外部 API をモックします。Node は nock、Python は responses / respx を推奨します。
  • Slack イベントのフィクスチャを保存します(app_mention, url_verification, command payload など)。
  • 統合テストはステージングワークスペースを用意して実施します。CI では専用の OAuth クライアント ID/Secret を使います。
  • エンドツーエンドはワーカーを含めたフルフローを実行します。外部 LLM はスタブサーバーでレスポンス再現を行います。

Node テスト例(Jest + nock):

Python テスト例(pytest + responses):

CI / ステージング自動化

  • GitHub Actions 等で lint → unit → integration → build → deploy を順に実行します。
  • ステージングでは実インデータを使わず、合成データを用いて RAG の動作を確認します。
  • E2E は限定されたテストユーザーと限られたチャンネルで実行します。

運用設計:ワーカー、再試行、デッドレター

  • アーキテクチャは「フロント(Bolt) + キュー + ワーカー」です。
  • キューは Redis/BullMQ、RabbitMQ、または SQS を推奨します。
  • ワーカーのジョブ設定で attempts(再試行回数)、backoff(指数)を設定します。
  • 最大再試行後はデッドレターキュー(DLQ)へ移す設計にします。DLQ は手動トリアージでの解析用に残します。

Node(BullMQ)の単純なワーカー設定:

Python(Celery):

分散トレーシング・メトリクス

  • OpenTelemetry を導入して Slack API 呼び出し、ベクタ検索、LLM 呼び出しを分割してトレースします。
  • Prometheus でメトリクスを収集し、Grafana で可視化します。
  • 重要なメトリクス例:slack_requests_total, llm_calls_total, llm_latency_seconds, vector_query_latency_seconds, queue_depth。

簡単な Prometheus 指標(Node, prom-client):

セキュリティ・コンプライアンスと法的配慮

  • PII を外部 LLM に送る前はユーザーの明示同意を取ります。
  • ベンダーとは DPA(データ処理契約)を必ず締結します。データ居住性が必要なら地域エンドポイントや Azure/GCP の地域提供サービスを選びます。
  • ベクタDB はプライベートネットワーク、IP アロリスト、VPC Peering / PrivateLink を使い、TLS とサーバーサイド暗号化(KMS)を設定します。
  • ログはマスキングして保管期間を定めます。ユーザーの削除要求に対応できる設計にします。
  • Slack や LLM ベンダーの商標は各社ガイドラインに従います。プロダクト文言でのブランド表記は公式のガイドラインを確認してください。

PII 同意テンプレート(例):

  • 「このメッセージには個人情報が含まれる可能性があります。外部AIモデルへ送信してよい場合は「同意する」と返信してください。送信を希望しない場合は「拒否」と返信してください。送信されたデータは社内ポリシーにより保護されます。」

記録方法:ユーザー同意は DB に保存し、いつ誰が同意したかをログに残します。

推奨スコープ一覧と影響(用途別)

以下は用途に応じた代表的スコープと影響です。最小権限原則で必要最小限を選んでください。

用途 必要スコープ(bot トークン) 説明と影響
ボットがチャンネルへ投稿 chat:write ボットがメッセージを投稿できます。public に投稿する場合は chat:write.public が要る場合あり。
スラッシュコマンド commands ワークスペースのユーザーがコマンドを実行できます。
メンションの受信 app_mentions:read bot がメンションイベントを受け取れます。
チャンネル一覧の取得 conversations.list, conversations.read チャンネルのメタ情報を一覧できます。private チャンネルは権限が限定されます。
メッセージ履歴の読み取り conversations.history メッセージを読み取れます。PII 取り扱いリスクが高いです。必要性を精査してください。
ユーザー情報の取得 users:read ユーザー名やプロフィール情報が必要な場合に限定して付与します。
DM の送信 im:write / conversations:write DM を送るための権限です。

ユーザートークンがあるとより強力な操作が可能です。ユーザートークンを使う際はより厳しいレビューとログを推奨します。

よくある障害と対処(抜粋)

  • invalid_auth
  • 環境変数のトークンが間違っている。bot と user を混同していないか確認します。
  • Events 未受信
  • Events Subscription が有効か。URL が公開されているか。Socket Mode を使う場合は App-Level Token と connections:write があるか確認します。
  • 429(レート制限)
  • 再試行は指数バックオフ。優先度を付けてキューイングします。
  • ハルシネーションや誤情報
  • RAG でソースを添える。生成物にソース提示を義務化します。
  • セキュリティ関連のクレーム
  • 同意記録と DPA を確認。ログと削除フローを実行します。

まとめ

Slack上で実務に耐えるAIボットを作るには、OAuthとインストール情報の堅牢な保存、Events API/Socket Modeの署名検証、ackでの即時応答、LLM呼び出しの非同期化が不可欠です。埋め込み生成→ベクタ検索→プロンプトでのRAGは根拠提示に有効です。セキュリティ面ではPII同意、DPA、ベクタDBのネットワーク制御、ログのマスキングを必ず実装してください。運用面はキュー+ワーカー設計、再試行/DLQ、OpenTelemetry+Prometheus での監視を組み合わせると安定します。

スポンサードリンク

お得なお知らせ

スポンサードリンク
タイプ別にすぐ選べる

2026年、ビジネス競争力を上げる2ルート

"組織を動かす"立場と"個人スキルを伸ばす"立場では必要な打ち手が違います。自分の役割で選んでください。

▷ 部門・全社でAIリテラシー研修を入れたい管理職・人事・経営層

【Kindle本】イノベーションOps 組織を動かすDX&AI導入プロセスのすべて

▷ 個人のビジネススキル・思考法を"本から"底上げしたい実務担当者

Kindle Unlimited 30日無料|ビジネス書読み放題▶

※積極的な自己学習が成長への近道です

▶ 耳で学ぶビジネススキルなら オーディオブックAudible 。日経BP・東洋経済系の話題作も対象です。


-Slack