Nexeed Lab

DifyでSlackBot を作る:ノーコードでAIチャットボットを業務導入

DifyでSlackBot を作る:ノーコードでAIチャットボットを業務導入

「社内の問い合わせ対応をAIに任せたい」「Slackで動くAIアシスタントを作りたいけど、開発リソースがない」——そんな課題を抱えているチームは多いのではないでしょうか。

従来、SlackにAIボットを組み込もうとすると、APIの叩き方を覚え、サーバーを立て、Botフレームワークを学ぶ……と、エンジニアでも数日がかりの作業が必要でした。しかし今は違います。

Dify(ディファイ)を使えば、LLMベースのAIアプリをノーコード・ローコードで構築でき、Slack連携まで一気通貫で実現できます。本記事では、Difyの基本セットアップからSlack Botとしての公開まで、具体的な手順を丁寧に解説します。


Difyとは?なぜSlack連携に向いているのか

Difyは、LLM(大規模言語モデル)を活用したアプリケーションを視覚的に構築・運用できるオープンソースプラットフォームです。2024年以降、急速に機能が拡張され、2025年現在では以下のような特徴を持ちます。

  • 多様なLLMに対応: OpenAI(GPT-4o)、Anthropic(Claude 3.5 Sonnet)、Google(Gemini)、ローカルモデル(Ollama経由)など
  • ワークフロー機能: 条件分岐・ループ・データ変換など複雑な処理をGUIで構築可能
  • ナレッジベース(RAG): 社内文書をアップロードしてAIに学習させることができる
  • APIとWebhookで外部連携: Slackを含む外部サービスとの接続が容易
  • セルフホスト可能: Dockerで自社サーバーに立てれば、データが外部に出ない

Slack連携の観点では、Difyが発行するAPIエンドポイントをSlackのEvent API・Slash Commandと組み合わせることで、コードをほぼ書かずにAI Botを実現できます。n8nなどの自動化ツールを中継役にすると、さらに柔軟な連携が可能になります。

本記事では「n8nを使わずDifyのAPIを直接Slackに接続する最もシンプルな構成」と、「n8nを中継するより高度な構成」の2パターンを紹介します。


全体アーキテクチャを把握しよう

構築前に、全体の流れを把握しておきましょう。

[Slack ユーザー]
     ↓ メッセージ送信
[Slack API / Event Subscriptions]
     ↓ Webhookでイベント送信
[中継レイヤー(n8n または 簡易サーバー)]
     ↓ DifyのAPIを呼び出し
[Dify アプリ(LLM + ナレッジベース)]
     ↓ 応答を返す
[中継レイヤー]
     ↓ Slackに返信
[Slack ユーザー]

この構成のポイントは「中継レイヤー」です。Slackはメッセージ受信後3秒以内にHTTP 200を返す必要があるため、LLMの処理時間(数秒〜十数秒)を考えると、非同期処理の仕組みが必要になります。n8nを使うとこの非同期処理も含めて対応できます。


STEP 1: Difyでチャットボットアプリを作成する

まずはDify側でAIアプリを作成します。Difyはクラウド版(dify.ai)とセルフホスト版の両方が利用できます。ここではクラウド版を使う前提で進めます。

1-1. アカウント作成とワークスペースの準備

  1. https://dify.ai/ にアクセスしてアカウントを作成
  2. ログイン後、「スタジオ」メニューから「アプリを作成」をクリック
  3. アプリタイプは 「チャットボット」 を選択
  4. アプリ名を入力(例:「社内FAQ Bot」)して作成

1-2. LLMモデルの設定

「設定」→「モデルプロバイダー」からAPIキーを登録します。OpenAIやAnthropicなど、利用したいプロバイダーのAPIキーを入力してください。

登録後、チャットボットの「オーケストレーション」画面でモデルを選択します。

推奨モデル(2025年時点):
- 高精度・多言語対応: claude-3-5-sonnet-20241022
- コスト重視: gpt-4o-mini
- 無料枠あり: gemini-1.5-flash

1-3. システムプロンプトの設定

