Blogs

Sparkyの構築:LLMで笑えるほど皮肉っぽいAIを作る私の道のり

カスタムデータ生成から Unsloth を使用した Gemma 3 の微調整まで

April 8, 2025

AIアシスタントが... 役に立ちすぎると感じたことはありませんか?礼儀正しすぎる?正確には答えてくれてありがとうでも性格はどこにあるの?頭がいいだけじゃなくて、笑えるほど皮肉っぽいAIのアイディアにいつも面白がってた。もしかしたら、ただの人間よりはるかに優れているとさえ思っているかもしれない。こうして「スパーキー」のアイデアが生まれました。ウィット、生意気、そして健全な (偽の) エゴで質問に答えるように設計された AI ペルソナです。

しかし、皮肉っぽいAIを思い描くのと、実際にそれを構築することは別のことです。この投稿では、私がLLMの微調整の世界に足を踏み入れた経緯を記録しています。具体的には、私がどのようにして独自のデータセットを作成し、AIを使って独自の成果を判断し、Googleの新しい成果を微調整したかを記録しています。 ジェンマ 3 Sparkyに命を吹き込むためのモデルです。すべてコンシューマー向けハードウェアでアクセス可能なツールを使用しています。

簡単な質問をして、このような回答が得られることを想像してみてください。

Picture
Python でのリスト反転に関する Sparky の「役に立つ」説明

興味をそそられましたか?この人格をシリコンから引き出す方法を詳しく見ていきましょう... 私がたどったパイプラインは次のようなものでした。

多様な質問を生成: AI が遭遇する可能性のあるさまざまな質問を作成します。

ペルソナ固有の応答を生成: 別のAIにSparkyとしてこれらの質問に答えてもらいましょう。

AI を活用した品質管理: AIジャッジを使用して、Sparkyのペルソナとどの程度一致するかに基づいて回答を採点します。

微調整: 基本モデルのトレーニング (ジェンマ 3 4B)最も評価の高い質問と回答のペアについて。

導入とテスト: スパーキーを世界に連れて行きましょう!

コードを見たい読者の方には、こちらをご覧ください ここに

データジレンマ:

最初のハードルは?データ。例がないとAIに特定の性格を教えることはできません。私はデータセットを求めてウェブを精査しましたが、当然のことながら、人間を「炭素ベースの生命体」と呼ぶ超知的で皮肉っぽい AI をフィーチャーした Q&A ペアをすぐに利用できる人は誰もいませんでした。標準データセットは通常、有用性、無害、事実の正確性に重点を置いています。これは、スパーキーの雰囲気とは正反対です。

品質と一貫性を確保しながらこれらのサンプルを何千個も手作業で作成するのは、信じられないほど時間と労力を要します。そこで、私が使っていたツールそのもの、つまり大規模言語モデルに目を向けました。

スパーキーデータセットの作成:

手作業でサンプルを作成すると非常に時間がかかるため、LLM を使用してデータを生成して評価することにしました。目標は、後で小さなモデルを微調整するのに適した、高品質のデータを効率的に作成することでした。

ステップ 1: で質問を生成する ラマ 3.2 3B

Sparkyを順応性のあるものにするには、会話形式の雑談、コーディングの問題、ヘルプのリクエストなど、さまざまな質問が必要でした。私が選んだのは ラマ 3.2 3B このタスクのため。なぜ3Bなのか?小型でオープンソースでパワフルなモデルですが、決定的に重要なのは、コンシューマーグレードの GPU (最大 8 GB の VRAM に収まる) 上でそれなりにうまく動作し、プロジェクトへのアクセスが容易になることです。

モデルを導くために、さまざまな質問タイプ(会話、コーディング、ヘルプ)に対応する特定のプロンプトを使用しました。重要なのは、いくつかの例をプロンプトに直接含めたことです。この手法によって、私が求めている種類のアウトプットがモデルに示され、生成される質問の質と関連性が大幅に向上します。

私が使用したのとまったく同じプロンプトはここにあります!

(すべてのコードは次の場所で入手できます Github!)

