AIっぽさを直す

生成された文章には、よく出る形があります。太字の多さ、「X ではありません。Y です」の対比、「重要なのは、」で始まる文、コロンから箇条書きへ渡す節などです。 chaff はこの形を機械で見つけますが、文章は書き換えません。このページでは、見つけた形を手がかりに、人の書いた文章に近づける手順を説明します。

まず直す計画を出す

直す前に、chaff fix-plan で「直す計画」を出します。

npx chaffjs fix-plan article.md           # 直す計画を Markdown で出す
npx chaffjs fix-plan article.md --json    # 同じものを JSON で(AI に渡すとき)

chaff が見つけた箇所を、ルールごとに「どう直すか」の指示書にまとめたものです。書き直すのは、この計画を読む人か AI です。chaff は書き直しません。どこにも送りません。

計画には次のことが書かれています。

項目中身
ジャンルの指針ジャンルを決めたとき、その種類のよい文書が満たすこと。書き直しはこれに沿わせます。下の「AI にジャンルの指針を渡す」を見てください
守ること事実・数・条件・名前を変えない。無い事実を足さない。分からない具体は作らずに書き手に聞く。書き直しは 2 回まで
勧める直し方部分直し・節ごとの書き直し・全面書き直しのどれを勧めるかと、その理由。下の「3 つの直し方」と同じ決め方です
文書全体の目印ai-generated-composite や密度のルールが言ったことと、chaff outline と同じ構成の数
構成の目標構成の AI らしさ(構成の項目のうち、人の記事の 9 割を超えたものの数)と、超えた項目ごとの目標。目標の数は、生成 AI が広まる前の人の記事から出します(この長さなら見出しは何個まで、など)
ルールごとの直し方直す方向、変えないもの、やりがちな間違い、直す前と後の例、見つけた箇所(行と文)
直したあとの確かめ書き直した文書にかける chaff、chaff compare、chaff outline のコマンド

直す方向と例は、ルールのファイル(rewrite:)に書いてあります。同じ指摘には、いつも同じ直し方が示されます。人が直すときも、AI に頼むときも、手順は同じです。

  1. npx chaffjs fix-plan article.md で計画を出します。
  2. 計画に沿って書き直し、計画の「直したあとの確かめ」にある名前で保存します。AI に頼むときは、計画をそのまま渡します。
  3. 確かめのコマンドを実行します。指摘が残っていないか、事実が落ちたり足されたりしていないか、構成がどう変わったかを見ます。

計画から書き直して確かめるまでの例は、「直す計画から書き直して確かめる」にあります。

AI にジャンルの指針を渡す

直す計画は、chaff が見つけた箇所ごとに何を直すかを言います。文書全体が何を満たすべきかは、ジャンルの指針にあります。ジャンルを決めると(--genre、chaff.yaml の genre か by_path、front matter)、計画は「守ること」より前に指針から始まります。

計画に沿って書き直す AI は、まず指針を読み、書き終えたら一行ずつ確かめます。指針の多くはルールでは確かめられません。読んで従う指示です。

$ npx chaffjs fix-plan draft.md --genre blog/tech

# 直す計画: draft.md

言語 ja、ジャンル blog/tech

chaff が機械で見つけた箇所と、それぞれの直す方向です。chaff は書き直しません。書き直すのは、この計画を読む人か AI です。直したら、最後の確かめのコマンドを実行してください。

## 指針: 技術ブログ(blog/tech)

このジャンルのよい文書が満たすことです。書き直しはこれに沿わせ、書き終えたら一つずつ確かめてください。

- 冒頭で、主張を 1 つに絞って言い切っているか(何が分かり、何ができるようになる記事か)
- 手順とコードが、書いてあるとおりに実行して同じ結果になるか
- 使ったバージョン(言語・ライブラリ・OS)と、試した日付を書いているか
- 試してうまくいかなかったこと、制約、前提を書いているか
- 結びが本文の言い直しではなく、次に読むもの・試すものを示しているか

このジャンルで特に効く rule: `closing-cliche`, `empty-conclusion`, `padded-intro`, `paragraph-length-variance`, `quote-without-source`, `rule-of-three`, `section-length-uniformity`, `sentence-rhythm`

…

JSON を読む AI には、指針をデータでも渡します。

出力指針の置き場所
fix-plan --json一番上の guide。genre、name、lines、rules(特に効くルール)、from(書いた場所)を持ちます。ジャンルを決めていなければ null
rules --json一番上の guide。形は同じで、--genre か chaff.yaml のジャンルのものです
--sarif <path>runs[0].properties.guides。実行に出てきたジャンルと言語ごとに 1 つで、それぞれ language を持ちます
$ npx chaffjs rules --json --genre blog/tech

