💬
概念 #Dify #Slack #社内ボット #ナレッジ管理 #業務自動化 #ユースケース 📚 Difyユースケース

Slack社内ナレッジボット(Dify実践)

社内のSlackから直接質問できるナレッジボットをDify + Slack Webhook連携で構築する。エンジニア・非エンジニア問わず使える社内AIの実践例。

シナリオ概要

課題: 社内の質問が特定の人(シニアエンジニア・ベテラン社員)に集中する。「DBの接続設定は?」「オンコール対応手順は?」という質問が毎日 Slack に来て、その人の集中力が奪われる。

解決策: Dify のナレッジベース(社内 Wiki・ runbook・FAQ)を Slack と接続。@botname で質問すると自動で回答する。

Slackでの会話:

@知識ボット デプロイ手順を教えて

ボット(3秒後):
  デプロイ手順です:
  1. main ブランチへの PR をマージ
  2. GitHub Actions が自動的に staging へデプロイ
  3. staging で動作確認後、手動承認でproductionへ
  
  詳細: https://notion.so/deploy-guide
  (出典: Runbook v2.3)

使用する Dify 機能

機能役割
ナレッジベース・RAG社内ドキュメントの検索
API・デプロイWebhook で Slack と接続
ツール・プラグインSlack プラグイン
概要・アプリ種別Chatflow で文脈を保持

アーキテクチャ

[Slack: ユーザーが @ボット に質問]
  │ Slack Event API(app_mention イベント)

[中継サーバー(Node.js / Cloud Functions)]
  │ Slack の署名検証(3秒以内にHTTP 200を返す)
  │ 非同期で Dify API を呼び出す

[Dify: Chatflow(RAG + LLM)]
  │ ナレッジベース検索 → LLM で回答生成

[中継サーバー: Slack API で返信投稿]
  │ chat.postMessage(スレッド返信)

[Slack: スレッドに回答が届く]

なぜ中継サーバーが必要か

Slack Event API の制約:
  - アプリは3秒以内に HTTP 200 を返さないといけない
  - Dify の LLM 処理は3〜30秒かかる
  → 直接繋げると Slack 側でタイムアウトしてしまう

解決策:
  1. Slack からイベントを受信 → 即座に 200 を返す
  2. バックグラウンドで Dify API を呼び出す
  3. 回答ができたら Slack の chat.postMessage で返信

中継サーバーの実装例(Node.js)

const { App } = require('@slack/bolt');
const axios = require('axios');

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  socketMode: true,  // Socket Mode で簡単に始める
  appToken: process.env.SLACK_APP_TOKEN,
});

// @ボット にメンションされたとき
app.event('app_mention', async ({ event, client }) => {
  const userQuestion = event.text.replace(/<@[^>]+>\s*/g, '');
  const channelId = event.channel;
  const threadTs = event.thread_ts || event.ts;

  // 「考え中...」の反応(UX向上)
  await client.reactions.add({
    channel: channelId,
    timestamp: event.ts,
    name: 'hourglass_flowing_sand'
  });

  try {
    // Dify Chat API を呼び出す
    const response = await axios.post(
      'https://api.dify.ai/v1/chat-messages',
      {
        query: userQuestion,
        inputs: {},
        response_mode: 'blocking',
        conversation_id: '',  // 新規会話(スレッドIDで管理も可能)
        user: event.user
      },
      {
        headers: {
          'Authorization': `Bearer ${process.env.DIFY_API_KEY}`,
          'Content-Type': 'application/json'
        }
      }
    );

    const answer = response.data.answer;

    // スレッドに返信
    await client.chat.postMessage({
      channel: channelId,
      thread_ts: threadTs,
      text: answer
    });

    // 「考え中...」リアクションを外す
    await client.reactions.remove({
      channel: channelId,
      timestamp: event.ts,
      name: 'hourglass_flowing_sand'
    });

  } catch (error) {
    await client.chat.postMessage({
      channel: channelId,
      thread_ts: threadTs,
      text: 'エラーが発生しました。しばらくしてもう一度お試しください。'
    });
  }
});

(async () => { await app.start(); })();

ナレッジベースの設計

登録する文書の種類

