データ品質:ファインチューニングの第一原理

モデルのファインチューニングには繰り返し検証された結論があります:高品質な小規模データセットは低品質な大規模データセットよりもはるかに優れている。LIMA論文では、わずか1,000件の厳選された指示データでモデルがGPT-4に近い性能に達することが示されました。データ構築は「多ければ多いほど良い」という問題ではなく、「精緻であればあるほど良い」という芸術です。優れた指示データは、明確で曖昧さのない指示、正確で完全な応答、一貫した形式、実際の使用シナリオをカバーすることを備えるべきです。

データソースと収集

指示ファインチューニングデータの一般的なソース:人手による作成(品質は最高だがコストが高く、シードデータセットに適している)、既存データセットからのフィルタリング(ShareGPT/WildChatなどの実際のユーザー会話、カバレッジは広いがクリーニングが必要)、Self-Instruct生成(強力なモデルを使用して指示と応答のペアを生成、効率的だがモデルのバイアスを導入する可能性がある)、ドキュメント/コードベースからの逆生成(ドキュメントの段落を指示形式に変換)。実際のプロジェクトでは通常、50%の人手シード+30%のSelf-Instruct+20%の実ユーザーデータを混合して使用します。

データクリーニングパイプライン

import re, json
from openai import OpenAI

client = OpenAI(api_key="your-deepseek-api-key", base_url="https://api.deepseek.com")

class DataCleaner:
    def __init__(self):
        self.filters = []

    def clean(self, samples):
        cleaned = []
        for s in samples:
            # 1. 空値と短すぎるコンテンツを除去
            if not s.get("instruction") or len(s["instruction"]) < 10:
                continue
            if not s.get("output") or len(s["output"]) < 20:
                continue
            # 2. 重複排除(指示の類似性に基づく)
            if self._is_duplicate(s, cleaned):
                continue
            # 3. フォーマットのクリーニング
            s["instruction"] = self._normalize(s["instruction"])
            s["output"] = self._normalize(s["output"])
            cleaned.append(s)
        return cleaned

    def _is_duplicate(self, sample, existing, threshold=0.9):
        for e in existing[-100:]:  # 直近100件のみチェック
            if sample["instruction"] == e["instruction"]:
                return True
        return False

    def _normalize(self, text):
        text = re.sub(r"\s+", " ", text)
        return text.strip()

    def quality_score(self, sample):
        """DeepSeekを使用してデータ品質をスコアリング"""
        prompt = f"""指示ファインチューニングデータの品質を評価(0-100):
指示: {sample['instruction']}
応答: {sample['output'][:500]}
評価軸: 明確性 正確性 完全性 有用性
JSONを返す: {{"score":85,"issues":[]}}"""
        resp = client.chat.completions.create(model="deepseek-chat",
            messages=[{"role":"user","content":prompt}])
        return json.loads(resp.choices[0].message.content)

cleaner = DataCleaner()
raw = [{"instruction": "機械学習とは何か説明してください", "output": "機械学習は..."}]
print(f"クリーニング後: {len(cleaner.clean(raw))}件")

データ配分の技術

異なるタイプの指示データは適切に配分する必要があり、モデル能力のバランスを直接決定します:一般的なQA 40%(基本的な対話能力を確保)、コード生成 20%(プログラミング能力)、推論/数学 15%(論理能力)、クリエイティブライティング 10%(テキスト生成の多様性)、安全性/アライメント 10%(不適切なリクエストの拒否)、特定ドメイン 5%(垂直シナリオの能力)。配分は固定ではありません。モデルが主にコードシナリオ向けの場合は、コード生成を40%に増やし、一般的なQAの割合を減らすことができます。

データ拡張戦略

