はじめに

近年、生成AIの活用が急速に進んでいますが、「自社の業務にどう活かせばいいか分からない」と感じている方も多いのではないでしょうか。最も手軽で効果的な活用法の一つが、日常的に利用するSlackにAIボットを導入することです。これにより、情報検索、文章の要約・翻訳、アイデア出しなどをSlack上で完結でき、チーム全体の生産性向上に繋がります。

この記事では、Python、Slack Boltフレームワーク、そしてOpenAI APIを使って、メンションに反応するシンプルな生成AIボットを1日で構築する手順を解説します。ローカルでの開発から、AWS Lambdaを使ったサーバーレス環境へのデプロイまで、実践的な知識を網羅的に学びます。プログラミング初中級者の方でも挑戦できるよう、ステップバイステップで進めていきましょう。

準備編:SlackアプリとAPIキーの取得

ボット開発の第一歩は、Slackアプリの作成と必要な認証情報の取得です。まず、Slack APIのサイトにアクセスし、「Create New App」から新しいアプリを作成します。「From scratch」を選び、アプリ名と導入したいワークスペースを指定してください。

次に、ボットに必要な権限(Scopes)を設定します。「OAuth & Permissions」メニューに移動し、「Bot Token Scopes」にapp_mentions:read(メンションの読み取り)とchat:write(メッセージの投稿)を追加しましょう。設定後、ページ上部で「Install to Workspace」をクリックしてアプリをワークスペースにインストールします。これにより、xoxb-で始まる「Bot User OAuth Token」が発行されます。

最後に、「Basic Information」メニューで「App-Level Tokens」と「Signing Secret」を確認します。「Signing Secret」はリクエストの正当性を検証するために後ほど使用します。また、別途OpenAIの公式サイトでAPIキーを取得しておきましょう。これらの情報はコードに直接書かず、安全に管理することが重要です。

実装編:PythonとSlack Boltでボットの骨格を作る

次に、Pythonでボットの基本的な動作を実装します。Slack Bolt for Pythonは、Slackアプリ開発を大幅に簡素化してくれる公式フレームワークです。まず、プロジェクト用のディレクトリを作成し、仮想環境を有効にしてから必要なライブラリをインストールします。

# 仮想環境の作成と有効化
python -m venv venv
source venv/bin/activate

# 必要なライブラリのインストール
pip install slack_bolt openai python-dotenv

次に、app.pyというファイルを作成し、ボットの本体を記述します。以下のコードは、ボットへのメンションを検知して「こんにちは!」とスレッドに返信する最もシンプルな例です。環境変数からSlackのトークンとSigning Secretを読み込むためにos.environを使用しています。

import os
from slack_bolt import App

# アプリの初期化
app = App(
    token=os.environ.get("SLACK_BOT_TOKEN"),
    signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)

# メンションイベントへの応答
@app.event("app_mention")
def handle_mentions(body, say):
    thread_ts = body["event"].get("thread_ts", body["event"]["ts"])
    say(text="こんにちは!", thread_ts=thread_ts)

# アプリの起動(ローカルテスト用)
if __name__ == "__main__":
    app.start(port=int(os.environ.get("PORT", 3000)))

この段階で、ローカルで実行し、ngrokなどのツールで外部に公開すれば、Slackからのメンションに反応することを確認できます。thread_tsを指定することで、元のメッセージのスレッドに返信できるのがポイントです。

機能拡張:生成AIとの連携

ボットの骨格ができたら、いよいよ生成AI(OpenAI API)と連携させます。メンションされたテキストをプロンプトとしてAIに渡し、その応答をSlackに投稿するロジックを追加しましょう。まず、OpenAIライブラリをインポートし、APIクライアントを初期化します。

次に、handle_mentions関数を修正します。ユーザーからのメンションテキストを取得し、それをプロンプトとしてOpenAIのChat Completions APIに送信します。APIからの応答を待っている間、ユーザーに「考え中...」といったメッセージを表示すると、操作性が向上します。