チャットボットの「指示」欄にシステムプロンプトを入力します。社内Botとして使う場合の例を示します。

あなたは{{company_name}}の社内アシスタントです。
以下のルールを守って回答してください。

1. 日本語で丁寧に回答する
2. わからないことは「わかりません」と正直に伝える
3. 個人情報や機密情報は扱わない
4. 回答は簡潔に、要点を箇条書きで整理する
5. 社内ナレッジベースの情報を優先的に参照する

会社名: {{company_name}}

{{company_name}} のような変数は、Difyの変数機能で動的に差し込めます。

1-4. ナレッジベースの追加(オプションだが強力)

社内FAQや規程文書をAIに学習させたい場合は「ナレッジ」機能を活用しましょう。

  1. 左メニューの「ナレッジ」→「ナレッジを作成」
  2. PDFやテキストファイルをアップロード(例:社内規程.pdf、FAQ.csv)
  3. チャンクサイズやインデックス方法を設定(デフォルトで問題なし)
  4. 作成したナレッジをチャットボットのコンテキストに追加

RAG(Retrieval-Augmented Generation)によって、アップロードした文書を元に回答するAIが完成します。

1-5. APIキーの発行

チャットボットが完成したら、外部からAPIで呼び出せるようにします。

  1. アプリの「APIアクセス」メニューを開く
  2. 「APIキーを作成」をクリック
  3. 表示されたAPIキーを安全な場所にメモ(後で使います)

APIのベースURLは https://api.dify.ai/v1 です(セルフホストの場合は自分のドメイン)。


STEP 2: Slack Appを作成・設定する

次にSlack側の設定を行います。Slack API管理画面にアクセスしてください。

2-1. 新しいSlack Appを作成

  1. 「Create New App」→「From scratch」を選択
  2. App名(例:「AI Assistant」)とワークスペースを選択
  3. 「Create App」をクリック

2-2. 必要なOAuth権限(Scopes)を設定

「OAuth & Permissions」メニューで以下のBot Token Scopesを追加します。

必須スコープ:
- chat:write        (メッセージ送信)
- app_mentions:read (メンション検知)
- channels:history  (チャンネル履歴読み取り)
- im:history        (DM履歴読み取り)
- im:read           (DM情報読み取り)
- im:write          (DM送信)

設定後、「Install to Workspace」でワークスペースにインストールし、表示される Bot User OAuth Tokenxoxb- で始まる文字列)をメモします。

2-3. Event Subscriptionsを有効化

「Event Subscriptions」メニューで以下を設定します。

  1. 「Enable Events」をオンにする
  2. 「Request URL」に後で作成するWebhook URLを入力(後述)
  3. 「Subscribe to bot events」で以下を追加:
    • app_mention(Botへのメンション)
    • message.im(DM受信)

STEP 3: n8nで中継ワークフローを構築する

SlackからDifyへのメッセージ中継には、n8nを使います。n8nはノーコードの自動化ツールで、Slack・HTTP Request・各種APIノードが揃っており、今回のような連携に最適です。

3-1. n8nのセットアップ

n8nはクラウド版(n8n.io)またはDockerでのセルフホストが選べます。Dockerでの起動は以下のコマンドで簡単に始められます。

docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  -e N8N_SECURE_COOKIE=false \
  docker.n8n.io/n8nio/n8n

起動後、http://localhost:5678 にアクセスしてアカウントを作成します。

本番運用の場合: ngrokや自社ドメインでSSL化した上で外部公開してください。SlackのEvent APIはHTTPSエンドポイントにしか送信できません。

3-2. n8nワークフローの作成

新しいワークフローを作成し、以下のノードを順番に追加します。

ノード構成:

[Webhook] → [Function(メッセージ整形)] → [HTTP Request(Dify API呼び出し)] → [Slack(返信送信)]

Webhookノードの設定

  • Authentication: None(Slackの署名検証は別途対応推奨)
  • HTTP Method: POST
  • Path: /slack-dify-bot
  • Response Mode: Immediately(Slackの3秒タイムアウト対策)

