はじめに
ここで判定するのは、文章がAI生成かどうかではなく、AI生成文に現れやすい不自然な言い回しが含まれているかです。
書き込みの口は店舗向けアプリと共用のため、あちらの記録にも同じ足跡が乗ります。
AI が出力した説明文を読んでいて、困惑したことはありませんか?
「口」が何で、「足跡が乗る」とどうなるのかが分かりません。こちらの文章を直すと以下のようになります。
書き込みの処理は店舗向けアプリと共用のため、店舗向けアプリの Sentry にも同じ記録が届きます。
「口」は Cookie に書き込む処理のことで、「足跡が乗る」は Sentry に記録が届くことでした。
こういう文は検索では見つけられないので、文を1つずつ Jevに判定させています。
この記事では、Jevに送っている6つの質問と、実際の PR の説明文を直す前と直した後で並べたものを載せます。アプリの種類は架空のものに差し替えていますが、言い回しは元のままです。
Jevの判定によりどう変わったか
直す前の説明文
ログインの失敗を調べるために、エラーの記録を増やした PR です。
### 通信が切れたときの同期失敗も残る
通信そのものが切れた場合、原因のエラーはブラウザ既定の文言になり、文言で一律に捨てる設定に掛かって記録ごと消えていました。捨てられない文言を固定し、応答が返った上での失敗か、通信そのものの失敗かを区別して送ります。応答が返っていれば番号も添えます。
### ログイン通知と Cookie 書き込みの足跡
ログイン状態の通知が発火したか、そのとき利用者が居たか、Cookie の書き込みが始まって成功したか失敗したかが、エラーに付随する足跡として残ります。書き込みの口は店舗向けアプリと共用のため、あちらの記録にも同じ足跡が乗ります。
**確認したい点**:店舗向けアプリにも足跡が増えますが、動きは変わらないためこのままにしています。
## 動作確認
型チェック、lint、テスト 38 件が通ることを確認しました。本番での切り分けは、次に事象が起きたときの記録で行います。
Jevに送っている6つの質問
Jevには、文と質問を送ります。返ってくるのは、質問に当てはまる確率です。しきい値以上の文を候補にします。
| 判定 | 質問の内容 | しきい値 |
|---|---|---|
| 主体が書かれていない | 誰が、または何がその動作をするのかが、その文にも前の文にも書かれておらず、読み手が推測しなければならない動詞があるか | 0.5 |
| 主語が途中で入れ替わる | 文の途中で、動作の主体や視点(書き手、システム、利用者)が、断りなく別のものに入れ替わっているか | 0.4 |
| モノに人の動作をさせる | 情報、設定、画面などのモノが、判定する、待つ、決めるのような、人や仕組みが行う動作の主語になっているか | 0.35 |
| 概念を鉤括弧で強調 | 引用でも画面の文言でもない言葉を、目立たせる目的で「」で囲んでいるか | 0.5 |
| 名詞に普段付かない動詞を当てる | 名詞と動詞の組み合わせが、エンジニアが同僚とのチャットで普段使う組み合わせになっていない箇所があるか | 0.5 |
| 人が行うことを強調するだけの言葉 | 「目で」「手で」のような、削っても意味が変わらない言葉が足されているか | 0.35 |
どの質問にも、当てはまらない場合の説明を添えています。たとえば「モノに人の動作をさせる」には、「API が応答を返す」「テストが通過する」のような技術文書の決まった言い方は含めない、と書いています。
直す前の説明文を判定した結果
8文のうち6文が候補に挙がりました。確率の高い3件です。
| 確率 | 判定 | 文 |
|---|---|---|
| 0.73 | 主体が書かれていない | 捨てられない文言を固定し、応答が返った上での失敗か、通信そのものの失敗かを区別して送ります。 |
| 0.63 | 名詞に普段付かない動詞を当てる | 書き込みの口は店舗向けアプリと共用のため、あちらの記録にも同じ足跡が乗ります。 |
| 0.62 | 名詞に普段付かない動詞を当てる | …成功したか失敗したかが、エラーに付随する足跡として残ります。 |
直した後
候補に挙がった文を Claude に直させました。あわせて、経緯を知らない別の AI に本文だけを読ませ、意味が取れなかった箇所も直させています。
| 判定 | 直す前 | 直した後 |
|---|---|---|
| 名詞に普段付かない動詞を当てる | 書き込みの口は店舗向けアプリと共用のため、あちらの記録にも同じ足跡が乗ります。 | 書き込みの処理は店舗向けアプリと共用のため、店舗向けアプリの Sentry にも同じ記録が届きます。 |
| 名詞に普段付かない動詞を当てる | …成功したか失敗したかが、エラーに付随する足跡として残ります。 | 会員アプリは、…成功したか失敗したかを、エラーと一緒に送ります。 |
| 名詞に普段付かない動詞を当てる | 文言で一律に捨てる設定に掛かって記録ごと消えていました。 | 会員アプリはこのメッセージを持つエラーを一律に送らない設定のため、失敗が記録ごと消えていました。 |
| 主体が書かれていない | 捨てられない文言を固定し、…区別して送ります。 | Cookie を書き込む処理が [session] cookie sync failed という決まったメッセージで送るようにし、…区別します。 |
| 主体が書かれていない | 本番での切り分けは、次に事象が起きたときの記録で行います。 | 本番では、次に事象が起きたら記録を見て判断します。 |
「足跡」は「記録」に、「口」は「処理」になり、「会員アプリは」「Cookie を書き込む処理が」という主語が入りました。
うまくいかなかったこと
2つあります。
1つ目は、見出しが判定されないことです。この記事の見出しは、最初「Jevに1文ずつ聞く」でした。道具に「聞く」と書くのは AI くさい、と指摘されて直しています。スクリプトは見出しを Jevに送っていませんでした。本文として送ってみても、「道具を人のように扱っている」という理由では候補に挙がりませんでした。
2つ目は、トークンの消費です。比較的費用がかからないJevですが、Claude Code の返答すべてを自動で点検させたところ、消費が大きすぎて無料トークンを食いつぶしそうになったのでやめました。今は、PR の説明文のように人に読んでもらう文章だけを点検しています。
この記事も Jevで判定した
この記事の下書きも Claude に書かせたので、同じ6つの質問で判定しました。47文のうち候補は26件で、確認して直したのは6文です。
| 判定 | 直す前 | 直した後 |
|---|---|---|
| モノに人の動作をさせる | 候補は、読む場所を教えてくれるだけです。 | 候補から分かるのは、どの文を読み直せばよいかだけです。 |
| 主語が途中で入れ替わる | 言葉が替わっただけでなく、…という主語が入り、「文言」は実際のメッセージに置き換わっています。 | …という主語も入っています。「文言」と書かれていた箇所には、実際のメッセージが載りました。 |
| モノに人の動作をさせる | 質問の1つはこう書いています。 | 質問の1つは次のとおりです。 |
| 主体が書かれていない | 1文ごとに、その文がある段落全体と複数の質問を送っているためです。 | スクリプトが1文ごとに、その文がある段落全体と複数の質問を送るためです。 |
| 主体が書かれていない | しきい値を超えた文を候補として並べ、直すかどうかは読んで決めます。 | スクリプトはしきい値を超えた文を候補として並べるだけで、直すかどうかは僕が読んで決めます。 |
| 名詞に普段付かない動詞を当てる | 人に読んでもらう文章だけにかけています。 | 人に読んでもらう文章だけを点検しています。 |
残りの20件は直していません。9件は「足跡が乗ります」を例として引用している文で、ほかの11件も問題のない文でした。
このように、日本人が使う日本語からかけ離れた文章を簡単に検出できると助かりますね。
OpenAI の Decisions API でも同じようなことができそうなので、無料トークンがなくなったら、自分はそちらに移行する予定です。