import os
import openai
from slack_bolt import App

# OpenAIクライアントの初期化
openai.api_key = os.environ.get("OPENAI_API_KEY")

app = App(
    token=os.environ.get("SLACK_BOT_TOKEN"),
    signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)

@app.event("app_mention")
def handle_mentions(body, say):
    event = body["event"]
    thread_ts = event.get("thread_ts", event["ts"])
    user_text = event["text"].split(">")[1].strip() # メンション部分を除去

    # 処理中メッセージを投稿
    thinking_message = say(text="🤔 考え中です...", thread_ts=thread_ts)

    try:
        response = openai.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": user_text}]
        )
        ai_response = response.choices[0].message.content
        
        # 結果をスレッドに投稿(処理中メッセージは更新しない)
        say(text=ai_response, thread_ts=thread_ts)

    except Exception as e:
        say(text=f"エラーが発生しました: {e}", thread_ts=thread_ts)
    
    # ここでは処理中メッセージを削除・更新する処理は省略

if __name__ == "__main__":
    app.start(port=int(os.environ.get("PORT", 3000)))

このコードでは、ユーザーの入力をそのままcontentに渡しています。実際には、システムプロンプトを追加してAIの役割や口調を定義したり、過去のやり取りをコンテキストとして含めることで、より高度な対話が可能になります。

デプロイと運用:サーバーレスで簡単公開

ローカルで動作確認ができたら、ボットを本番環境にデプロイします。常時稼働させるサーバーを自前で用意するのは大変なので、AWS LambdaやGoogle Cloud Functionsのようなサーバーレス環境を利用するのがおすすめです。リクエストがあった時だけコードが実行されるため、コストを抑えられ、サーバーメンテナンスも不要です。

ここではAWS Lambdaへのデプロイを想定します。Slack Boltには、Lambdaで動作させるためのアダプタが用意されています。app.pyをLambdaハンドラ形式に書き換え、必要なライブラリと一緒にZIPファイルにまとめてアップロードします。APIキーなどの機密情報は、Lambdaの環境変数に設定することで、コード内にハードコーディングするのを防ぎます。

# lambda_handler.py の例
import os
# (app.pyで定義したappをインポート)
from app import app 
from slack_bolt.adapter.aws_lambda import SlackRequestHandler

# ログレベル設定
SlackRequestHandler.clear_all_log_handlers()

# Lambdaハンドラ
def handler(event, context):
    slack_handler = SlackRequestHandler(app=app)
    return slack_handler.handle(event, context)

Lambda関数を作成したら、API Gatewayをトリガーとして設定し、発行されたURLをSlackアプリ設定の「Event Subscriptions」にある「Request URL」に登録します。これで、SlackでのメンションがAPI Gatewayを経由してLambda関数を呼び出し、ボットが応答するようになります。運用開始後は、CloudWatch Logsなどでエラーを監視し、安定稼働を維持しましょう。

まとめ

本記事では、PythonとSlack Bolt、OpenAI APIを利用して、社内Slackで利用できる生成AIボットを1日で構築する手順を紹介しました。Slackアプリの作成から、基本的な応答ロジックの実装、生成AIとの連携、そしてサーバーレス環境へのデプロイまで、一連の流れを体験いただけたかと思います。

今回作成したボットは非常にシンプルですが、これを基盤として様々な応用が考えられます。例えば、社内ドキュメントをベクトル化して読み込ませるRAG(Retrieval-Augmented Generation)を実装すれば、社内情報に特化した質問応答システムを構築できます。また、特定のキーワードに反応して定型業務(例:JIRAチケットの起票)を自動化することも可能です。

まずはこの記事を参考に、あなたのチームだけのAIアシスタントを誕生させてみてください。小さな一歩が、組織全体の業務効率を大きく変えるきっかけになるかもしれません。