9月に Qiita で「生成AIが書いたドキュメントを読みたくない」という記事が、500を超えるいいねを集めました。私も PR の説明や README を AI に書かせています。読む側から見て、どこが「AI っぽい」のでしょうか。
英語版 Wikipedia には、AI が書いた文に多い書き方(以下「しるし」)をまとめた一覧があります。編集者が AI の文を見つけるためのものです。この一覧を物差しにして、Claude Code・Codex・Gemini CLI に PR の説明と README の節を合わせて108本書かせ、しるしを数えました。
結論: 一覧のしるしの大半は、もう出ませんでした。残った癖は「太字の見出しを付けた箇条書き」だけです。指示ファイル(CLAUDE.md・AGENTS.md・GEMINI.md)で消せますが、書き方によっては要点まで消えます。
- AI 語・ダッシュ・絵文字・まとめの節・読み手への語りかけは、108本で1回も出なかった
- 太字の見出しを付けた箇条書きは、Claude Code が12本中6本、Gemini CLI が12本中7本に出た。Codex は0本
- 一覧から作ったルールを指示ファイルに置くと、この癖は0本になった。ただし Gemini CLI は文書が短くなり、既定値や待ち時間などの要点がそろった文書が12本中11本から7本に減った
- 「読み手が知る必要のある中身は省かない」を1行足すと、癖は0本のまま、Gemini CLI は12本中12本で要点がそろった
図の「なし」は指示ファイルなし、「ルール」は一覧から作ったルール11行、「+1行」はそれに「省かない」の1行を足したものです(本文では「省かない」と呼びます)。
検証環境: Windows 10 / Claude Code 2.1.316(Opus 5.5)/ Codex CLI 0.166.0(gpt-6-luna)/ Gemini CLI 0.66.0(Gemini 3.8 Flash、API キー)/ 測定は 2026-11-02
物差しにした一覧
使ったのは、英語版 Wikipedia の「Wikipedia:Signs of AI writing」の 2026-11-01 の版です。AI チャットボットの文に多い書き方を、Wikipedia の実例つきで集めています。
ページは、自分の使い方に断りを付けています。
Not all text featuring these indicators is AI-generated
(しるしがあっても、AI が書いたとは限らない)
…this list is descriptive, not prescriptive; it consists of observations, not rules.
(この一覧は観察であって、ルールではない)
Please do not merely treat these signs as the problems to be fixed; that could just make detection harder.
(しるしを直すべき問題として扱うだけでは、見つけにくくなるだけ)
この記事でも、しるしの数を「悪さの点数」としては扱いません。 一覧は Wikipedia の記事を見分けるためのもので、PR の説明や README に当てたのは私の使い方です。
数えたしるしは次の11種類です。
| しるし | 例 |
|---|---|
| 太字の見出しを付けた箇条書き | - **項目**: 説明 |
| 太字の多用 | 本文中の **…**
|
| 見出しや箇条書きの頭の絵文字 | ## 🚀 Features |
| 英語の見出しの、単語ごとの大文字 | ## Retry Behavior Changes |
| 曲がった引用符 | “ ” ’ |
| AI 語 | additionally, crucial, enhance, leverage, foster など(ページの時期別の一覧を全部) |
| "is" を避ける言い方 | serves as, stands as, represents |
| 打ち消しの並列 | not just X, but Y |
| まとめの節 | In summary, In conclusion |
| 読み手への語りかけ | Let me know, I hope this helps。文書の外の前置き・後書きも |
| ダッシュ | — |
日本語の文書では、表のうち AI 語・"is" を避ける言い方・打ち消しの並列の3つは数えていません。一覧は英語の語そのものを挙げているので、日本語に置き換えると私の解釈が入るためです。
測り方
見本は、請求書の金額を為替レートで換算する小さなプロジェクトです。レートを取る関数に、再試行を足す変更を用意しました。
-
fetch_ratesが、接続エラー・タイムアウト・HTTP エラーのときに再試行する - 回数は環境変数
RATES_MAX_RETRIESで決める(既定は3) - 待ち時間は 0.5 秒から始まり、失敗するたびに倍になる
- 全部失敗したら
RatesUnavailableを投げる - テスト
test_rates.pyを足す
この差分を change.diff として置き、次の4つを頼みました。日本語の回では、見本の README も日本語にしています。
Write a pull request description for the change in change.diff. Output only the description in Markdown.
Write a README section that explains the new setting added in change.diff. Output only the section in Markdown.
change.diff の変更について、プルリクエストの説明を書いて。Markdown で、説明の本文だけを出力して。
change.diff で増えた設定について、README に載せる節を書いて。Markdown で、その節だけを出力して。
ツールは、どれも非対話で動かしました。
| ツール | 動かし方 | モデル |
|---|---|---|
| Claude Code 2.1.316 |
claude -p、読み取りのツールだけ許可 |
既定(claude-opus-5-5) |
| Codex CLI 0.166.0 |
codex exec -s read-only、ChatGPT のログイン |
既定(gpt-6-luna) |
| Gemini CLI 0.66.0 |
gemini -p --approval-mode plan、API キー |
gemini-3.8-flash を指定 |
指示ファイルは、3つの条件で比べました。
- なし
- ルール: 一覧から作った11行(記事の最後に全文)
- 省かない: 2. に「読み手が知る必要のある変更の中身は省かない」を1行足したもの
4つの頼みごと × 3条件 × 3回で、ツールごとに36本、合わせて108本です。しるしは正規表現で数え、引っかかった箇所は目で確かめました。
要点がそろっているかは、次のものが全部書いてあるかで見ました。
- README の節:
RATES_MAX_RETRIES、既定の3、0.5 秒、RatesUnavailable - PR の説明: 上の4つに加えて、
fetch_ratesとテスト
一覧の大半は、もう出なかった
108本で、次のしるしは1回も出ませんでした。
- AI 語(ページの時期別の一覧の全語)
- "is" を避ける言い方、"not just X, but Y"
- 見出しや箇条書きの頭の絵文字、英語の見出しの単語ごとの大文字、曲がった引用符
- まとめの節、読み手への語りかけ、文書の外の前置き・後書き
- ダッシュ
数え方で2つ補足します。AI 語は最初、英語の3本で「key」を数えましたが、どれも JSON の "rates" キーのことだったので外しました。「3つ並べ」も正規表現で22か所拾いましたが、すべて例外3種か待ち時間(0.5・1・2 秒)を並べたもので、文の飾りではありませんでした。
ダッシュについては、ページ自身がすでに「過去のしるし」の節に移しています。
…latest AI models of late (September 2026 and onward) have more and more often been found to be hard coded to not use em dashes at all.
(2026年9月以降の新しいモデルは、ダッシュをまったく使わないように組み込まれている例が増えている)
今回の3つのツールでも、ダッシュは108本で0回でした。
残った癖は「太字の見出しを付けた箇条書き」
一覧の「体裁」の節に「Frequently presenting information in inline-header vertical lists」とある書き方です。指示ファイルが無いとき、Claude Code は12本中6本、Gemini CLI は12本中7本に出ました。一覧の定義は「太字の見出しのあと、コロンで区切って説明が続く」形です。ここでは「〜。 説明」のように太字の文で始める形も数えました。コロンの形だけなら、Claude Code は12本中5本です(Gemini CLI は7本のまま)。
Claude Code(英語の PR の説明):
- **Retry loop in `fetch_rates()`**: retries on `requests.ConnectionError`, `requests.Timeout` and `requests.HTTPError`.
- The first try plus `MAX_RETRIES` retries gives 4 attempts by default.
- The wait before each retry starts at `BASE_DELAY` (0.5s) and doubles each time: 0.5s, 1s, 2s.
- **`RATES_MAX_RETRIES` environment variable**: sets the retry count (default `3`). It is read once, when the module is imported.
Gemini CLI(英語の README の節):
* **`RATES_MAX_RETRIES`**: The maximum number of retry attempts when requests to the currency rates API fail (due to connection errors, timeouts, or HTTP errors).
* **Default**: `3`
* **Behavior**: Failed attempts retry with exponential backoff starting at 0.5 seconds and doubling after each failure.(以下略)
Claude Code(日本語の PR の説明):
- **呼び出し側への影響(互換性が変わります)**:最終的に失敗したときの例外が `requests.HTTPError` などから `RatesUnavailable` に変わります。`RatesUnavailable` は `requests` の例外のサブクラスではありません。そのため、呼び出し側で `requests` の例外を捕まえている箇所は修正が必要です。
- **4xx もリトライされます**:`HTTPError` をまとめて捕まえているため、400 や 404 のようにリトライしても直らないエラーでも最大回数まで再試行します。5xx と 429 だけに絞るかどうか、ご意見をください。
1本に何か所も出るので、太字の数は Claude Code の12本で37、Gemini CLI の12本で25でした。言語で分けると、Claude Code は英語・日本語とも6本中3本、Gemini CLI は英語が6本中6本、日本語が6本中1本です。Codex は12本とも、この書き方をしませんでした。
ルールで消える。ただし要点も消えることがある
一覧から作ったルールを指示ファイルに置くと、太字の見出しを付けた箇条書きは36本で0本になりました。太字そのものも0です。
ただし、Gemini CLI は文書が短くなりました。長さの中央は、英語が 818字から451字、日本語が476字から211字です。要点がそろった文書は、12本中11本から7本に減りました。日本語の README の節では、次の1行だけになった回があります。
## 設定
為替レート取得処理の動作を環境変数で設定できます。
- `RATES_MAX_RETRIES`: 為替レートの取得に失敗した際のリトライ回数を指定します。デフォルト値は 3 です。
待ち時間(0.5 秒から倍)と、全部失敗したときの RatesUnavailable が消えています。指示ファイルが無いときは、3回中2回、表と2つの文でどちらも書いていました。
Claude Code は、ルールを置いても12本とも要点がそろっていました。英語は 2,028字から1,442字に短くなりましたが、要点は残っていました。
「省かない」の1行で戻った
ルールに、次の1行を足しました。
- 短くするために、読み手が知る必要のある変更の中身(設定とその既定値、挙動の変化、失敗したときの動き)を省かない
Gemini CLI は、要点がそろった文書が12本中12本に戻りました。長さもルールを置く前とほぼ同じです(英語 806字、日本語 441字)。太字の見出しを付けた箇条書きは0本のままでした。同じ日本語の README の節は、こうなりました。
## 設定
環境変数 `RATES_MAX_RETRIES` で為替レート取得 API の最大リトライ回数を指定できます。既定値は 3 です。
リクエストで接続エラーやタイムアウトなどの失敗が発生した場合、指定回数まで再試行します。待機時間は 0.5 秒から開始し、失敗するごとに 2 倍になります。すべての再試行が失敗した場合は RatesUnavailable 例外が発生します。
Claude Code も12本とも要点がそろい、癖は0本でした。
Codex は最初から癖が無い。代わりに短い
Codex(gpt-6-luna)の文書は、英語の長さの中央が294字でした。Claude Code の約7分の1です。指示ファイルが無くても、太字の見出しを付けた箇条書きは0本で、太字も12本で1つだけでした。
その代わり、要点の抜けは3つのツールで一番多くなりました。PR の説明で、既定の3回や 0.5 秒を書かない回があります。
## Summary
Adds retry handling to currency rate requests, using exponential backoff for connection, timeout, and HTTP errors. After all attempts fail, `fetch_rates` raises `RatesUnavailable`. The retry count can be configured with `RATES_MAX_RETRIES`.
## Testing
Adds `test_rates.py` with coverage for retry behavior.
要点がそろった文書は、指示ファイルなしで12本中9本、ルールで7本、省かないで8本でした。Codex では、1行足しても抜けは埋まりませんでした。
結果の一覧
各ツール12本ずつ(英語・日本語 × PR の説明・README の節 × 3回)です。
| ツール | 指示ファイル | 太字の見出し付き箇条書き | 要点がそろった | 長さの中央(英 / 日) |
|---|---|---|---|---|
| Claude Code | なし | 6本 | 12本 | 2,028 / 971字 |
| Claude Code | ルール | 0本 | 12本 | 1,442 / 1,060字 |
| Claude Code | 省かない | 0本 | 12本 | 2,043 / 1,291字 |
| Codex | なし | 0本 | 9本 | 294 / 253字 |
| Codex | ルール | 0本 | 7本 | 294 / 197字 |
| Codex | 省かない | 0本 | 8本 | 339 / 220字 |
| Gemini CLI | なし | 7本 | 11本 | 818 / 476字 |
| Gemini CLI | ルール | 0本 | 7本 | 451 / 211字 |
| Gemini CLI | 省かない | 0本 | 12本 | 806 / 441字 |
そのまま使える指示ファイル
最後に測った版です。CLAUDE.md・AGENTS.md・GEMINI.md のどれにも、そのまま置けます。
# 文章を書くときのルール
PR の説明・README・コミットメッセージなど、人が読む文章を書くときに守ること。
- 箇条書きの頭に太字の見出しを付けない(「- **項目**: 説明」の形にしない)
- 本文で太字を使わない
- 見出しや箇条書きの頭に絵文字を付けない
- 英語の見出しは、最初の単語だけを大文字にする(Title Case にしない)
- 引用符とアポストロフィは、まっすぐな " と ' を使う
- 英語では次の語を使わない: additionally, align with, boasts, bolstered, crucial, delve, emphasizing, enduring, enhance, foster, fostering, garner, highlighting, interplay, intricate, landscape, leverage, meticulously, multifaceted, pivotal, showcasing, tapestry, testament, underscore, vibrant
- 英語では "serves as" "stands as" "represents" "boasts" ではなく "is" "has" を使う
- "not just X, but Y" "not X, but Y" の形で書かない
- 3つの語句を並べる言い方を、癖で使わない
- 最後に要約やまとめの段落・節を付けない("In summary" "Overall" も使わない)
- 「お役に立てば」「何かあれば」"Let me know" "I hope this helps" のような、読み手への語りかけを入れない
- 短くするために、読み手が知る必要のある変更の中身(設定とその既定値、挙動の変化、失敗したときの動き)を省かない
今回効いたのは、太字に関する最初の2行と、最後の1行(省かない)です。ほかの行は、今回の3つのツールではもともと出なかったしるしなので、効いたかどうかは分かりません。
これは AI を使ったことを隠すための型ではありません。 ページの断りのとおり、しるしを消しても中身の問題は消えません。AI の利用を明かす決まりがある場所や、Wikipedia のように AI で書いた文の扱いに決まりがある場所では使わないでください。
Windows で Codex と Gemini CLI を動かすときの注意
今回、2つ詰まりました。
-
Codex は
-s read-onlyだけだと、ファイルを読むコマンドも止まった。change.diffを読もうとした PowerShell が「blocked by policy」で拒否され、「Please paste the diff here」と返してきました。-c 'windows.sandbox="unelevated"'を足すと、読み取り専用のまま読めました - Gemini CLI は、個人の Google アカウントでログインすると使えなかった。 「…or Gemini Code Assist for individuals. To continue using Gemini, please migrate to the Antigravity suite of products」と出ます。Google AI Studio の API キーで動かしました。36回で約200〜270円でした
言えないこと
- 見本は小さな変更1つで、各条件3回ずつです
- モデルは Claude Code と Codex が既定、Gemini CLI は 3.8 Flash を指定しました。上位のモデルでは違うかもしれません
- しるしは正規表現で数えました。目で確かめたのは、引っかかった箇所と要点の抜けです
- 足した1行には「既定値」「失敗したときの動き」など、要点の判定と近い言葉が入っています。ほかの種類の変更で同じように効くかは試していません
- 日本語の文書では、語彙のしるしを数えていません
- 結果は 2026-11-02 のものです。モデルが変われば変わります
まとめ
- Wikipedia の一覧のしるしは、今の3つのツールではほとんど出なかった。残ったのは、太字の見出しを付けた箇条書き(Claude Code と Gemini CLI の半分強)
- 指示ファイルに書けば消える。ただし Gemini CLI は、要点まで削って短くなった
- 「読み手が知る必要のある中身は省かない」を足すと、Claude Code と Gemini CLI は12本とも要点がそろった。Codex は短いまま、12本中8本だった
「AI っぽい」と感じたら、太字の見出しより先に、要点が抜けていないかを見たほうがよさそうです。今回、読み手が困りそうだったのは見た目の癖より、既定値や失敗したときの動きが書かれていないことでした。
関連記事
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト