見出し画像

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 に入れておきます。
それぞれの行で<質問、回答>のペアになっています。

まふゆ、今日聴いた曲や歌の中で、何か感じるものはあった?
まふゆは、どう思った?
それは、嫌なこと?それとも嬉しいこと?
たくさん聞いてもらえるといいね!
それは心からの謝罪?
まふゆは今日どうだった?

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 で

で、こんな感じになります。

今日の天気は?
応答: ・・・しつこい、無視しないで</s>

まふゆちゃんかわいいね
応答: はは。そんなことはないよ。私はただ、こうやって誰かと話ができたから、それでいい</s>

 やっぱ 4Bit 量子化してるのとデータセットがまだ少ないので、だいぶ話が通じてない感じになっていますが、キャラの特徴は出ています。ここは今後の改善ポイントです。(⇩今回のキャラ)

Bluesky Bot の運用


 というわけで、完成品のまふゆちゃん bot です。メンションして話しかけてみてください (電気代が高すぎて払えないのと、しばらくメンテナンスが続きますが…)。

こんな感じで動きます。

最後に


 というわけで、今回は Bluesky でメンションを取得し、そのメッセージに回答する chatBot をすべてローカル環境でできるようにしてみました。
Twitter と比べて認証周りの難易度が低いのでぜひ作ってみてください。それと、うちのまふゆちゃんもよろしくお願いいたします。

まふゆちゃん

ぎこちない笑顔がかわいい!!優勝!!!10億点!!!

 最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーでは Midjourney やStable Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(2,600 字,teftef)

 ↓↓もしよろしければこの記事と開発の支援お願いいたします!

※注意 : 支援してくださる方へ

 ※注意 :ここから先は何も内容がありません。しかし、この記事をお読みいただき、良かったと感じていただけたのであれば、この記事と開発の支援お願いいたします!


ここから先は

48字

¥ 500

この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?