SlackからLLMを呼んでみた、要約させてみた

# SlackからLLMを呼んでみた、要約させてみた

Vertex AI Gemini を利用して Slack スレッドを自動要約する Bot です。スレッド内で「@bot 要約」または「@bot summarize」と入力することで、AIがスレッドの内容を要約します。
slackからアプリの連携を試してみたくて作成してみました。

## 機能
- slackからLLMの呼び出し
- スレッド内の会話を自動要約

## git
https://github.com/sts1992/slack-app-demo

## 目次

1. [システム要件](#システム要件)
2. [インストール方法](#インストール方法)
3. [設定](#設定)
4. [使用方法](#使用方法)
5. [ファイル構成](#ファイル構成)
6. [カスタマイズ](#カスタマイズ)
7. [トラブルシューティング](#トラブルシューティング)
8. [ライセンス](#ライセンス)

## システム要件

- Python 3.9+（Debian 12のデフォルト）
- Google Cloud Platform アカウント
- Vertex AI API の有効化
- Slack ワークスペースの管理者権限（またはアプリ作成権限）
- Debian 12 (Bookworm)

## インストール方法

### 1. リポジトリのクローン

```bash
# 必要なパッケージをインストール
sudo apt update
sudo apt install -y git python3-pip python3-venv nginx

# リポジトリのクローン
git clone https://github.com/sts1992/slack-app-demo.git
cd slack-app-demo
```

### 2. 環境のセットアップ

```bash
# 仮想環境の作成とアクティベート
python3 -m venv venv
source venv/bin/activate

# 依存関係のインストール
pip install -r requirements.txt
```

### 3. Nginx と SSL の設定（本番環境用）

```bash
# 証明書を保存するディレクトリを作成
sudo mkdir -p /etc/nginx/ssl

# 秘密鍵と証明書を生成
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/nginx.key \
  -out /etc/nginx/ssl/nginx.crt

# 重要: プロンプトが表示されたら、Common Name に必ず値を入力してください
# サーバーのドメイン名または IP アドレスを設定します

# Nginx の設定
sudo cp nginx/slack-summarizer.conf /etc/nginx/sites-available/
sudo ln -s /etc/nginx/sites-available/slack-summarizer.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```

### 4. サービスの設定

```bash
# サービスファイルをコピー
sudo cp systemd/slack-thread-summarizer.service /etc/systemd/system/

# パスを環境に合わせて編集
sudo vim /etc/systemd/system/slack-thread-summarizer.service

# サービスの有効化と起動
sudo systemctl daemon-reload
sudo systemctl enable slack-thread-summarizer.service
sudo systemctl start slack-thread-summarizer.service
```

## 設定

### 1. Google Cloud の設定

1. GCP コンソールで「APIとサービス」→「ライブラリ」に移動し、Vertex AI API を有効化
2. サービスアカウントを作成し、以下の役割を付与:
   - Vertex AI ユーザー (roles/aiplatform.user)
   - Vertex AI サービス エージェント (roles/aiplatform.serviceAgent)
3. サービスアカウントのキーを JSON 形式でダウンロードし、`credentials` ディレクトリに配置

### 2. Slack アプリの設定

1. [Slack API](https://api.slack.com/apps) にアクセスし、「Create New App」をクリック
2. App Name（例: ThreadSummarizerBot）を入力
3. 開発するワークスペースを選択
4. 「OAuth & Permissions」で以下の権限（スコープ）を追加:
   - `app_mentions:read` - ボットのメンションを検知
   - `channels:history` - チャンネルのメッセージ履歴を読み取る
   - `groups:history` - プライベートチャンネルの履歴を読み取る 
   - `chat:write` - メッセージを送信
5. 「Event Subscriptions」を有効化し、Request URL を設定（サーバーの URL: `https://your-server-ip/`）
6. 「Subscribe to bot events」で `app_mention` イベントを追加
7. アプリをワークスペースにインストールし、Bot User OAuth Token を取得

### 3. 環境変数の設定

`.env.example` ファイルを `.env` にコピーし、必要な値を設定します：

```bash
cp .env.example .env
vim .env
```

以下の変数を設定してください：

```
SLACK_VERIFICATION_TOKEN=your_verification_token
SLACK_BOT_TOKEN=your_bot_token
SLACK_CHANNEL_ID=your_channel_id
PORT=8080
GOOGLE_APPLICATION_CREDENTIALS=./credentials/service-account-key.json
VERTEX_AI_PROJECT_ID=your_google_cloud_project_id
VERTEX_AI_LOCATION=us-central1
VERTEX_AI_MODEL_ID=gemini-2.5-pro-preview-03-25
```

## 使用方法

1. ボットをチャンネルに招待:
   ```
   /invite @your_bot_name
   ```

2. LLMに呼びかける
    ```
    @your_bot_name こんにちは
    ```

2. スレッド内でボットを呼び出して要約を依頼:
   ```
   @your_bot_name 要約
   ```
   または
   ```
   @your_bot_name summarize
   ```

3. ボットが「スレッドを要約しています...」と返信し、その後要約を表示します

## ファイル構成

```
slack-app-demo/
├── app.py                     # メインアプリケーション
├── slack_utils.py             # Slack API 関連機能
├── vertex_ai_utils.py         # Vertex AI 関連機能
├── .env.example               # 環境変数テンプレート
├── requirements.txt           # 依存関係
├── README.md                  # このファイル
├── credentials/               # 認証情報（.gitignore に追加済み）
│   └── .gitkeep
├── nginx/                     # Nginx 設定
│   └── slack-summarizer.conf
└── systemd/                   # Systemd サービス設定
    └── slack-thread-summarizer.service
```

## アプリケーションコード

アプリケーションは主に3つのPythonファイルで構成されています。詳しくがgitをご確認ください。：

1. **slack_utils.py**: Slack API との連携を処理
2. **vertex_ai_utils.py**: Vertex AI との連携を管理
3. **app.py**: イベントを処理するメインFlaskアプリケーション

その他の設定ファイル：
- **.env.example**: 環境変数のテンプレート
- **requirements.txt**: Python依存関係
- **nginx/slack-summarizer.conf**: Nginxウェブサーバー設定
- **systemd/slack-thread-summarizer.service**: システムサービス定義

## カスタマイズ

### 要約スタイルの変更

`vertex_ai_utils.py` の `generate_thread_summary` 関数内のシステムプロンプトを変更することで、要約スタイルをカスタマイズできます。

### 複数の要約スタイルの追加

コマンドに引数を追加して、詳細/簡潔など複数の要約スタイルをサポートするようにカスタマイズすることも可能です。

```python
# 例: app.py の process_llm_response 関数内で処理を追加
if re.search(r'summarize|要約', message.lower()):
    # スタイルの検出
    is_detailed = re.search(r'detailed|詳細', message.lower()) is not None
    is_bullet = re.search(r'bullet|箇条書き', message.lower()) is not None
    
    # システムプロンプトの選択
    if is_detailed:
        system_prompt = DETAILED_PROMPT
    elif is_bullet:
        system_prompt = BULLET_PROMPT
    else:
        system_prompt = DEFAULT_PROMPT
        
    # 残りの処理...
```

## トラブルシューティング

### Vertex AI の対応モデルの確認と更新
モデルのバージョンや利用可能性は定期的に変更される
最新の対応モデルを確認して更新すること

現在の設定を確認:
```bash
grep VERTEX_AI_MODEL_ID .env
```

Vertex AI のモデルページで最新の対応モデルを確認
https://cloud.google.com/vertex-ai/generative-ai/docs/models?hl=ja

.env ファイルを更新:
```bash
vim .env
```

サービスを再起動して変更を適用:
```bash
sudo systemctl restart slack-thread-summarizer.service
```

### ログの確認

```bash
# アプリケーションログ
sudo journalctl -u slack-thread-summarizer.service -f

# Nginx エラーログ
sudo tail -f /var/log/nginx/error.log
```

### あとがき
slackから呼び出せるといろいろ便利そうですよね。
ちなみにほぼclaude先生に作ってもらいました。

## ライセンス

MIT