Webhookノードを保存すると「Test URL」が発行されます。これをSTEP 2-3のRequest URLに設定します。

Functionノード(JavaScriptでメッセージを整形)

// Slackからのペイロードを解析してDify用に整形
const body = $input.first().json.body;

// URL検証チャレンジへの対応(初回設定時のみ必要)
if (body.type === 'url_verification') {
  return [{ json: { challenge: body.challenge } }];
}

// イベント情報の取得
const event = body.event;
const text = event.text || '';
const userId = event.user;
const channel = event.channel;

// Bot自身の発言はスキップ(無限ループ防止)
if (event.bot_id) {
  return [];
}

// メンション文字列(<@BOTID>)を除去してクリーンなテキストを取得
const cleanText = text.replace(/<@[A-Z0-9]+>/g, '').trim();

return [{
  json: {
    message: cleanText,
    userId: userId,
    channel: channel,
    conversationId: null // 会話IDはセッション管理で使用
  }
}];

HTTP RequestノードでDify APIを呼び出す

  • Method: POST
  • URL: https://api.dify.ai/v1/chat-messages
  • Authentication: Header Auth
    • Name: Authorization
    • Value: Bearer YOUR_DIFY_API_KEY
  • Body(JSON形式):
{
  "inputs": {},
  "query": "{{ $json.message }}",
  "response_mode": "blocking",
  "conversation_id": "",
  "user": "{{ $json.userId }}"
}

response_modeblocking にすることで、DifyのAPIが回答を生成してから返してくれます。streaming にするとトークンごとに返ってきますが、n8nでの処理が複雑になります。

SlackノードでユーザーへBotが返信する

Slackノードを追加して以下を設定します。

  • Resource: Message
  • Operation: Post
  • Channel: {{ $('Function').item.json.channel }}
  • Text: {{ $json.answer }}(DifyのAPIレスポンスの answer フィールド)

Slack Credentialsには、STEP 2-2で取得した Bot User OAuth Token を設定します。


STEP 4: 動作確認とデバッグ

4-1. テスト送信の実施

  1. n8nのワークフローをアクティブ化(右上のトグルをONに)
  2. SlackでBotが参加しているチャンネルで @AI Assistant こんにちは と送信
  3. 数秒後にBotから返信が来れば成功!

4-2. よくあるエラーと対処法

エラー: Slackにメッセージが届かない

  • n8nのWebhook URLがHTTPSになっているか確認
  • Slack AppがワークスペースにInstallされているか確認
  • Event SubscriptionsのRequest URLが正しいか確認

エラー: Dify APIから401 Unauthorized

  • APIキーが正しいか再確認
  • Authorization ヘッダーの形式が Bearer {APIキー} になっているか確認

エラー: Bot自身に無限ループが発生する

  • Functionノードの if (event.bot_id) return []; の処理が正しく動いているか確認
  • Slackの「Event Subscriptions」でBotのメッセージイベントを除外する設定を確認

エラー: Slackが「アプリが応答していません」と表示される

  • n8nのWebhookノードの「Response Mode」が Immediately になっているか確認(これが最重要)
  • Difyへのリクエストは非同期で行い、Slackへの返信は別のフローで行う設計を検討

STEP 5: 実用的なカスタマイズ例

基本構成が動いたら、業務用途に合わせてカスタマイズしていきましょう。

5-1. 会話履歴の継続(Conversation IDの管理)

DifyのAPIは conversation_id を使って会話コンテキストを保持できます。n8nのStatic Dataや外部データベースを使ってユーザーごとに会話IDを管理すると、「続きから話せるBot」が実現できます。

// n8nのFunctionノードで会話IDをユーザーごとに管理する例
const staticData = $getWorkflowStaticData('global');
const userId = $json.userId;

// 既存の会話IDを取得(なければnull)
const conversationId = staticData[`conv_${userId}`] || null;

return [{
  json: {
    ...($json),
    conversationId: conversationId
  }
}];

Dify APIの返答に含まれる conversation_id を次のリクエスト時に渡すことで、文脈を維持した会話が可能になります。

