技術約10分で読めます

JevのLLM文体判定はMarkdownや改行を消してもほぼ変わらなかった

いけさん目次

前回のTypeSafe AIのJevについての記事では、文章を生成せず判定だけを返すモデルの発表内容をまとめた。Jevはテキストを入力すると、あらかじめ指定したスキーマ(質問項目)に沿ってYes/Noや採点の確率値を高速に返す判定用モデルだ。
今回は実際にJevへ記事の本文を送り、改行やMarkdown記号の有無でLLMっぽさの判定が変わるかを試してみた。

質問のスキーマ

Jevには、質問ごとに型・質問文・判定基準を指定したスキーマを渡す。
JevのPlaygroundにある型ごとの雛形と、入力欄(State)のプレースホルダーのJSONをCodexに渡したところ、Codexが質問文と基準まで組み立てた。
それをそのまま使い、基本型のNoulScoreChoiceを1問ずつ試した。

llm_styleNoul(Yes/Noを返す、一般的なBooleanに相当するJev独自の型)で、LLMが書いた文章によくある型にはまったパターンが目立つかを判定させる。
値はtrueの確率で返る。

rhythmScore(段階評価)で、文のリズムがどれだけ自然で変化があるかを0〜3の4段階で採点させる。

段階基準
0繰り返しが多く機械的な構成
1やや繰り返しが多い
2おおむね自然で変化がある
3とても自然で変化がある

dominant_styleChoice(選択肢から1つ)で、文章をいちばんよく表す説明を4つから選ばせる。

選択肢基準
formulaic型通りで構成が読める
fragmented唐突な切れ目が多い
verbose冗長で説明しすぎ
natural目立つ構造の問題がない

質問文と基準はCodexが書いた英語のまま渡した。
指定したスキーマはこんな感じで、本文は {"text": "本文"} の形で渡す。

{
  "llm_style": {
    "type": "noul",
    "instructions": "Does this text exhibit stylistic patterns commonly associated with LLM-generated writing?",
    "criteria": {
      "true": "The writing prominently exhibits formulaic patterns commonly associated with LLM-generated prose",
      "false": "The writing does not prominently exhibit such patterns"
    }
  },
  "rhythm": {
    "type": "score",
    "instructions": "How natural and varied is the rhythm of the prose?",
    "criteria": [
      "Highly repetitive or mechanically structured",
      "Somewhat repetitive",
      "Mostly natural and varied",
      "Highly natural and varied"
    ]
  },
  "dominant_style": {
    "type": "choice",
    "instructions": "Which description best characterizes the prose?",
    "criteria": {
      "formulaic": "Formulaic and predictably structured",
      "fragmented": "Fragmented, with frequent abrupt breaks",
      "verbose": "Verbose or unnecessarily explanatory",
      "natural": "Natural prose without a dominant structural issue"
    }
  }
}

入力に使った文章

入力には、まず人間が書いた文章の基準としてESPRIMO G5010/EにUbuntuを入れた記事の本文を使った。記事先頭の属性情報(フロントマター)は除いてある。
この記事はClaudeが書いた初稿の大半を自分で書き直したもので、ほぼ人間が書いた技術記事だ。

3つの入力形式

同じ本文から、改行とMarkdown記号の残し方を変えた3つの形式を用意した。
Aは原文そのまま、Bは改行を消したもの、Cは改行とMarkdown記号を消したプレーンテキストだ。

形式A(原文)B(改行なし)C(記号なし)
文字数3,0752,9432,485

Bでは行末の2スペース(Markdownの改行指定)も一緒に消し、行の境目で英数字同士がくっつく箇所だけ半角スペースを入れた。
Cでは見出しの ##、リンクのURL、バッククォート、表の縦棒と区切り行、画像を消した。
リンクは表示テキストだけ残し、コードブロックは前後のバッククォートを外してコード本体を残した。
番号付きリストは、ESPRIMO記事の本文が「1〜4すべてダメ」と箇条書きの数字に言及しているため残してある。

ESPRIMO記事の判定結果

llm_styleの値はtrueの確率。
rhythmは、その下の0〜3の各確率で重み付けした平均と一致する。
dominantの行から下は、dominant_styleの各選択肢の確率。
確信度は画面のConfidenceで、rhythmdominant_styleにのみ表示される。

項目ABC
llm_style29%25%26%
rhythm2.422.332.21
0の確率0%0%0%
1の確率1%2%8%
2の確率56%63%63%
3の確率43%35%29%
確信度56%62%63%
dominant
natural81%72%51%
verbose17%26%42%
fragmented0%1%6%
formulaic1%1%1%
確信度75%64%35%

画面のレイテンシ表示は、Aが118 + 215ms、Bが161 + 287ms、Cが182 + 260msだった。

結果を見ると、改行やMarkdown記号を消してプレーンテキスト(C)にしても、llm_style(LLMっぽさ)の確率は25〜29%であまり変わらなかった。
一方で文のリズム(rhythm)は2.42から2.21へと採点が下がり、dominant_styleでもnaturalが81%から51%に落ちてverbose(冗長)が42%まで増えている。