…
  "guide": {
    "genre": "blog/tech",
    "name": "技術ブログ",
    "lines": [
      "冒頭で、主張を 1 つに絞って言い切っているか(何が分かり、何ができるようになる記事か)",
      "手順とコードが、書いてあるとおりに実行して同じ結果になるか",
      "使ったバージョン(言語・ライブラリ・OS)と、試した日付を書いているか",
      "試してうまくいかなかったこと、制約、前提を書いているか",
      "結びが本文の言い直しではなく、次に読むもの・試すものを示しているか"
    ],
    "rules": [
      "closing-cliche",
      "empty-conclusion",
      "padded-intro",
      "paragraph-length-variance",
      "quote-without-source",
      "rule-of-three",
      "section-length-uniformity",
      "sentence-rhythm"
    ],
    "from": [
      "genres.yaml"
    ]
  },
…

Claude Code の skill(npx chaffjs skill)は、指摘より先に指針を読むように Claude に伝えます。推測したジャンルや既定のジャンルでは指針が出ないので、AI に計画を渡す前にジャンルを決めます。 --no-guide を付けると、どこにも指針を出しません。指針の文は、チームが chaff.yaml の guide: で変えられます(ジャンルの指針を変える)。

chaff が見る AI っぽさ

これらのルールは、技術記事、ブログ、ビジネス文書では既定で動きます。法務の文書、説明書、文学、発言録は書き方が違うので、多くは止まります。どのジャンルで止まるかは npx chaffjs explain <ルール> に出ます。

ルール見つけるもの
ai-tell生成文に多い言い回しの重なり(「重要な役割を果たす」「静かに壊れる」「時間を溶かす」)
contrast-framing「単なる X ではなく Y」「X ではありません。Y です」の対比の枠の重なり
stock-transition「さらに、」「加えて、」で始まる文の密度
announcing-opener「重要なのは、」「ポイントは、」「正直に言うと、」で始まる文の重なり
colon-lead-in「以下の通りです:」のように、コロンで箇条書きへ渡す文の密度
emoji-heading「## 🚀 はじめに」のように、絵文字の付いた見出しが続く所
bold-label-list「- 速さ:〜」のように、太字の札とコロンで始まる項目の多さ(日本語の文書だけ)
assistant-residue「お役に立てれば幸いです」のような、チャットの返事の名残
chat-citation-residue「?utm_source=chatgpt.com」の付いたリンクや「oaicite」のような、チャットの答えを貼ったときに残る印
closing-cliche「いかがでしたでしょうか」で締める終わり方
bold-density太字の多さ
no-em-dashダッシュ(——)の多さ
sentence-rhythm文の長さが揃いすぎている所
rule-of-three箇条書きがどれも 3 項目の所
section-length-uniformityどの節もほぼ同じ長さに埋めてあり、ひな形を埋めたように見える所
paragraph-length-varianceどの段落もほぼ同じ長さで、型に流しこんだように見える所
ai-structure構成の項目(見出しの多さ、3 つに分けた小見出し、太字の札、節の長さの揃い方、本文を言い直すまとめなど)のいくつもが、人の記事の 9 割を超えた文書。ブログとエッセイだけで見ます
ai-generated-composite次の特徴のうち 3 つ以上がそろった文書:ai-tell、contrast-framing、stock-transition、announcing-opener、colon-lead-in、assistant-residue、closing-cliche、padded-intro、no-em-dash、sentence-rhythm、rule-of-three、section-length-uniformity、ai-structure(bold-density は数えません)

どのルールも、それだけで「AI が書いた」とは言いません。人も書く形です。重なったときに、読み返す場所の目印になります。 no-lead や paragraph-restatement のように、ほかにも書き直す箇所を指すルールがあり、fix-plan はその直し方も出します。全部は リファレンス にあります。

ai-tell の語彙表には、技術文の比喩(「静かに壊れる」「黙って無視される」「時間を溶かす」)も入っています。どの語を入れるかは、生成 AI 以前の技術記事と corpus で測って決めました。「解像度を上げる」「腹落ち」のように、以前から人が同じくらい書いていた語は入れていません。

AI らしさを簡易判定する

