AI・機械学習
Qwen 3:0.6BのようなローカルLLMを質問分類のためにファインチューニングして良好な結果
Good results fine tuning a local LLM like Qwen 3:0.6B to categorize questions (teachmecoolstuff.com)
要約
このプロジェクトでは、家庭関連の質問分類を行うためのチャットボットにおいて、非常に小さなローカルLLMであるQwen 3:0.6Bをファインチューニングした結果が報告されています。事前のプロンプトだけでは精度が低かったモデルが、わずか850件のデータセットでファインチューニングすることで、質問分類の精度が約10%から79%に大幅に向上しました。さらに、セマンティックな重複を避けたカテゴリIDを用いることで、より高い精度を目指せる可能性が示唆されています。
全文翻訳
Teach Me Cool Stuff
ローカルLLMを質問分類のためにファインチューニングして良好な結果
公開日:2026年6月16日 著者:Torgeir Helgevold
楽しい個人的なプロジェクトとして、私は家のメンテナンスから医師の予約まで、家庭に関する一般的な質問に答えるチャットボットに取り組んでいます。基本的なアイデアは、チャットボットがベクトルデータベースをクエリするRAGを通じて家庭の知識を得ることですが、より良い結果を得るために、ベクトル検索をメタデータ対応にしました。具体的には、質問を前処理ステップに通し、既知のメタデータカテゴリ(例:プール、車、HVAC、料理)に分類しています。この主な目的は、ベクトルランキングの検索空間を、質問のカテゴリに一致するインデックス付きエントリのみに絞り込むことです。例として、「プールのポンプを交換したのはいつですか?」という質問は、インデックスデータベースをクエリする前に「プール」というカテゴリにマッピングされます。この実験でテストしたい仮説は、非常に小さなローカルLLMが、家庭関連の質問のデータセットでトレーニングされた場合、信頼性の高い質問分類を実行できるようにファインチューニングできるかどうかです。
LLM
このプロジェクトでは、Qwen 3:4BとQwen 3:0.6Bという2つの異なるローカルLLMを使用しています。4Bパラメーターバージョンは一般的な質問応答に使用され、超小型の0.6Bバージョンは質問の分類に使用されます。この実験の前提全体は、わずか600Mパラメーターの小さなLLMが、家庭の質問の信頼性の高い分類器にファインチューニングできるかどうかを確認することです。
ファインチューニング
ファインチューニングには、Unslothという人気のあるオープンソースフレームワークを使用しています。これはQwenやLlamaのようなローカルモデルのチューニングに適しているようです。トレーニング目的の初期データセットは、約850のデータエントリで構成されており、それぞれトレーニングデータ、評価データ、テストデータに70/15/15の割合で分割しています。トレーニングデータと評価データはトレーニング中に使用され、テストデータセットは保留され、トレーニング後のテスト実行に使用されます。サンプルデータは以下のセクションを参照してください。
[
{ "question": "Who cleans our gutters at the house?", "category": "gutters" },
{ "question": "Who serviced the hot water heater for the home?", "category": "water heater" },
{ "question": "Who fixed the sprinkler system in the yard?", "category": "irrigation" },
{ "question": "Which store do we usually buy pinnekjott from?", "category": "cooking" },
{ "question": "What dimensions are the air filters for the home AC?", "category": "hvac" },
{ "question": "What year did we replace the downstairs AC unit?", "category": "hvac" }
]
基本的な考え方は、LLMを十分な数の家庭の質問でトレーニングし、信頼できる質問分類器になるように教えることです。
ベースライン
ファインチューニングを行う前に、測定対象となるベースラインを確立することが重要です。この実験では、ベースラインは、元のQwen 0.6Bモデルをプロンプトのみで「そのまま」使用することです。ベースラインに使用されるプロンプトの例は以下のとおりです。
Classify the homeowner question into exactly one category from the list below. Return only the category name from the list. Never return a code, a number, a synonym, an explanation, or any other text. The answer must be exactly one category name from the list. Choose the best category based on the meaning of the question. Valid categories: - appliances - brick work - car - cooking - doorbell - electric - fence - fountain - garden lights - gutters - hvac - irrigation - mosquito - painting - pool - tree service - water heater - window service Question: Who installed the tankless hot water setup for the house? Category:
ベースラインモデルの精度:
オフライン評価方法の1つとして、2番目のデータセットのシナリオでモデルをテストするための約130の統合テストを作成しました。ベースラインモデルの場合、結果は芳しくありません。131のテストのうち、モデルは13の質問しか正しく分類しませんでした(正答率約10%)。以下の要約を参照してください。
{
"scenario": "baseline-category",
"model_kind": "baseline",
"model_name": "qwen3:0.6b",
"label_mode": "category",
"total": 131,
"correct": 13,
"incorrect": 118,
"accuracy": 0.0992
}
実際の失敗を掘り下げると、いくつかの共通のパターンが見られます。
モデルは主に、electric/appliancesのような広いラベルを過度に使用し、他のほとんどのカテゴリ(例:pool、cooking、hvac)を見逃しています。
モデルは新しいカテゴリ(例:apartments)を発明し、提供された許可されたカテゴリのリストに固執しません。
テストレポートからの抜粋を以下に示します。
[{
"case_id": 1,
"question": "When was the lower air conditioning system swapped out?",
"expected_category": "hvac",
"scenario": "baseline-category",
"model_kind": "baseline",
"model_name": "qwen3:0.6b",
"label_mode": "category",
"predicted_category": "electric",
"correct": false
}, {
"case_id": 64,
"question": "Which painter worked on Joe's room?",
"expected_category": "painting",
"scenario": "baseline-category",
"model_kind": "baseline",
"model_name": "qwen3:0.6b",
"label_mode": "category",
"predicted_category": null,
"predicted_code": null,
"correct": false,
"status_code": 422,
"error": "Ollama returned an unknown category name 'apartments' from response 'apartments'"
}]
ファインチューニング – 1回目の試行
ベースラインの結果から、Qwen 3 0.6Bのような小さなモデルは、プロンプトだけでは信頼できるパフォーマンスを提供できないことが明らかになりました。次の実験では、以前と同じプロンプトを使用しますが、モデルのファインチューニングを行い、より高い精度で分類する方法をモデルに教えます。興味がある場合に備えて、ファインチューニングスクリプトをここに含めました。大まかに言えば、QLoraをファインチューニング戦略としてUnslothを活用しています。注:Unslothが提供するデフォルトのファインチューニングパラメーターは、非常に良い出発点となります。少なくとも最初は、Unslothの値をいじくり回すことよりも、良いデータセットを作成することの方が重要であるというのが私の経験です。ただし、避けなければならない一般的な落とし穴は、トレーニングデータへの過学習です。そのため、トレーニングデータにはないデータでモデルをテストすることが重要です。静的なトレーニング/テストデータに加えて、将来の再トレーニング中に2番目のチャネルとしてトレーニングデータを修正するためのユーザーフィードバックを提供する方法も組み込みました。
結果:
統合テストのバッテリーを実行した後、以下のレポートに示すように、予測精度の明確な改善が見られました。
{
"scenario": "finetuned-category",
"model_kind": "finetuned",
"model_name": "our-house-qwen3-0.6b-category-names",
"label_mode": "category",
"total": 131,
"correct": 104,
"incorrect": 27,
"accuracy": 0.7939
}
予測精度は10%から79%に向上しましたが、依然として誤った結果の明確なパターンが見られます。
モデルは正しい方向に向かっている明確な兆候を示していますが、許可されたリストから正しいカテゴリの断片のみを出力するパターンが見られます。例えば、hvacではなくac/airなどです。
モデルは、fountain、water heater、poolなどの水関連の混乱から生じる意味的に重複するカテゴリによって混乱します。
ファインチューニング – 2回目の試行
最初のファインチューニング実験に対する簡単な改善策は、後処理ステップを追加することでしょう。これにより、予測が意味的には正しいが、構文的には正しくない結果(例:ac、air)を正規化できます。もう1つの調整は、より多くの例を提供し、モデルに何をすべきか、何をすべきでないかを伝えることで、プロンプト自体により多くの補強を組み込むことです。どちらのアイデアも合理的だと思いますが、カテゴリが追加されるにつれてメンテナンスが増加します。代わりに、カテゴリをマッピングする方法を少し変更することで、ファインチューニングアプローチを微調整できるかどうかを確認したかったのです。最初の実験と比較して、プロンプトにわずかな変更を加えるだけで、精度をさらに向上させることができることがわかりました。この調整は、実際にはプロンプトへの簡単な変更であり、以下のサンプルに示すように、カテゴリを意味的な重複のない2文字の不透明なIDにマッピングします。
Classify the homeowner question into exactly one label from the list below. Return only the s