このプロセスでは、各カテゴリー(コーディング、ヘルプ、会話)ごとに約15,000の質問が出されました。クリーニングして重複を削除した結果、最終的なデータセットには約 13,800 件の固有の質問が含まれていました。

ステップ 2: Sparky のレスポンスを生成する

しっかりとした質問が寄せられたので、いよいよSparkyの代表的な皮肉っぽい答えを出す時が来ました。私は再び使用しました。 ラマ 3.2 3B、しかし今回は、スパーキーのキャラクターを定義する詳細なペルソナプロンプトが付いています。機知に富み、優越し、絵文字が大好きで、熱狂的すぎます(しかし明らかに偽物です)

重要なのは、以前と同様に、希望するトーンとスタイルを示すために、プロンプトにいくつかの例を含めたことです。これにより、モデルはより効果的に「個性を引き出す」ことができます。

Sparky を定義するプロンプトは次のとおりです。

ステップ3: 審査員としてのLLMによる品質管理

生成されたすべての応答が Sparky の本質を完全に捉えているわけではありません。当たり障りのないものもあれば、皮肉を見逃したものもありました。何千もの回答を手作業で確認することは不可能でした。そこで、私は「審査員としてのLLM」という手法を採用しました。

Llama 3.2 3Bを再び使用しましたが、今回はSparkyペルソナに基づいて生成されたレスポンスを評価する作業を行いました。明確な指示と、異なるスコアが何を表しているかの例を交えて、1~5のスコアリング・スケールを示しました。

私が使用した審査プロンプトテンプレートは次のとおりです。

私が使ったのとまったく同じプロンプトを見つけることができます ここに!

スコアが4または5の質問と回答のペアのみを残し、微調整したデータセットが、Sparkyのペルソナを真に体現する高品質の例で構成されていることを確認しました。この自動フィルタリングにより、数え切れないほどの時間を節約できました。

ジェマ3とアンスロスを使ったスパーキーの微調整:

精選されたデータセットが準備できたので、いよいよメインイベントである微調整を行います。目標は、ベースモデルにスパーキーの個性特有のニュアンスを教えることでした。そのためには、膨大な計算リソースを必要とせずに実行とトレーニングができるほど強力で効率的なモデルが必要でした。GoogleのGemma 3 4Bモデルが最適な候補として浮上しました。

最近発売されたGemma 3は、そのサイズに対して信じられないほど高性能になるように設計されています。Google は、最上位のパフォーマンスを発揮する最先端モデルであると強調しています。そのモデルによっては、単一の GPU で、あるいはラップトップなどのデバイス上で直接実行できるように特別に最適化されています。 ブログ。アクセシビリティと効率性に焦点を当てることは、まさに私が必要としていたものでした。Sparkyの現在のペルソナは英語ベースですが、Gemma 3の基盤となるアーキテクチャは優れた多言語機能を誇っています(140以上の言語で事前にトレーニングされています!)そして、クリエイティブなタスクと推理力に長け、Sparkyのようなユニークな性格を捉えるための素晴らしい基盤となることで知られていますが、私は特に、能力とリソース要件の間のスイートスポットとして、4Bパラメーターバージョンを選びました。

ただし、「軽量な」4Bパラメーターモデルでさえ効率的に微調整することは、コンシューマー向けハードウェアでは依然として困難な場合があります。これがその理由です。 ナマケモノ 絶対不可欠になりました。Unsloth は、大規模言語モデルのトレーニングと微調整を最適化するために特別に設計された、画期的なライブラリです。プロセスを劇的にスピードアップし、メモリ使用量を削減することで、パワフルなモデルにアクセスできるようになります。

Unslothとtrlライブラリを使用して微調整を設定する方法を垣間見てみましょう。

1。モデルの効率的な読み込み:

まず、ロードしました ジェンマ 3 4B UnslothのFastModelを使ったモデル。重要なのは、私が有効にしたことです 4 ビット量子化 (4ビット読み込み=真)。この手法は、モデルの重みをより少ないビット数で表現することでモデルのメモリ使用量を大幅に削減し、多くのコンシューマーPCや無料のColabインスタンスに見られるような、VRAMが限られているGPUでのロードとトレーニングを可能にします。