npx chaffjs ai-score <file> は、上の目印のうち、同じジャンルの人の文書にはめったに出ないものがいくつ出ているかを数え、低・中・高で言います。 書いたのが AI かどうかの判定ではありません。 人の文書と比べて、読み返す場所が多いかどうかの目安です。

  • 目印は、上のルールが出した指摘と、chaff outline の構成の項目です。人の文書の 9 割に出ないものだけを数えます。
  • 人の文書は、corpus の人の文書(ブログ、技術文書、ビジネス文書などのジャンルごと)と、生成 AI が広まる前の技術記事です。どちらも chaff と一緒に置いてある数で比べます。
  • 目印が 3 つから「中」、5 つから「高」です。ai-generated-composite が出る数と、その relaxed の段階と同じです。
  • ai-generated-composite が読むルールのうち 2 つ以上が同じ文書に出たとき(その strict の段階)は、目印をもう 1 つ数えます。corpus の人の文書には、2 つがそろって出るものがありません(yarn ai-score:corpus --all で数えられます)。
  • 構成の項目と、同じ形を見るルール(節の長さの揃い方と section-length-uniformity など)がどちらも出たときは、1 つに数えます。
  • 短すぎる文書(日本語 500 字、英語 200 語より短い)と、人の文書の基準が足りないジャンル(学術、話し言葉)では、段階を出さずに理由を言います。
  • ふだんの npx chaffjs <file> も、報告の最後に 1 行で段階を出します。chaff grade は出力ごとの結果に aiScore を入れます(AI の評価に使う)。

画面の例は、技術記事の例の最後にあります。

3 つの直し方

直し方深さ直すもの向いているとき
部分直しlight指摘された所だけ中身も構成もよく、言い回しだけが気になるとき
節ごとの書き直しlight節ごとの文章。見出しの構成は残します構成が決まっている文書(報告書の型、手順書、必須の節がある文書)
全面書き直しstructure文書の全体。構成から作り直します「全面的に」「一から」と頼まれたとき。ブログとエッセイ。ai-generated-composite が出たとき。計画の構成の AI らしさが上限に届いたとき

部分直しは、指摘を一つずつ消していく直し方です。誤字や長い文は直りますが、文書の形は残ります。節ごとに書き直しても、見出しの構成は元のままです。数段落ごとの見出し、太字の書き出し、本文を繰り返す「まとめ」は、文を直しても生成文に読めます。

ブログとエッセイでは、全面書き直しを勧めます。ai-generated-composite が出た文書も同じです。書き手が変えたいのは、たいてい文ではなく構成だからです。

書き直しの深さを決める

どこまで深く書き直してよいかが先に決まっているときは、--depth で深さを渡します。

npx chaffjs fix-plan article.md --depth light        # 構成は残す。語と文だけ
npx chaffjs fix-plan article.md --depth structure    # 節・見出し・段落の組み替えまで
npx chaffjs fix-plan article.md --depth register     # 文体を変えるところまで(です・ます → である など)
深さ書き直すもの
light語と文。構成と文体は残します
structure節・見出し・段落の組み替え。light を含みます
register文体の変換(です・ます → である、比べる言い方を外す、など)。structure を含みます

ルールごとに、直す方向がどの深さまで届くかがルールのファイルの rewrite.depth に書いてあります。 --depth light にすると、one-sentence-paragraph-run のように段落を組み替えるルールは、計画の「決めた深さより深いルール」に名前と箇所の数だけが並びます。直さないものを黙って落とすと、直したように見えるからです。毎回同じ深さにするなら、chaff.yaml に書きます(設定)。深さを決めなければ、chaff が上の表の直し方から一つを勧め、その深さを計画に書きます。文体を変える書き直しは、chaff からは勧めません。

部分直しの手順

  1. npx chaffjs fix-plan article.md で直す計画を出します。
  2. 計画の直す方向に沿って、指摘された所だけを書き直します。意味、数、条件、技術的な制約は残します。
  3. もう一度 chaff をかけます。書き直しは 2 回までにします。
  4. 書き直した文章と、何をなぜ変えたのかの短い一覧を残します。

警告を消すためだけに繰り返しません。言い換えた語がまた別のルールに当たっても、文脈で正しい専門用語ならそのまま残します。

節ごとの書き直しの手順

節ごとの書き直しは、見出しの構成を残したまま、節ごとに文章の形を変えます。

  1. 書き直す前に chaff をかけ、文書全体の特徴を控えます。控えるのは、ai-generated-composite に入る特徴、bold-density、contrast-framing、 stock-transition、sentence-rhythm です。
  2. 節ごとに、次の形を減らしながら書き直します。
