自分のクローンAIを作ろう
皆さん、こんにちは。
皆さんは自分がもう一人いたらいいなと思ったことはありませんか?
ないですよね、僕もないです。(じゃあタイトルなんなんだ)
このの記事はローカルLLMに向き合う会のアドカレネタとして書いています。
https://qiita.com/advent-calendar/2025/large-language-model
今回のテーマはXのポストを学習させて自分だけのオリジナルLLMを作ろう!
というものです。
LLMの学習と聞くと皆さんはどんなイメージを持たれるでしょうか。
「なんか学習コストが高そう」
「めちゃくちゃ難しそう」
突き詰めていくと確かにそのとおりではあるのですが、軽量モデルをLora,QLoraで「学習するだけ」なら割と簡単に試せてしまいます。
そう、Unsloth公式colabノートブックならね。
ボタンをポチポチしてるだけでとりあえずファインチューニングができてしまうので、ローカルLLM初心者の方にもおすすめです。実用性はデータセットの質やベースモデルによるのでともかく、学習の流れがなんとなくつかめると思います。
データセットの用意と学習準備
すでにHuggingFace上にある高品質なデータセットを活用してもいいのですが、それだと面白味に欠けますよね。
そこで今回は自分のツイートを学習させてみようと思います。
モデルはqwen3-4b-instructをチューニングし、その後量子化ggufを保存してHuggingFaceにアップロードします。qwen3-4b-instructである理由は、推論データセットを作るのがちと手間なのと、完成した量子化モデルが一般的なノートPCなどでも動くサイズ感だからです。
上記からQwen3-2507-4BのInstructをクリックするとUnslothの公式Colabノートブックに飛べます。
基本的にはデータセットの部分だけを自作のものに置き換えて実行するだけでOKなのですが、このノートブックではShareGPT形式というデータセット形式のもの(mlabonne/FineTome-100k)がサンプルとして使われているので、データセット作成の段階でこの形式に合わせてしまいましょう。
元となるXのデータについてはご自身のXアカウントよりアーカイブをダウンロードから取得してください。
取得できるまでに24時間ほどのタイムラグがあるのでご注意を。
Zipファイルをダウンロードしたら、中身のtweets.jsというファイルがあなたの全ツイートデータです。
そのままでは使いものにならないので、まずはうまくパースしてツイート本文のみを抜き出す必要があります。
流れとしては、ツイート本文を抜き出す→LLMで逆質問を生成する→ShareGPT形式で保存する、となります。
この一連の流れを行うスクリプトが以下です。codexに作ってもらいました。
デフォルトではローカルLLM(LM-Studio経由でgpt-oss-20bを用いる)で逆質問生成を行うようになっていますが、適宜改造して使ってください。
例として、extract_plain_text_tweets.pyの後にgenerate_sharegpt_from_tweets.pyを使うと以下のような出力が得られます。
{"conversations": [{"from": "human", "value": "長時間眠って体調が良くなり、ゴッドモードになったのはどんな感覚でしたか?"}, {"from": "gpt", "value": "めちゃくちゃ寝たら体調だいぶ良くなってゴッドモードきた"}]}
{"conversations": [{"from": "human", "value": "NotebookLMって何ですか?"}, {"from": "gpt", "value": "てかnotebookLMでええやん"}]}
{"conversations": [{"from": "human", "value": "sunoを勉強に使うのは難しいと感じている理由は何ですか?"}, {"from": "gpt", "value": "sunoを勉強に活用できないかと試行錯誤していたが無理\n・日本語の読みが渋い\n・歌詞の用意が大変(AIである程度なんとかなる)\n\nいい点は最近?8分ぐらいが生成上限になったので内容を詰め込められる"}]}
正直逆質問生成の精度がびみょいので、よいプロンプトやモデルがあれば教えてください。
データセットができたら自身のHuggingFaceアカウントにアップロードしましょう。
実際に学習を回してみる
今回作ったデータセットは以下です。
公式Colabノートブックのデータセット関連のとこを開き
ここの"mlabonne/FineTome-100k"を"自分のhfアカウント名/データセットのリポジトリ名"に書き換えます。
今回の場合は以下のようになります。
後は基本的に手順に従ってポチポチ実行する(or Run Allする)だけなのですが、最後にGGUFフォーマット化してHuggingFaceにアップロードするところが若干わかりにくいので少しだけ説明します。
以下がGGUFフォーマットで保存、およびHuggingFaceにpushする部分です。
HuggingFaceにモデルのリポジトリを作ってから、Falseになっている部分をTrueと書き換えて実行すればよいだけなのですが、HuggingFaceにpushするためにはtokenの発行が必要です。(HuggingFace内にてWrite権限で発行してください。)
以下にテンプレートを示します。
以下をコードブロック内に付け足して他はFalseのままでよいです(Trueのもののみ実行されるようになっています。)。
if True:
model.push_to_hub_gguf(
"自分のhfアカウント名/リポジトリ名(モデル名)",
tokenizer,
quantization_method = "q4_k_m", #ここはq8_0とかにもできます
token = "hf_XXXXXXXXXXXXXXXXXXXXXXXXXXXX", #ここにwrite権限のある自分のhf_tokenを記入
)
上記を実行するとそのままpushまでやってくれます。
一連の流れで実際にできたのが以下のモデルになります。
モデルを動かしてみよう
できたモデルについてなのですが、なぜかOllamaで動かすとバグります。(何回か別のモデルでも確認済み)
Repetition Penaltyとかの設定なのかもしれませんが、基本的にはLM-Studioを推奨しています。(個人的にそっちのほうが使い勝手よいというのもある。)
LM-Studioのモデル検索欄から自分のリポジトリ名を検索すると、そのままダウンロードができます。
ちなみにLM-Studioのデフォルト設定ではなぜかバグらない。
以下のように短文のツイート感のある出力が得られます。
有識者の方、原因がわかれば教えてください。
おわりに
正直なところ、今回のワークフローで作ったモデルの使い道はほぼありません。
というのも、ただの日常ツイートばかりのアカウントを学習させたところで、せいぜい口調が似せられる程度の結果しか得られないからです。
ですが、LLMのファインチューニングのチュートリアルとしてはまあまあ面白いのと、以下のような特殊な応用が考えられます。
- AIキャラクターの口調再現やAItuber用モデルの作成
- 変な界隈の思考・文体トレース
- 特殊な運用をしているアカウントのコンテンツ自動生成
やはり元となるデータが命ということを体感してもらえればと思います。
それでは。








