ガジェットコンパス

ガジェット探求の旅に終わりはない
🔍
開発プログラミング生成AI

LLM出力フォーマットの選択:なぜJSONよりもCSV/TSVが実用的なのか

👤 せいや 📅 2025-08-31 ⭐ 4点 ⏱️ 10m

はじめに

LLM(大規模言語モデル)に構造化データを生成させる際、多くの開発者がJSONフォーマットを選択します。しかし、実際のアプリケーション開発において、JSONは意外にも非効率で問題の多い選択肢かもしれません。

この記事では、LLM出力におけるJSONの問題点と、より実用的な代替案としてのCSV/TSVフォーマットについて考察します。

JSONの問題点

1. 無駄なオーバーヘッド

JSONは人間にとって読みやすい形式ですが、LLMの出力としては多くの無駄が含まれています:

{
  "users": [
    {
      "name": "田中太郎",
      "age": 25,
      "skills": ["Python", "JavaScript", "Go"]
    },
    {
      "name": "佐藤花子",
      "age": 30,
      "skills": ["Rust", "C++"]
    }
  ]
}

この例では:

  • 括弧類({}[]"")が大量に含まれる
  • インデントやスペースが容量を消費
  • 同じキー名が繰り返し出現

2. 出力制限による致命的な問題

LLMには出力トークン数の制限があります。出力が途中で切れた場合:

{
  "users": [
    {
      "name": "田中太郎",
      "age": 25,
      "skills": ["Python", "JavaScript"

このような不完全なJSONは:

  • パースエラーで全体が使用不可能
  • 部分的なデータ抽出も困難
  • 続きを生成するための情報が取得できない

3. 継続生成の困難さ

途中で切れたJSONから続きを生成するのは複雑で、エラー処理が煩雑になります。

CSV/TSVによる解決策

基本的な利点

同じデータをCSV形式で表現すると:

name,age,skills
田中太郎,25,"Python|JavaScript|Go"
佐藤花子,30,"Rust|C++"
  • 容量効率: 括弧やキー名の重複がない
  • 可読性: シンプルで理解しやすい
  • 軽量: 同じデータをより少ないトークンで表現

途中切断への耐性

出力が途中で切れても:

name,age,skills
田中太郎,25,"Python|JavaScript|Go"
佐藤花子,30,"Rust|C++"
山田次郎,28,"Java|Kotl
  • 最後の不完全な行以外は完全にパース可能
  • 既存データの活用が簡単
  • プログラムでの処理が安定

継続生成の実装例

import pandas as pd
from io import StringIO

def parse_partial_csv(llm_output):
    """途中で切れたCSVでも安全にパース"""
    try:
        return pd.read_csv(StringIO(llm_output))
    except:
        # 最後の不完全行を除去して再試行
        lines = llm_output.strip().split('\n')
        if len(lines) > 1:
            clean_output = '\n'.join(lines[:-1])
            return pd.read_csv(StringIO(clean_output))
        return pd.DataFrame()

def generate_continuation_prompt(existing_df, target_count):
    """既存データを基に続きを生成するプロンプト"""
    remaining = target_count - len(existing_df)
    
    prompt = f"""
既存のデータ:
{existing_df.to_csv(index=False)}

上記の続きから、残り{remaining}件のデータを生成してください。
ヘッダー行は不要です。同じフォーマットで出力してください。
"""
    return prompt

# 使用例
partial_output = """name,age,skills
田中太郎,25,"Python|JavaScript|Go"
佐藤花子,30,"Rust|C++"""

df = parse_partial_csv(partial_output)
continuation_prompt = generate_continuation_prompt(df, 10)

さらなる最適化案

1. メタ情報の埋め込み

# target_rows:100, generated:1-50
name,age,skills
田中太郎,25,"Python|JavaScript|Go"
佐藤花子,30,"Rust|C++"

2. 行番号の追加

id,name,age,skills
1,田中太郎,25,"Python|JavaScript|Go"
2,佐藤花子,30,"Rust|C++"

3. カスタム区切り文字

CSV特殊文字の問題を避けるため、パイプ(|)を使用:

name|age|skills
田中太郎|25|Python,JavaScript,Go
佐藤花子|30|Rust,C++

実践的な選択指針

JSONを選ぶべき場合

  • 複雑な入れ子構造が必要
  • 出力量が少なく制限に達しない
  • 一回の生成で完結する処理

CSV/TSVを選ぶべき場合

  • 大量のレコード生成
  • 継続生成が必要
  • トークン効率を重視
  • 堅牢性が重要

まとめ

LLMの出力フォーマット選択において、JSON偏重から脱却することで:

  1. 効率性の向上: 同じデータをより少ないトークンで表現
  2. 堅牢性の確保: 途中切断に対する耐性
  3. 実装の簡素化: 継続生成やエラー処理の容易さ
  4. 運用の安定性: 予測可能で処理しやすい出力

用途に応じた適切なフォーマット選択により、より実用的なLLMアプリケーションの構築が可能になります。

特に大規模なデータ生成や継続的な処理が必要な場面では、CSV/TSVフォーマットの採用を強く推奨します。


この記事で紹介した手法は、実際のプロダクション環境でのLLM活用において、開発効率と運用安定性の大幅な向上をもたらしました。皆さんのプロジェクトでもぜひお試しください。

🗂️ 人気カテゴリ

記事数の多いカテゴリから探す