BlueskyBot+LLM をローカル環境で動かす。
こんにちはこんばんは、teftef です。今回は,BlueSky が招待コードなしで使えるようになったので、自然言語と組み合わせてメンションに対して返信する Bot を作ったという話です。
私もまだ初学者であり、説明が間違っていたり勘違いがある可能性が 0 ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。また、この記事を作成するにあたり、GPT-4 による校正、修正が含まれています。
組み合わせた、LLM エージェントはこちら ⇩
※この記事は有料となっていますが、最後まで内容が読めます。
パーツ
まず、簡単に用いるものを並べていきます。
ローカル LLM
主の GPUの VRAM が 8GB とよわよわなので、ローカル LLM を4Bit 量子化して使用します。今回は Rinnna 様の rinna/japanese-gpt-neox-3.6b-instruction-sft モデルを使用させていただきました。このモデルにファインチューンしていきます。
Bluesky API
Bluesky の PAI は Twitter と違って認証とか必要なく、無料で使えるので、とってもテストがしやすくて助かります。
全体の構成
簡単にこんな感じ
メンションをリアルタイムで検知しそのメッセージを取得し、 LLM に渡して、その返答を同じ送信者に対してリプライします。
LLM のファインチューニング
今回は Npakaさんの記事を参考にファインチューニングします。
VRAM の制約があるため 、モデルを4Bit まで量子化して行います。
こちらは GoogleColab でやったほうが早かったので、Google Colab を使います。
データセットはこのように、question.txt と answer.txt に入れておきます。
それぞれの行で<質問、回答>のペアになっています。
こいつを json にしています。
[
{
"index": "00001",
"instruction": "まふゆ、今日聴いた曲や歌の中で、何か感じるものはあった?",
"output": "特に何も..."
},
{
"index": "00002",
"instruction": "まふゆは、どう思った?",
"output": "・・・暖かくて、いいと思った..."
},
...
Bluesky API
これ意外と簡単で、例えばポストするだけなら数行でできます。
from atproto import Client
bluesky = Client(base_url="https://bsky.social")
bluesky.login(login="BS_USER_NAME", password="BS_PASSWORD")
bluesky.send_post(args.prompt+'\n'+str(text))
取得は少し面倒でした…これ書くと長くなるので、 GitHub に載せておこうと思います。
今回はこちらのコードを参考にさせていただきました。改めまして著者の方にお礼を申し上げます。
atproto の仕様に関してはこちらを⇩
LLM の推論
これも GoogleColab に載せているので詳しくは書きませんが、
メッセージをに少し編集を加えて LLM が答えやすいような Prompt にしていきます。
prompt = f"""指示:{message}
応答:
"""
input_ids = tokenizer.encode(final_prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
input_ids=input_ids.to(device=model.device),
max_length=200,
temperature=0.7,
do_sample=True,
)
output = tokenizer.decode(output_ids.tolist()[0][input_ids.size(1):])
という感じでできます。詳しくは GitHub で
で、こんな感じになります。
やっぱ 4Bit 量子化してるのとデータセットがまだ少ないので、だいぶ話が通じてない感じになっていますが、キャラの特徴は出ています。ここは今後の改善ポイントです。(⇩今回のキャラ)
Bluesky Bot の運用
というわけで、完成品のまふゆちゃん bot です。メンションして話しかけてみてください (電気代が高すぎて払えないのと、しばらくメンテナンスが続きますが…)。
こんな感じで動きます。
最後に
というわけで、今回は Bluesky でメンションを取得し、そのメッセージに回答する chatBot をすべてローカル環境でできるようにしてみました。
Twitter と比べて認証周りの難易度が低いのでぜひ作ってみてください。それと、うちのまふゆちゃんもよろしくお願いいたします。
ぎこちない笑顔がかわいい!!優勝!!!10億点!!!
最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーでは Midjourney やStable Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(2,600 字,teftef)
↓↓もしよろしければこの記事と開発の支援お願いいたします!
※注意 : 支援してくださる方へ
※注意 :ここから先は何も内容がありません。しかし、この記事をお読みいただき、良かったと感じていただけたのであれば、この記事と開発の支援お願いいたします!
ここから先は
¥ 500
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?