エンジニアチーム向け:
  - Runbook(インシデント対応手順)
  - アーキテクチャ設計ドキュメント
  - API リファレンス(内部)
  - オンボーディングガイド
  - CI/CD・デプロイメント手順

全社員向け:
  - 社内規定・就業規則
  - 福利厚生・手続きガイド
  - 製品・サービスFAQ
  - 組織情報・連絡先

Notion との連携

Notion を社内 Wiki として使っている場合:

Dify のナレッジベース → Notion 統合
  → Notion ページを URL で登録
  → 定期的に自動再インデックス

新しいページを Notion に書いたら
→ 翌日には Slack ボットが答えられるようになる

スレッド単位での会話継続

同じスレッド内での続き質問に対応する。

// スレッドIDを conversation_id として使う
// → 同スレッド内の会話を記憶できる

const conversationMap = new Map();  // スレッドTS → Dify conversation_id

app.event('app_mention', async ({ event, client }) => {
  const threadTs = event.thread_ts || event.ts;
  
  // 既存の会話IDを取得(なければ新規)
  const conversationId = conversationMap.get(threadTs) || '';
  
  const response = await axios.post('/v1/chat-messages', {
    query: userQuestion,
    conversation_id: conversationId,  // 継続
    user: event.user
  });
  
  // 会話IDを保存(次の返信に使う)
  conversationMap.set(threadTs, response.data.conversation_id);
});

発展:Slack コマンドとの統合

/ask コマンドで質問:
  /ask デプロイ手順を教えて

/feedback コマンドで回答品質を報告:
  /feedback 良い   → Dify のアノテーションに記録
  /feedback 悪い   → 改善が必要な回答としてフラグ

→ Dify の Logs に自動記録 → プロンプト改善に活用

セキュリティ考慮事項

1. チャンネル制限
   → 特定チャンネルからの質問のみ受け付ける
   → 機密チャンネルでの使用は別のナレッジベース

2. ユーザー認証
   → Slack の user ID を Dify の user パラメータに渡す
   → 誰が何を質問したかをログで追跡可能

3. 機密情報の取り扱い
   → 「パスワード・秘密鍵を教えて」系の質問には答えない
   → プロンプトで禁止事項を明示

4. API キーの管理
   → Dify API Key と Slack Token は環境変数で管理
   → ローテーションを定期的に行う

参考:他のユースケース

  1. 1. 💬RAGチャットボット構築(Dify実践)
  2. 2. 📄PDFドキュメント分析パイプライン(Dify実践)
  3. 3. 🎧カスタマーサポートボット(Dify実践)
  4. 4. コンテンツ一括生成(Dify実践)
  5. 5. 🔎コードレビュー自動化(Dify実践)
  6. 6. 🗂️構造化データ抽出ワークフロー(Dify実践)
  7. 7. 🕸️マルチエージェントオーケストレーション(Dify実践)
  8. 8. 📱SNSコンテンツ多チャンネル自動生成(Dify実践)
  9. 9. 🧾経費精算・領収書OCR処理(Dify実践)
  10. 10. 📝会議議事録・タスク自動抽出(Dify実践)
  11. 11. 👥HR採用・オンボーディング自動化(Dify実践)
  12. 12. 🏭製造業:作業マニュアルQAボット(Dify実践)
  13. 13. 🎓教育:クイズ・学習教材自動生成(Dify実践)
  14. 14. 🔬ディープリサーチワークフロー(Dify実践)
  15. 15. 💬Slack社内ナレッジボット(Dify実践)
  16. 16. 📡競合情報・ニュースモニタリング(Dify実践)
  17. 17. 📋営業提案書自動生成(Dify実践)
  18. 18. 🏥医療・ヘルスケア向けDify活用(患者FAQ・文書処理)
  19. 19. 🏦金融・保険向けDify活用(レポート分析・審査支援)
  20. 20. 🏠不動産向けDify活用(物件説明生成・顧客マッチング)
  21. 21. ⚖️法律・リーガルテック向けDify活用(契約書レビュー・法令検索)
  22. 22. 🍽️小売・飲食向けDify活用(メニュー生成・クレーム対応・在庫Q&A)
  23. 23. 🏛️行政・公共向けDify活用(市民FAQ・申請ガイド)

出典: Dify公式ドキュメント / community articles