🤖

LM StudioとDiscord.pyを活用してローカルLLMが応答するインテリジェントDiscordボットの構築方法

2024/05/24に公開

はじめに

Discordはゲーマーやコミュニティ向けの人気チャットプラットフォームで、さまざまなボットを使って機能を拡張できます。しかし、ローカル環境で言語モデルをボットとして利用できるとしたら、もっと便利だと思いませんか?

LM Studioは、ローカル環境で大規模言語モデル(LLM)を実行できるツールです。
検索ボタンから気になる言語モデルをダウンロードできて、初心者でも比較的使いやすいです。

このブログでは、LM Studioを使ってローカルで実行されるLLMが質問に答えるDiscordボットを構築する方法を紹介します。

動作環境

Windows11
Python 3.10.6
discord.py 2.3.2

仮想環境(venvなど)を使うかどうかはお任せします。

準備

LM Studio:

  • ローカルで実行できる大規模言語モデル(LLM)です。公式サイトからダウンロードしてインストールしてください。

必要なライブラリ

pip install discord.py openai python-dotenv
  1. Discord.py:

    • Python用のライブラリで、Discord APIを使ってボットを作成するために必要です。
  2. openai:

    • LM StudioはOpenAI APIエンドポイントを模倣するローカルHTTPサーバを起動します。もしかしたらインストール不要かもしれません。
  3. dotenv:

    • 環境変数を管理するためのライブラリです。インストール必須ではありません。

必要なアカウントと設定

  1. Discord Developer Portal:
    • Discordボットを作成するために、Discord Developer Portalにアクセスし、アカウントを作成してください。
    • ボットに必要な権限を設定します。
    • 新しいボットを作成し、ボットトークンを取得します。このトークンは後で必要になります。

Holy_fox 様の記事がとても参考になりました。
https://qiita.com/Holy_fox/items/acb4102c1b097c95c5e9

  1. LM Studioの設定:
    • LM Studioをインストールし、ローカルサーバーを設定します。
      事前に、虫眼鏡をクリックして好きな言語モデルをダウンロードします。今回はMicrosoftのPhi-3を使用しました。
      ローカルサーバーを立ち上げるには左側の⇔ボタンをクリックします。Start Serverをクリックしてローカルサーバーを立ち上げます。

ローカルサーバー設定

Discordボットの実装

.envファイルの作成

Pythonスクリプトを作成する前に先ほどdotenvをインストールした方は.envファイルを作成して以下のyour_discord_bot_tokenボットトークンを入力します。

DISCORD_BOT_TOKEN=your_discord_bot_token
LM_STUDIO_API_KEY=lm-studio
LM_STUDIO_BASE_URL=http://localhost:1234/v1
MODEL_IDENTIFIER=model-identifier

ボットの初期設定

今回は、lm_studio_discord_bot.pyというPythonスクリプトを作成します。Discord上で/askというコマンドの後に質問などを入力するとLM Studio側の言語モデルが回答してくれます。

import discord
from discord.ext import commands
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
DISCORD_BOT_TOKEN = os.getenv('DISCORD_BOT_TOKEN')
LM_STUDIO_API_KEY = os.getenv('LM_STUDIO_API_KEY')
LM_STUDIO_BASE_URL = os.getenv('LM_STUDIO_BASE_URL')
MODEL_IDENTIFIER = os.getenv('MODEL_IDENTIFIER')

intents = discord.Intents.default()
intents.messages = True

bot = commands.Bot(command_prefix='!', intents=intents)
client = OpenAI(base_url=LM_STUDIO_BASE_URL, api_key=LM_STUDIO_API_KEY)

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user}')
    await bot.tree.sync()

@bot.tree.command(name="ask", description="Ask a question to the LM Studio's LLM")
async def ask(interaction: discord.Interaction, question: str):
    await interaction.response.defer()
    try:
        response = client.chat.completions.create(
            model=MODEL_IDENTIFIER,
            messages=[
                {"role": "system", "content": "You are an intelligent assistant. You always provide well-reasoned answers that are both correct and helpful."},
                {"role": "user", "content": question}
            ],
            temperature=0.7,
        )
        reply = response.choices[0].message.content
        await interaction.followup.send(reply)
    except Exception as e:
        await interaction.followup.send(f"Error: {str(e)}")

bot.run(DISCORD_BOT_TOKEN)

ボットのデプロイとテスト

ターミナルやコマンドプロンプトで以下のコマンドを実行します。

python lm_studio_discord_bot.py

これで、Discordで/askコマンドを使用してLM StudioのLLMに質問することができるボットが動作します。

質問
Discord

回答
answer

参考資料

https://discordpy.readthedocs.io/ja/latest/

Discussion