【高品質合成データ】LLMを用いた学習用・テスト用ダミーデータ生成と品質フィルタリング手法 アイキャッチ

Icons: Lobe Icons(MIT)

データ活用
公開: 2026.09.02読了目安 8分

【高品質合成データ】LLMを用いた学習用・テスト用ダミーデータ生成と品質フィルタリング手法

実データが不足しているドメインにおいて、LLMで多様かつリアルな合成データを大量生成し、品質スコアリングと重複排除でフィルタリングする手法を解説します。

はじめに:AI開発における「データ不足とプライバシー」の壁

AIモデルのファインチューニングや業務システムのパフォーマンステストにおいて、本番データには個人情報(PII)や機密情報が含まれるため、そのまま開発環境で使用できないケースが多々あります。

また、新サービス開発時や異常検知モデルの開発では、そもそも「データの実例が少なすぎる」というコールドスタート問題が発生します。

LLM(Gemini 3.7 Flash / Llama 3.3 70B)を用いて、本物と見分けがつかない高品質・多様な合成データ(Synthetic Data)を数万件規模で安全に自動生成し、品質フィルタリングを行うパイプラインを解説します。


1. 合成データ生成パイプラインの4ステップ

[ シード定義 (ペルソナ/業界/エッジケース) ]


【第1フェーズ: バッチ多様性生成 (LLM)】
  ・温度(Temperature) 0.7〜0.9 で多様なバリエーションを生成


【第2フェーズ: ルールベース整合性チェック】
  ・フォーマット検証 (JSON Schema / Pydantic)
  ・論理的整合性 (日付の前後関係、合計金額の計算一致)


【第3フェーズ: 意味的重複排除 (Semantic De-duplication)】
  ・埋め込みベクトル (Sentence-Transformers) による類似度計算
  ・コサイン類似度 > 0.90 のデータを自動除外


[ 厳選された高品質合成データセット (Parquet / JSONL) ]

2. 実践 Python 実装コード

import json
from pydantic import BaseModel, Field
from typing import List
import numpy as np

class CustomerFeedback(BaseModel):
    user_id: str
    age_group: str
    satisfaction_score: int = Field(ge=1, le=5)
    category: str
    comment: str
    device_type: str

def validate_feedback(data: dict) -> bool:
    """ルールベースによる整合性チェック"""
    # スコアとコメントの感情の整合性チェック
    score = data.get("satisfaction_score", 3)
    comment = data.get("comment", "")
    
    if score >= 4 and any(bad in comment for bad in ["最悪", "動かない", "返金して"]):
        return False # 矛盾データとして除外
    if score <= 2 and any(good in comment for good in ["最高", "満足", "素晴らしい"]):
        return False
    return True

def remove_duplicates_by_embedding(embeddings: np.ndarray, threshold=0.90):
    """コサイン類似度による重複排除"""
    norm = np.linalg.norm(embeddings, axis=1, keepdims=True)
    normalized = embeddings / norm
    similarity_matrix = np.dot(normalized, normalized.T)
    
    keep_indices = []
    dropped = set()
    for i in range(len(embeddings)):
        if i in dropped:
            continue
        keep_indices.append(i)
        for j in range(i + 1, len(embeddings)):
            if similarity_matrix[i][j] > threshold:
                dropped.add(j)
    return keep_indices

まとめ

合成データ生成の成否は「生成すること」自体ではなく「論理矛盾と重複を徹底的にフィルタリングすること」にかかっています。

このパイプラインを導入することで、開発・テスト・AI学習用の高品質なデータを安全かつ無制限に入手できるようになります。