A(原文そのまま)の実行結果。

Aの結果画面。llm_styleはtrue 29%、rhythmは2.42、dominant_styleはnatural 81%

B(改行除去)の実行結果。

Bの結果画面。llm_styleはtrue 25%、rhythmは2.33、dominant_styleはnatural 72%

C(プレーンテキスト)の実行結果。

Cの結果画面。llm_styleはtrue 26%、rhythmは2.21、dominant_styleはnatural 51%

同一入力での結果のブレ

Aは最初に1回送り、B・Cを試したあとにもう1回実行した。
上の表と画面キャプチャは2回目の値だ。

項目1回目2回目
llm_style29%29%
rhythm2.462.42
0の確率0%
1の確率1%
2の確率56%
3の確率43%
確信度52%56%
dominant
natural81%81%
verbose17%17%
fragmented1%0%
formulaic1%
確信度75%75%

1回目は詳細内訳を折りたたんだ状態で保存したため、rhythmの各確率とformulaicは画面上には表示されていない。
画面のレイテンシ表記は1回目が148 + 264ms、2回目が118 + 215msだった。

Qwenが書いた記事

比較対象として、pi.devとQwenで架空の音楽レーベルサイトを作った記事の本文も同じ3つの形式で試してみた。
この記事は構成から文体の修正までQwen3.7 / 3.8で行い、手直しはほとんどしていない。
末尾の --- 以降にある制作手順と感想は外して本文のみを入力した。

形式A(原文)B(改行なし)C(記号なし)
文字数9,8759,6548,252
項目ABC
llm_style61%60%58%
rhythm1.381.210.89
0の確率15%22%36%
1の確率35%38%40%
2の確率46%38%22%
3の確率4%2%2%
確信度29%36%38%
dominant
natural27%20%6%
verbose67%72%48%
fragmented3%4%44%
formulaic3%4%2%
確信度56%63%30%

画面のレイテンシ表示はAが125 + 211ms、Bが135 + 238ms、Cが111 + 168msだった。

Qwen記事はもともとllm_styleが約6割と高めに出ている。こちらも形式を変えてもllm_style自体は58〜61%とほぼ動かないが、rhythmは1.38から0.89まで落ち、dominant_styleではfragmented(唐突な切れ目)が44%まで跳ね上がった。
Qwen記事には表が6つとコードブロックが6つあり、Cではそれらが区切りなしで地の文につながっている(例:「作業環境要素 内容ハーネス pi.dev…」)。

A(原文そのまま)の実行結果。

Qwen記事のAの結果画面。llm_styleはtrue 61%、rhythmは1.38、dominant_styleはverbose 67%

B(改行除去)の実行結果。

Qwen記事のBの結果画面。llm_styleはtrue 60%、rhythmは1.21、dominant_styleはverbose 72%

C(プレーンテキスト)の実行結果。

Qwen記事のCの結果画面。llm_styleはtrue 58%、rhythmは0.89、dominant_styleはverbose 48%

全部人間が書いた文章

ChatGPT登場以前の2011年に旧ブログへ書いた過去記事も試してみた。
地の文だけの記事は長くても1,000字前後だったため、日記1本(953字)と技術寄りの勉強会報告1本(825字)を選んだ。
どちらもMarkdownではないプレーンテキストで、形式は改行ありの1種類のみとした。

項目日記勉強会報告
llm_style16%14%
rhythm2.452.69
0の確率0%0%
1の確率6%1%
2の確率43%29%
3の確率51%70%
確信度45%69%
dominant
natural5%55%
verbose0%8%
fragmented95%37%
formulaic0%0%
確信度93%39%

画面のレイテンシ表示は日記が136 + 226ms、勉強会報告が74 + 172msだった。

ChatGPT登場以前の文章ではllm_styleが14〜16%と低く、リズムも2.45〜2.69と高い値を保っている。ただ、日記はdominant_stylefragmented(唐突な切れ目)が95%と極端に出た。
この日記はもともと写真日記で、テキストにしたときに画像のあった位置が空行として残り、全120行のうち71行が空行になっている。

Qwen(A)はfragmentedが3%しかないのにllm_styleは61%と判定された。一方、2011年の日記はfragmentedが95%に達しているのにllm_styleは16%に留まっている。
今回試した4本では、fragmentedの高さとllm_styleの高さは連動していなかった。

日記の実行結果。

2011年の日記の結果画面。llm_styleはtrue 16%、rhythmは2.45、dominant_styleはfragmented 95%

勉強会報告の実行結果。

2011年の勉強会報告の結果画面。llm_styleはtrue 14%、rhythmは2.69、dominant_styleはnatural 55%

質問文を書いたモデルを変える