減らす形書き直し方
太字本当に読み飛ばされては困る語だけに残します
一文だけの段落、短い決め台詞前後の段落に戻し、理由と一緒に書きます
「X ではありません。Y です」誰も言っていない X を消し、Y だけを書きます
箇条書きばかりの節項目どうしの繋がりがあるなら、文に戻して繋がりを書きます
ダッシュ(——)読点か括弧にするか、文を分けます
予告だけの文(「重要なのは、」)予告を消し、中身から書き始めます
  1. 段落には主張を一つ持たせ、接続の言葉で前の段落と繋ぎます。元の文章に書き手の経験や具体的な数があれば、それを段落の中心に置きます。
  2. もう一度 chaff をかけ、1 で控えた特徴と比べます。変わったことは、言葉ではなく chaff の結果で示します。
  3. npx chaffjs compare <書き直す前> <書き直した後> をかけ、落ちた事実と足された事実を確かめます。数、日付、時刻、URL、コード、固有名詞、引用、見出し、条項の参照、脚注を、前と後で突き合わせます。落ちた事実は戻します。事実でないもの(比喩の中の数、消した節の見出し)は、戻さない理由を残します。わざと消した種類は --allow-dropped <種類> で外せます。

全面書き直しの手順

全面書き直しでは、元の文を直しません。元の文書が言っていることを控えに取り、そこから書き起こします。

  1. 書く前に控えを取ります。npx chaffjs facts <file> --json で、compare が照合する事実の一覧を出します。 npx chaffjs outline <file> で、元の構成と形、構成の AI らしさを出します。人の記事の 9 割を超えた項目には ✗ が付きます。書き手の主張と、具体的な経験・例・意見は、一行に一つずつ書き出します。書き直しは、元の文ではなくこの控えから書きます。
  2. 構成を捨てます。誰が何のために読むのかを決め、文書全体の切り口や話の筋を一つ選びます。そのうえで、書き始める前に次の組み替えを済ませます。
組み替えすること
順番を変える結論か、いちばん面白い出来事を先に置きます
節を合わせる・分ける薄い節は合わせ、詰め込みすぎた節は分けます。一段落ごとに見出しを立てません
繰り返すだけの節を消す本文を言い直すだけの節は消します。最後の「まとめ」も同じです
一段落だけの見出しを外す見出しの下に一段落しかなければ、見出しを外して前後に合わせます
要点の箇条書きを話にする要点を並べただけの節は、一本の筋を持つ文章にします
3 点の対称をやめる中身が本当に 3 つでない限り、3 つの節や 3 つの項目に揃えません
経験を動かす書き手の具体的な経験は、主張を支える場所に置きます
書き出しを変える決まり文句の前置きをやめ、要点か具体的な場面から始めます

新しい構成の大きさは、計画の「構成の目標」に合わせます。見出しは目標の数までにし、中身が 3 つでない限り小見出しを 3 つに分けず、太字の札の箇条書きと本文を言い直すまとめは作りません。

  1. 新しい構成を先に見せます。元の構成(chaff outline の見出し)と新しい構成を並べ、新しい側には節ごとに何を書くかを一行添えます。書き手が、構成の変わり方をひと目で見て決められるようにするためです。確認せずに進めてよいと頼まれていれば、そのまま書きます。
  2. 控えから、書き手の声で書きます。
書き方中身
段落主張を持たせ、接続の言葉で前の段落と繋ぎます。文の長さは揃えません
動詞比喩(「静かに壊れる」)をやめ、何が起きるのかを書きます
経験と数書き手の出来事と数は残し、どの記事にも書ける埋め草は消します
太字と箇条書き太字は読み落とされては困る所だけにします。箇条書きは、本当に並べるもの・手順・コマンドだけにします
避ける形主張にぼかしを重ねない、これから言うことを予告しない、「X ではなく Y」にしない、ダッシュを使わない
調子書き手のほかの段落の文末(です・ます か だ・である)と、載せる場所(Zenn、社内の報告、メール)に合わせます
足さないもの控えに無い事実、人、数、原因、結果は書きません

書くときは、次の三つを守ります。

守ること前後
擬人化を戻すチームにレビューの文化が醸成された。チームで互いにレビューをするようになった。
名詞で止めた文を動詞の文に戻すキュー滞留によるメッセージ処理遅延の発生。キューにメッセージが溜まり、処理が遅れた。
具体を作らないチームの雰囲気が良くなった。文はそのままにして、書き手に「雰囲気が良くなったと感じたのは、どんな場面でしたか」と聞きます
  • 擬人化を戻します。物や考えを主語にして、意志のある動詞で受けた文(「秩序が壊れる」「文化が醸成される」「アーキテクチャが要求する」)は、人か仕組みがすることとして書きます。誰がするのかが元の文書に無ければ、書き手に聞きます。
  • 「〜の発生。」のような名詞で止めた文と、名詞を連ねた塊は、動詞のある文に戻します。名詞にまとめると、誰が何をしたのか、いつのことなのかが消えます。
  • 具体を作りません。ぼんやりした文に例を一つ足せば読みやすくなりそうでも、書き手が書いていない例は事実として書きません。書き手に聞くか、推測だと分かる印を付けて確かめてもらいます。 chaff compare は、足された数や固有名詞は見つけますが、足された言葉は見つけません。「朝会で冗談が出るようになり」を足しても、数も固有名詞も増えないので compare は何も言いません。ここは書き直す側が守ります。
  1. 確かめます。