5-2. Slackのスラッシュコマンドで機能を分岐する

/faq 質問内容/summarize テキスト といったスラッシュコマンドを登録し、コマンドに応じてDifyの異なるアプリを呼び出す設計も可能です。

// スラッシュコマンドの判定例
const command = $json.body.command; // '/faq' など
const text = $json.body.text;

let difyAppUrl;
switch(command) {
  case '/faq':
    difyAppUrl = 'https://api.dify.ai/v1/chat-messages'; // FAQ Bot
    break;
  case '/summarize':
    difyAppUrl = 'https://api.dify.ai/v1/workflows/run'; // 要約ワークフロー
    break;
  default:
    difyAppUrl = 'https://api.dify.ai/v1/chat-messages';
}

return [{ json: { text, difyAppUrl } }];

5-3. 特定チャンネルのみBotを動作させる

すべてのチャンネルでBotが動くと混乱を招くことも。Functionノードでチャンネルを絞り込みましょう。

// 許可チャンネルリスト
const allowedChannels = ['C01234567', 'C09876543'];
const channel = $json.channel;

if (!allowedChannels.includes(channel)) {
  // 許可外チャンネルは処理をスキップ
  return [];
}

return [$input.first()];

セキュリティ上の注意点

業務で運用する場合、セキュリティ対策は必須です。

Slackリクエストの署名検証

SlackはWebhookリクエストに X-Slack-Signature ヘッダーを付与します。これを検証することで、なりすましリクエストを防げます。

// Slack署名検証(n8nのFunctionノード内)
const crypto = require('crypto');

const slackSigningSecret = 'YOUR_SLACK_SIGNING_SECRET';
const timestamp = $input.first().headers['x-slack-request-timestamp'];
const signature = $input.first().headers['x-slack-signature'];
const body = $input.first().json.$rawBody; // 生のリクエストボディ

// タイムスタンプが5分以内か確認(リプレイ攻撃防止)
const currentTime = Math.floor(Date.now() / 1000);
if (Math.abs(currentTime - timestamp) > 60 * 5) {
  throw new Error('Request timestamp is too old');
}

// HMAC-SHA256で署名を計算
const sigBaseString = `v0:${timestamp}:${body}`;
const hmac = crypto.createHmac('sha256', slackSigningSecret);
const computedSig = 'v0=' + hmac.update(sigBaseString).digest('hex');

if (computedSig !== signature) {
  throw new Error('Invalid Slack signature');
}

return [$input.first()];

APIキーの管理

  • DifyのAPIキーとSlackのBot Tokenは、n8nのCredentials機能を使って安全に管理する
  • コードや設定ファイルにAPIキーを直書きしない
  • 定期的にキーをローテーションする

まとめ:次のステップへ

DifyとSlackを組み合わせることで、エンジニアでなくても実用的なAI Botを業務に導入できることをご紹介しました。本記事で構築したシステムは以下のような場面で即戦力になります。

  • 社内FAQ対応: 人事・総務・IT部門への定型質問をAIが自動回答
  • 議事録・要約: 長いテキストをSlackに貼り付けて @Bot 要約して と依頼
  • コードレビューアシスト: スニペットを貼り付けて問題点を指摘させる
  • 多言語対応: 外国語のメッセージを日本語に翻訳して返答

次のステップとして取り組みたいこと:

  1. Difyのワークフロー機能を活用: 複数のAI処理を組み合わせた高度なパイプラインを構築する
  2. 社内ドキュメントをRAGに追加: Notionやconfluenceのページをインポートしてナレッジを充実させる
  3. n8nのエラー通知設定: ワークフローが失敗した際に管理者へSlack通知を送る仕組みを追加
  4. 利用ログの収集: BigQueryやSpreadsheetsにBotの会話ログを記録して改善に活用する

Difyは継続的に機能が追加されており、公式ドキュメントも充実しています。ぜひ公式リソースも参照しながら、自チームに最適なAI Botを育てていってください。


参考資料

この記事をシェア

XFacebookはてブ