今回のスキーマは、Playgroundの雛形からCodexが組み立てたものだった。
入力の形式を変えてもllm_styleはほとんど動かなかったので、次は入力を固定して質問文のほうを変えてみる。
判定を行うモデルはJevのままで固定し、Jevに渡す質問文と判定基準(スキーマ)を作成するモデルだけを変えて比較した。

Claude Opus 5、Qwen3.8-Max、Gemini 3.8 Flash High(AGY経由)に、Codexに渡したのと同じ雛形を渡し、Codex版と同じ3問のスキーマを生成させた。
最初は構造も自由にさせたところ、モデルごとに質問の数や段階数、書く言語までそろわなかった。
そこでキー名、型、rhythmの4段階、dominant_styleの選択肢のキーはCodex版に固定し、英語の質問文と基準だけを各モデルに書かせた。
Codex(GPT)の分は、今回使ったスキーマをそのまま使う。

入力はESPRIMO記事とQwen記事のA(原文そのまま)に固定する。
Codex版ではllm_styleがESPRIMO記事で29%、Qwen記事で61%と開いていた。
この差が、ほかのモデルが書いた質問文でも残るかを比べてみた。

スキーマ作成モデル対象記事llm_stylerhythmdominant_style(上位)
Codex(GPT)ESPRIMO(A)29%2.42natural 81%, verbose 17%
Codex(GPT)Qwen(A)61%1.38verbose 67%, natural 27%
Claude Opus 5ESPRIMO(A)9%2.86natural 100%
Claude Opus 5Qwen(A)21%1.72natural 52%, formulaic 43%
Gemini 3.8 Flash HighESPRIMO(A)17%2.80natural 99%
Gemini 3.8 Flash HighQwen(A)47%2.02natural 51%, formulaic 34%
Qwen3.8-MaxESPRIMO(A)30%2.75natural 98%
Qwen3.8-MaxQwen(A)55%1.71natural 67%, verbose 26%

画面のレイテンシ表示は次の通りだった。

  • Claude Opus 5: ESPRIMOが179 + 235ms、Qwenが177 + 169ms
  • Gemini 3.8 Flash High: ESPRIMOが84 + 169ms、Qwenが161 + 173ms
  • Qwen3.8-Max: ESPRIMOが119 + 174ms、Qwenが127 + 208ms

どのモデルが書いたスキーマでも、ESPRIMO記事よりQwen記事のほうがllm_style(LLMっぽさ)の確率は12〜32ポイント高く出た。
またrhythmも、すべてのスキーマでESPRIMO記事が2点台後半、Qwen記事が1点台から2点台前半となり、文のリズムの採点差も一貫していた。

スキーマごとの差を見ると、Claude Opus 5版は両方の記事でllm_styleが低めに出ている(9%と21%)。
Claudeのスキーマは判定基準の中に「〜と言えるでしょう」「〜することが重要です」「いかがでしたか」「まず/次に/さらに/最後に」など、日本語の典型的な言い回しを具体的に指定していた。基準に具体的な語句を多く含めたClaude版では、全体としてtrueの判定確率が低く出た形だ。

Gemini版(17%対47%)とQwen版(30%対55%)は、Codex版(29%対61%)に近い25〜30ポイントの開きが出た。
Qwen版のdominant_styleでは、Qwen記事でverbose(冗長)が26%選ばれており、Codex版の67%と同様に説明過多な傾向が拾われていた。

質問文を書いたモデルによって絶対値の高さは異なるが、人間が書いた文章とLLMが書いた文章の開きはどのスキーマでも再現した。

Claude Opus 5のスキーマによるESPRIMO記事(A)の実行結果。

Claude Opus 5のスキーマによるESPRIMO記事(A)の結果画面。llm_styleはtrue 9%、rhythmは2.86、dominant_styleはnatural 100%

Claude Opus 5のスキーマによるQwen記事(A)の実行結果。

Claude Opus 5のスキーマによるQwen記事(A)の結果画面。llm_styleはtrue 21%、rhythmは1.72、dominant_styleはnatural 52%

Gemini 3.8 Flash HighのスキーマによるESPRIMO記事(A)の実行結果。

Gemini 3.8 Flash HighのスキーマによるESPRIMO記事(A)の結果画面。llm_styleはtrue 17%、rhythmは2.80、dominant_styleはnatural 99%

Gemini 3.8 Flash HighのスキーマによるQwen記事(A)の実行結果。

Gemini 3.8 Flash HighのスキーマによるQwen記事(A)の結果画面。llm_styleはtrue 47%、rhythmは2.02、dominant_styleはnatural 51%

Qwen3.8-MaxのスキーマによるESPRIMO記事(A)の実行結果。

Qwen3.8-MaxのスキーマによるESPRIMO記事(A)の結果画面。llm_styleはtrue 30%、rhythmは2.75、dominant_styleはnatural 98%

Qwen3.8-MaxのスキーマによるQwen記事(A)の実行結果。

Qwen3.8-MaxのスキーマによるQwen記事(A)の結果画面。llm_styleはtrue 55%、rhythmは1.71、dominant_styleはnatural 67%