2。LoRaによるパラメータ効率の高い微調整 (PEFT) の準備:

モデルの40億個のパラメーターすべてを再トレーニングする代わりに(膨大な量のメモリと計算が必要です)、という一般的なPEFT手法を使用しました LoRa (ローランクアダプテーション)。LoRaは元のモデルのウェイトをフリーズし、はるかに小さくてトレーニング可能な「アダプター」レイヤーをモデルの特定の部分 (アテンションモジュールやMLPモジュールなど) に注入します。これらの小さなアダプターレイヤーのみをトレーニングすることで、モデルが新しいタスクやペルソナを効果的に学習できるようにしながら、トレーニング可能なパラメーターの数と必要なメモリ量を大幅に減らすことができます。

ナマケモノ get_peft_model 関数を使えばLoRaを簡単にセットアップできます。r (アダプター行列のランクまたはサイズ) や lora_alpha などのパラメーターを設定して、アテンションレイヤーと MLP レイヤーでアダプターをトレーニングするように構成しました。私が従った一般的な方法として、lora_alpha を r と等しく設定するというものがあります (私の場合は、どちらも 8 に設定されています)。これらの値は LoRa アダプターの容量を制御します。値が大きいほど、より複雑なパターンを学習できる可能性がありますが、特にデータセットが小さい場合は、過剰適合のリスクがあります。

3。データのフォーマット:

LLMは、特にチャットのようなやりとりの場合、特定の形式の入力データを期待しています。私のデータセットは、「質問」と Sparky の「回答」のペアで構成されていました。各ペアを Gemma 3 で期待される会話形式に変換する簡単な関数を書きました (「ユーザー」や「アシスタント」などの役割を使用)。次に、Unsloth が提供する、適切な gemma-3 チャットテンプレートで構成されたトークナイザーを使用して、これらの会話をモデルが処理できるトークンシーケンスに変換しました。

データフォーマットコード全体を見つけることができます ここに!

4。トレーナーのセットアップ:

最後に、trlライブラリのSFTTrainer(スーパーバイズド・ファインチューニング・トレーナー)を使用しました。これはUnslothやHugging Face Transformerとシームレスに統合されます。このトレーナーは複雑なトレーニングループの処理を行います。SftConfigでいくつかの重要なパラメータを設定しました。

Gemma 3 4B固有の効率性と、Unslothの最適化、4ビット量子化、LoRa、および慎重なトレーナー構成(勾配累積や8ビットオプティマイザーなど)を組み合わせることで、アクセス可能なハードウェアでモデルを微調整することができました。この微調整ステップこそが、Sparkyのペルソナをモデルに本当に「焼き付ける」ものです。これにより、毎回長いペルソナプロンプトを必要とせずに、Sparkyの機知に富み、皮肉っぽく、少し優れたトーンを本質的に取り入れることができます。

Sparkyに命を吹き込む:Streamlitを使ったインタラクティブデモ

モデルを微調整するのは素晴らしいことですが、本当の楽しみはそのモデルを操作できるところから始まります!Sparkyとチャットするための使いやすいインターフェースを作るために、私が頼ったのは ストリームリットは、最小限の労力でインタラクティブな Web アプリケーションを構築するための Python ライブラリです。

シンプルなものを作りました ストリームライトスクリプト (app.py) それは:

基本の Gemma 3 4B モデルをロードします。

2。以前にトレーニングした微調整済みのLoRaアダプターウェイト (Sparkyの個性を含む) を統合します。

3。ユーザーが質問を入力したり、Sparkyの気の利いた返信をリアルタイムで確認したりできる基本的なチャットインターフェースを提供します。

微調整と初期テストは Google Colab 内で簡単に実行できたため、一般ユーザーが直接アクセスできるウェブアプリをデプロイすることは小さな課題です。Colab 環境は公開されているウェブサーバーではありません。Colab から直接共有可能なデモリンクをすばやく作成するために、という気の利いたツールを使用しました。 ローカルトンネル。このローカルトンネル方式は、簡単なテスト、一時的なデモ、または専用ホスティングを設定せずに進捗状況を共有するのに最適です。