npx chaffjs old.md                       # 書き直す前の AI っぽさの特徴
npx chaffjs new.md                       # 書き直した後の特徴
npx chaffjs outline old.md new.md                       # 見出しの数・節の平均・箇条書き・太字と、構成の AI らしさを前と後で並べる
npx chaffjs compare old.md new.md --distinct --allow-dropped heading --allow-added heading   # 見出し以外の事実が落ちても足されてもいないか

見出しは、わざと作り直した構成なので --allow-dropped heading --allow-added heading で外します。ほかに落ちた事実は戻し、足された事実は消します。消した「まとめ」は、本文に残っている事実を言い直していただけです。--distinct を付けると、書き直した文書に一度でも書いてある事実は残ったとみなすので、その繰り返しは落ちたと出ません。

  1. 次のどれもが成り立ったら止めます。全面書き直しは 2 回までにします。
    • ai-generated-composite が出ない
    • 密度のルール(bold-density、contrast-framing、stock-transition、colon-lead-in)が上限より下にある
    • compare が通るか、外したものすべてに理由が書いてある
    • chaff outline old.md new.md で、書き直した後の構成の AI らしさが計画の上限より下にあり、計画が目標に挙げた項目に ✗ が残っていない
  2. 書き直した文章、何をなぜ変えたのかの短い一覧、前と後の特徴と形の表を見せます。表の数は chaff の出力から取ります。

機械では見つけられない形

次の形は、chaff が機械では見つけられません。どの直し方でも、読んで確かめます。

形読んで確かめること
決まり文句の書き出しと締め「本記事では〜解説します」「いかがでしたでしょうか」で始めたり終えたりしていないか
分かりきった説明読み手がみな知っていることを説明していないか
同じ組み立ての節どの節も同じ組み立てになっていないか(長さと見出しの形は chaff outline が測ります)
利点だけの列挙良いことだけを並べ、代わりに払うものを書いていないか
一次の情報が無い書き手が見たこと、測ったこと、やったことが一つも無いか
一様な熱量どこも同じ調子で褒めていて、何が大事なのか分からないか
重ねた丁寧さ敬語や前置きを重ねすぎていないか
頼まれていない定義誰も聞いていない言葉の定義を置いていないか
文になった見出し見出しが標語のような一文になっていないか
言い換えて繰り返す「まとめ」最後の節が、本文を別の言葉で言い直しているだけになっていないか(同じ言葉の繰り返しは chaff outline が測ります)

どの直し方でも守ること

  • 元の文章に無い事実、人、数、原因を足しません。
  • 意味、数、条件、技術的な制約は変えません。
  • 否定の対比より、言いたいことをそのまま書きます。
  • 誰が何をするのかを書きます。
  • 書き直しは 2 回までにします。警告を消すためだけに繰り返しません。

ジャンルごとの勘所

ジャンル勘所
技術記事(blog/tech)比喩の動詞(「静かに壊れる」「黙って無視される」)は、何が起きるのかに言い換えます。「例外を出さずに処理を続ける」のように書きます。手順やコマンドの一覧は箇条書きのままにします。
ビジネス文書(business/report)結論と、誰がいつ何をするのかを先に書きます。「単なるツールの導入にとどまらず」のような飾りを消します。表と数字はそのまま残します。
エッセイ(blog/essay)一文だけの段落と決め台詞を前後に戻します。「真理」「新たな可能性」のような大きな言葉を、その場面で起きたことに置き換えます。

例

下書きから書き直したあとの確かめまでを通した例は、別のページ「AIっぽさを直す例」にまとめました。

参考

文献このページとの関わり
Kobak ほか「Delving into LLM-assisted writing in biomedical publications through excess vocabulary」(Science Advances, 2025)生成 AI が広まる前と後の文章で語の使われ方を比べ、増えた語を選ぶ方法。ai-tell の語もこの考え方で選びました
林・相澤「LLM による日本語生成におけるモデル固有表現パターンの分析」(言語処理学会 第32回年次大会, 2026)日本語でも、モデルごとに決まった言い回しや構成(結論の先出し、番号付きの構成、手順を予告する書き出し)が出ること

次に読むページ