2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【完全解説】ローカル環境でgpt -ossチャットボットを構築してみた(Docker※GPU※Slack連携)

Posted at

はじめに

生成系AIが進化し、巨大なモデルを自宅のマシンで動かしたい!という欲求に駆られて gpt -oss を触ってみました。OpenAI や Google のクラウドサービスを使わず、ローカルで大要引言言モデルを走らせる。その上で GPU を活用して高速推論し、Slack と連携したチャットボットまで作る一連の手順をまとめたのが本記事です。

gpt -ossとは?

gpt -oss は、Ollama 社が公開している オープンソースの大要引言言モデルです。最新バージョン(gpt-oss:latest)は約20.9Bパラメータを持ち、4ビット量子化(MXFP4)満たさなので VRAM 10【12 GB の GPU でも動かすことができます。ライセンスも利用しやすく、自宅 PC や研究用途に最適です。

OllamaとDockerで環境を整える

Docker イメージの取得と走機

まずは Ollama の Docker イメージを取得して起動します。以下のコマンドだけで API サーバーが立ち上がり、HTTP でモデルを利用できるようになります:

# イメージ取得
docker pull ollama/ollama:latest

# 初回起動(CPUモード)
docker run -d --name ollama \
  -p 11434:11434 \
  ollama/ollama:latest

これで localhost:11434 で Ollama の API が利用可能です。

モデルデータの保存場所を変更(SSD 推奨)

Ollama はデフォルトでコンテナ内の /root/.ollama にモデルを保存します。読み書き速度を上げたい場合、ホストの SSD に保存先を変更しましょう。任意のディレクトリ(ここでは C:\\SSD\\ollama_data)を作り、ボリュームマウントします:

# SSDフォルダに変更して再起動
docker stop ollama; docker rm ollama

docker run -d --name ollama \
  -p 11434:11434 \
  -v C:\\SSD\\ollama_data:/root/.ollama \
  ollama/ollama:latest

GPU 推論で爆速にする

RTX 3060 (12 GB) や 3080 等を使って GPU 推論するには、NVIDIA ドライバと WSL2 の環境を整えた上で、Docker コンテナ起動時に以下のオプションを付けます。

docker stop ollama; docker rm ollama

docker run -d --name ollama \
  --gpus all \
  -e OLLAMA_HOST=0.0.0.0:11434 \
  -e OLLAMA_NUM_GPU=35 \
  -p 11434:11434 \
  -v C:\\SSD\\ollama_data:/root/.ollama \
  ollama/ollama:latest

ここで --gpus all によりコンテナに GPU が渡され、環境変数 OLLAMA_NUM_GPU でどれだけの Transformer 層を GPU にオフロードするか指定します。12 GB VRAM を持つ RTX 3060 の場合、35層程度が直定です。docker logs ollama の起動ログに num_gpu_layers = 35using CUDA backend と表示されていれば GPU 推論が有効になっています。

Open WebUI で手軽に試す

コンソールではなく GUI でやり取りしたい人向けに、Ollama と連携する Web UI も用意されています。下記コマンドでポート 3000 に WebUI を立ち上げてみましょう。

docker run -d --name open-webui \
  -p 3000:8080 \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  -v open-webui-data:/app/backend/data \
  ghcr.io/open-webui/open-webui:main

ブラウザで http://localhost:3000 を開き、Setting → Ollama → num_gpu を 35 に設定してから gpt-oss をプルすると、そのままチャットできるようになります。GUI で気軽にプロンプトを投げられるので、挙動の確認に便利です。

Slack と連携してチャットボットにする

Slack App の作成

次に Slack と gpt -oss を結んでチャットボットにしてみましょう。Slack API からメッセージを受け取るため、まずは Slack App を作成し、下記の Bot Scopes を付与します。

  • app_mentions:read:メンションを受け取る
  • im:history:DM の履歴を読む
  • chat:write:Bot がメッセージを送る
  • channels:history:チャンネルの履歴を読む

Event Subscriptions では Request URL に後述の公開 URL を設定し、Bot Events に app_mentionmessage.im を追加します。インストール後、Bot Token (xoxb-...) と Signing Secret をメモしてください。

Python(FastAPI+Slack Bolt)でサーバー実装

Conda などで Python 環境を用意し、Slack Bolt と FastAPI を組み合わせて Web サーバーを実装します。以下はシンプルな例です:

# 環境構築
conda create -n slack-ollama python=3.10 fastapi uvicorn requests -c conda-forge
conda activate slack-ollama
pip install slack-bolt slack-sdk python-dotenv aiohttp

そして main.py を作成:

import os, asyncio, requests, re
from dotenv import load_dotenv
from fastapi import FastAPI, Request
from slack_bolt.async_app import AsyncApp
from slack_bolt.adapter.fastapi.async_handler import AsyncSlackRequestHandler

load_dotenv()

bolt = AsyncApp(
    token=os.getenv("SLACK_BOT_TOKEN"),
    signing_secret=os.getenv("SLACK_SIGNING_SECRET"),
)
handler = AsyncSlackRequestHandler(bolt)

def ollama_generate(prompt: str) -> str:
    url = os.getenv("OLLAMA_URL").rstrip("/") + "/api/generate"
    payload = {
        "model": "gpt-oss",
        "prompt": prompt,
        "stream": False,
        "options": {"num_gpu_layers": int(os.getenv("NUM_GPU_LAYERS","35"))},
    }
    # 最大5分待機
    r = requests.post(url, json=payload, timeout=300)
    r.raise_for_status()
    return r.json()["response"].strip()

@bolt.event("app_mention")
@bolt.message(re.compile(".*"))
async def reply(event, say):
    await say("\u23f3 \u63a8\u8b70\u4e2d\u2026")
    ans = await asyncio.to_thread(ollama_generate, event["text"])
    await say(ans)

api = FastAPI()
@api.post("/slack/events")
async def slack_events(req: Request):
    return await handler.handle(req)
@api.get("/")
async def health(): return {"status":"ok"}

.env に Bot Token と Signing Secret、Ollama の URL (http://localhost:11434) と NUM_GPU_LAYERS=35 を設定し、次のコマンドでサーバーを起動します:

python -m uvicorn main:api --host 0.0.0.0 --port 3030

Cloudflare Quick Tunnel で外部公開

Slack からイベントを受け受るために、ローカルサーバーをインターネットに公開する必要があります。そこで便利なのが Cloudflare の Quick Tunnel(無料)。インストール後、以下のコマンドでポート 3030 を外部に公開できます:

cloudflared tunnel --url http://localhost:3030

実行すると https://xxxx.trycloudflare.com のような URL が発行されるので、Slack の Event Subscriptions の Request URL を https://xxxx.trycloudflare.com/slack/events に設定します。確認用のリクエストで 200 OK が返れば設定完了です。

おわりに

生成 AI をローカル環境で動かし、Slack ボットとして活用するまでの流れをまとめました。Docker で簡単にセットアップでき、GPU を使うことで実用的な速度が出せることが分かります。gpt -oss はオープンソースなので、モデルファイルをダウンロードすればインターネット接続がなくても推論できます。

今後は量子化モデル(Q4_K_M など)を試してさらなる高速化や、Bot の機能追加も検討してみたいと思います。この記事が「ローカル LLM やってみたい!」という方の参考になれば幸いです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?