Sparkyが回答したクエリの例は次のとおりです。

Picture
Sparkyはユーザーの質問に「丁重に」答えます。
私:本物の質問をしています。スパーキー:AIの最高のウィットで応えます。

スパーキーの次は?(改善の可能性)

このプロジェクトは、アクセシブルなツールを使ってカスタム AI パーソナリティを作成するという素晴らしい学習経験になりましたが、他の実験と同様に、常に改善の余地があります。Sparky についてさらに繰り返すとしたら、私が探求したい分野は次のとおりです。

データ生成の強化:

  • より大きく、より優れたベースモデル: 初期のSparkyレスポンスを生成するために、より大きく、より高性能なモデル(Llama 3.3 70B、Claude 3.7、GPT-4O、Google Geminiモデルなど)を使用すると、よりクリエイティブでニュアンスがあり、一貫してユーモラスなテキストを作成できます。
  • 多様な世代情報源: 雇用 複数 応答を生成するためのさまざまな大規模言語モデルにより、データセットの多様性が高まり、微調整されたモデルが単一ジェネレーターモデルの癖を単に模倣できなくなる可能性があります。
  • 推論の組み込み: 回答の生成時に Chain of Thought プロンプトのようなテクニックを使うことで、Sparky は皮肉っぽいだけでなく、より論理的に正しい答えを導き出すことができます (たとえロジックがコメディー効果のためにひねられたとしても!)。特に複雑な質問の場合。
  • 生成時のパラメータ調整: データ作成フェーズで温度、top_p、top_kなどの生成パラメーターを体系的に試すと、Sparkyペルソナ内でより幅広い応答スタイルが生成される可能性があります。

データセットの品質とサイズの改善:

  • より多くのデータ、より多くのドメイン: 高品質(スコア4+)データセットのサイズを増やし、さらに幅広いトピックや質問タイプをカバーするようにするだけで、堅牢性が向上する可能性があります。
  • 精緻な評価基準: LLM-as-a-Judgeのルールを(単純に1~5点のスコアよりも)さらに細かく設定しておけば、ペルソナの特定の側面(ウィット、皮肉、優越、絵文字の使用についてスコアを分けるなど)に基づいてデータをより正確にフィルタリングできます。
  • 多言語機能の拡大: 現在のSparkyモデルは英語のデータでトレーニングされていますが、複数の言語でデータセットを生成すると、モデルが現地の言語で理解して応答できるようになり、アクセシビリティと有用性が広がります。

高度な微調整と安全性:

  • さまざまなPET技術の探求: LoRa以外のパラメーター効率の高い微調整方法や、好みデータを生成できる場合はDPO(直接選好最適化)などの手法を試してみると、より良い結果が得られる可能性があります。
  • ハイパーパラメータ最適化: 最適な微調整ハイパーパラメーター(学習率、バッチサイズ、LoRaランク/アルファなど)をより徹底的に検索します。
  • 強化された安全ガードレール: 皮肉が目的ですが、より堅牢な安全フィルターを実装し、ペルソナデータとともに安全に焦点を当てたデータセットを使用して微調整を行うことで、Sparkyが真に有害な領域や攻撃的な領域に一線を越えないようにすることができます。
  • 長いコンテキストでのペルソナの一貫性: 特に、長時間のマルチターンの会話でも Sparky のペルソナを一貫して維持するためのテストと、場合によっては微調整を行います。

これらの改善をいくつか実装するだけで、Sparkyの皮肉な腕前が次のレベルに引き上げられる可能性があります。

(トレーニングに使用されるコード一式は、プロジェクトの GitHub リポジトリにあります。 Github レポ)

Sparkyを構築する私の旅を読んでくれてありがとう!これは私の初めての技術ブログ投稿なので、この記事に対するフィードバックをいただければ幸いです。今後の投稿で興味深いと思われる他の AI プロジェクトや技術トピックのアイデアはありますか?ぜひ聞きたいです!遠慮なく私とつながってください LinkedIn