🤖
LM StudioとDiscord.pyを活用してローカルLLMが応答するインテリジェントDiscordボットの構築方法
はじめに
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
-
Discord.py:
- Python用のライブラリで、Discord APIを使ってボットを作成するために必要です。
-
openai:
- LM StudioはOpenAI APIエンドポイントを模倣するローカルHTTPサーバを起動します。もしかしたらインストール不要かもしれません。
-
dotenv:
- 環境変数を管理するためのライブラリです。インストール必須ではありません。
必要なアカウントと設定
-
Discord Developer Portal:
- Discordボットを作成するために、Discord Developer Portalにアクセスし、アカウントを作成してください。
- ボットに必要な権限を設定します。
- 新しいボットを作成し、ボットトークンを取得します。このトークンは後で必要になります。
Holy_fox 様の記事がとても参考になりました。
-
LM Studioの設定:
- LM Studioをインストールし、ローカルサーバーを設定します。
事前に、虫眼鏡をクリックして好きな言語モデルをダウンロードします。今回はMicrosoftのPhi-3を使用しました。
ローカルサーバーを立ち上げるには左側の⇔ボタンをクリックします。Start Serverをクリックしてローカルサーバーを立ち上げます。
- LM Studioをインストールし、ローカルサーバーを設定します。
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に質問することができるボットが動作します。
質問
回答
参考資料
Discussion