データ量が不足している場合、データ拡張技術を適用できます:指示の書き換え(同じ意図を異なる表現で5〜10バージョン書き換える)、応答の多様化(同じ指示に対して異なるスタイルと長さの応答を生成)、難易度の増加(基本指示に追加の制約を追加、例:「Pythonで実装」を「Pythonで実装、時間計算量O(n)を要求」にアップグレード)、逆生成(高品質な応答が与えられた場合、逆に一致する指示を生成)。ただし、拡張はノイズを導入する可能性があるため、拡張のたびに品質評価を再実施する必要があります。

データ品質問題の実例

医療相談モデル用のファインチューニングデータセットを構築するプロジェクトで、データ品質の決定的な重要性を痛感しました。初期データセットには、オンラインフォーラムからスクレイピングした12,000件の医師と患者の会話が含まれており、初期スクリーニング後8,000件が残りました。最初のファインチューニング後、モデルの性能はひどく、一見専門的だが実際には誤った医療アドバイスを与えました。詳細な調査により、3つの典型的な問題が明らかになりました:フォーマットの不整合(会話の30%で、スクレイピング時のHTML構造解析エラーにより、医師の返信に患者の次の質問が混入)、コンテンツの汚染(「医師」の返信の15%は実際には非専門家のコメントであり、誤ってベストアンサーとしてラベル付けされた)、分布の偏り(データの80%が皮膚科と小児科からのもので、モデルは心血管・脳血管の問題についてほとんど無知)。3回の厳格なデータクリーニング(1,000件のシードデータの手動レビュー、医学専門家が注釈した評価基準を使用した残りのデータの自動スコアリング、スコア>80のデータのみ保持)を経て、最終データセットは2,800件に削減されました。しかし、この2,800件の高品質データでトレーニングされたモデルは、実際の医師による盲検評価で4.2/5のスコアを獲得し、8,000件の汚染データでトレーニングされたモデル(2.1/5)をはるかに上回りました。このケースは、データ品質の重要性を再び示しています。

これはLIMA論文の結論を裏付けるものである。質は量よりもはるかに重要である。

データ多様性:モデルの「偏り」を避ける

データの多様性不足は、ファインチューニング失敗の2番目に多い原因です(1番目はデータ品質の低さ)。典型的な失敗例:あるチームが5,000件の「カスタマーサービスの対話」でモデルをファインチューニングしたところ、モデルがあらゆる質問に対してカスタマーサービスのように返答するようになりました。「相対性理論を説明してください」と聞いても、「お客様、相対性理論に関するご質問は記録いたしました...」と返す始末。これがデータ多様性不足による「役割の固定化」です。回避方法:指示の多様化(データセットにはQ&A、文章作成、コード、推論、翻訳など、さまざまな指示タイプを含める)、スタイルの多様化(回答は一つのスタイルだけでなく、簡潔なものと詳細なもの、フォーマルなものとカジュアルなものを含める)、ドメインの多様化(モデルが主に金融分野向けでも、過学習を防ぐために5〜10%の他分野データを含める)。

データアノテーションの自動化と品質管理

高品質な指示データはしばしば手動アノテーションが必要ですが、完全手動はコストが高く(1件あたり3〜5元)、速度も遅いです。当社は「AI支援アノテーション+人間によるレビュー」のハイブリッド方式を採用しています:第1ラウンド:AIが候補を生成(DeepSeekがシード例とタスク記述に基づいて5つの候補回答を生成)→第2ラウンド:AIが一次スクリーニング(別のDeepSeekインスタンスが5つの候補を評価し、最適な2つを選択してそれぞれの長所と短所を指摘)→第3ラウンド:人間による最終レビュー(アノテーターが2つの候補から最適なものを選択、または修正提案を行います)。このプロセスにより、アノテーション効率は4倍(1日20件から80件へ)向上し、高品質も維持されました(最終レビューで、AIの一次スクリーニングの精度は約82%で、18%のみが人間による再選択が必要でした)。アノテーションの一貫性はFleissのKappa係数で監視され、0.7未満になるとアノテーターの再トレーニングが実施されます。

このスキルチェーンを自分で作りたいですか?

スキルチェーンで開く →