AIに書かせた文章に英語が混ざるときの止め方|プロンプトで直さず出力側で落とす設計と、店名のローマ字を巻き込まない条件
AIに書かせた文章に英語が混ざるときの止め方|プロンプトで直さず出力側で落とす設計と、店名のローマ字を巻き込まない条件
お知らせ文、口コミへの返信の下書き、SNSの投稿文。店舗の文章をAIに自動で作らせる仕組みは、もう珍しくありません。人が1件ずつAIの画面に打ち込んで使うぶんには、変な出力はその場で気づいて作り直せます。問題は、プログラムからAIを呼び出して、出てきた文章をそのまま画面に出したり保存したりする使い方です。この形で運用していると、日本語の文章の最後に、突然英語の一文が付いてくることがあります。
先に結論を書きます。AIの出力に英語が混ざる問題は、プロンプト(AIへの指示文)の工夫だけでは止めきれません。生成された文章を使う直前に、「日本語の文字を1文字も含まない文だけを落とす」検査をプログラム側に入れるのが確実です。指示は確率を下げる手段、検査は結果を保証する手段で、役割が違います。両方入れて二重にします。
このとき「英字を含む文を落とす」という条件にしてはいけません。店名やメニュー名にローマ字が入っている店舗の文章が、正しいのに削られてしまうからです。落とすのは「日本語が1文字も無い文」だけ。この線の引き方が、この記事の中心です。
弊社は名古屋でホームページ制作と店舗向けの業務自動化を行っています。この記事では、美容サロン向けに文章の下書きを自動生成している仕組みで実際に確認された例をもとに、検査の条件、適用先ごとの扱いの違い、実装時の注意点を整理します。
【この記事でわかること】
- 「日本語で」と指示しているのに英語が混ざる理由
- 出力側の検査で落とす文・残す文の線引き
- 全部落ちてしまったときに空欄を出さないための扱い
- 検査を入れるときに起きやすい副作用(改行が消える)と確かめ方
- この方法では止められない混入パターン
結論:指示と検査は役割が違う。止めるのは検査のほう
AIへの指示文に「日本語で出力してください」と書くのは当然必要です。ただ、これは「お願い」であって「保証」ではありません。AIは指示に確率的に従うので、仮に1,000回のうち999回守っても、1回は外すことがあります。自動で毎日何十件も生成する仕組みでは、その1回は必ずいつか来ます。
| 手段 | できること | できないこと |
|---|---|---|
| プロンプトの指示 | 混入の確率を下げる | ゼロにする・混入した1件を止める |
| 出力側の検査 | 混入した文を表示・保存の前に落とす | 混入の確率そのものを下げる |
混入が1件見つかったとき、多くの場合はプロンプトを直す方向に進みます。「必ず」「絶対に」と言葉を強めたり、英語禁止を大文字で書いたり。それで発生率は下がるかもしれませんが、直ったかどうかは確かめようがありません。10回試して出なかったことは、11回目に出ない証明にならないからです。
一方、プログラムでの検査は、同じ入力に対して必ず同じ結果を返します。テストが書けて、通ったことを確認できます。お客様の目に触れる文章を扱うなら、最後の関門は確率で動くものではなく、決まった動きをするものに任せるのが安全です。
実例:末尾の一文だけが英語で締められる
弊社が運用している美容サロン向けの仕組みに、来店後アンケートの回答をもとに文章の下書きを作る機能があります。ここで確認されたのが、日本語の文章の最後に、次の一文が付いた下書きでした。
the overall experience was good.
プログラムに固定で書かれた文言ではありません。指示文には「本文だけを日本語で出力してください」と明記してあり、それでもAIが最後の一文だけ英語で締めた、という出方です。長い日本語を書いたあと、締めくくりの部分で言語が切り替わる。弊社で確認されたのは、この「末尾だけ英語」の型でした。
この一文には、もう1つ問題があります。意味は「全体として良い体験だった」ですが、元のアンケート回答にそういう評価は書かれていませんでした。指示文には「回答に明記されていない感想や評価を足さない」という項目もあり、英語の一文は言語の指定と内容の指定の両方に反していたことになります。英語の混入は見た目の違和感だけでなく、指示から外れた内容が紛れ込んでいるサインでもある、という点は覚えておく価値があります。
見つかった時点で行ったのが、影響範囲の実測です。すでに外部に公開されていた本文あり434件を全件走査し、英語の混入は0件でした。外に出る前の下書きの段階で見つかったわけですが、これは一覧で文章を目視できる画面があったからで、件数の集計だけを見ていたら気づけません。生成文を人が読める場所を用意しておく意味は、店舗アンケートは「集める器」より先に「読む器」を決めるでも書いています。
なお、検査を後から入れても、すでに保存済みの下書きは直りません。検査は「これから生成される分」にしか効かないので、保存済みのデータは別途走査して確認する必要があります。
落とす文・残す文の線引き
検査の中身は単純です。
- 生成された文章を、句点(。!?)の直後で文に区切る
- それぞれの文に、ひらがな・カタカナ・漢字が1文字でも含まれるかを見る
- 1文字も含まない文だけを落とす
- 残った文をつなぎ直す
大事なのは2と3の条件です。「英字が含まれていたら落とす」ではなく、「日本語が1文字も無ければ落とす」にします。
| 文の例 | 判定 | 理由 |
|---|---|---|
| the overall experience was good. | 落とす | 日本語の文字が1文字も無い |
| HAIR SALON ABCさんで染めてもらいました。 | 残す | 英字はあるが日本語も含む |
| 仕上がりはとてもGoodでした。 | 残す | 日英が混在した文は正しい日本語文として扱う |
| 2回目です。 | 残す | 数字があっても日本語を含む |
美容室は、店名がローマ字表記の店舗が少なくありません。メニュー名にも「Wカラー」「SPAコース」のような英字が普通に入ります。「英字を含む文を落とす」にすると、こうした店舗の文章から、店名の入った一番大事な文が消えます。しかも店名が日本語の店舗では問題が出ないので、テストで気づかず、特定の店舗でだけ文章が不自然に短くなる、という見つけにくい不具合になります。
考え方を示す最小の例を載せます(JavaScript)。
// ひらがな・カタカナ・漢字のいずれか
const JA = /[\u3040-\u30ff\u3400-\u9fff]/;
function dropNonJapaneseSentences(text, { keepWhenAllDropped = false } = {}) {
// 句点の直後で区切る(句点は前の文に残す)
const sentences = text.split(/(?<=[。!?])/);
// 日本語を1文字も含まない文だけを落とす
const kept = sentences.filter((s) => s.trim() === "" || JA.test(s));
const result = kept.join("").replace(/[ \t ]+$/gm, "");
// 全部落ちた場合に、元の文章を返すかどうかを呼び出し側が選べるようにする
if (result.trim() === "" && keepWhenAllDropped) return text;
return result;
}
この例で「白髪がきれいに染まりました。また伺います。the overall experience was good.」を通すと、英語の一文だけが落ちて、日本語の2文が残ります。店名に英字が入った文はそのまま残ります。
全部落ちたときの扱いは、適用先ごとに変える
検査を入れるときに見落としやすいのが、「全部の文が落ちたらどうするか」です。AIが丸ごと英語で返してきた場合、検査を通すと結果は空になります。空の文章をそのまま画面に出したり保存したりすれば、英語が混ざるより目立つ不具合になります。
弊社の仕組みでは、検査の適用先が3つあり、扱いを分けています。
| 適用先 | 全部落ちたとき | 理由 |
|---|---|---|
| お客様に見せる文章の下書き | あらかじめ用意した定型の日本語文に切り替える | お客様がそのまま目にする。空欄も英語も出さない |
| Googleビジネスプロフィールの投稿文 | 同上 | 空の投稿文を作らない |
| 口コミへの返信の下書き | 落とさず元の文章をそのまま残す | 英語の口コミに英語で返す場面がありうる。送信は人が行う |
3つ目が判断の分かれ目です。口コミは英語で書かれることもあり、その場合は英語で返信するのが自然です。ここで無条件に英語を落とすと、返信欄が丸ごと空になります。混入よりも重い事故です。一方で、返信は自動では送信されず、人が内容を確認してから送る運用にしています(この運用の考え方は口コミ返信をAIに書かせてよいかにまとめています)。人の目が1回入ってから外に出る場所は検査を緩く、生成した文章がそのまま相手の目に触れる場所は検査を厳しく。同じ検査でも、後ろに人がいるかどうかで強さを変えるのが基準です。
上のコード例で keepWhenAllDropped という選択肢を用意しているのは、このためです。
実装で起きやすい副作用:改行が消える
検査のような「文章を加工する処理」を足すときは、目的以外の部分を壊していないかを必ず確かめます。このケースで起こりうるのは、改行の消失です。
文を区切ってつなぎ直す処理では、各文の前後の空白を取り除きたくなります。このとき、プログラミング言語に用意されている「先頭の空白を削る」機能(JavaScriptなら trimStart())をそのまま使うと、半角スペースだけでなく改行も空白として削られます。段落を改行で区切った投稿文を通すと、段落が全部つながって1つの塊になります。
やっかいなのは、この不具合が英語混入のテストでは見つからないことです。「英語の文が落ちること」「店名の文が残ること」を確かめるテストは全部通ります。短い1行の文章でテストしている限り、改行は登場しないからです。実際に使われるデータの形、つまり改行で段落分けされた数百字の文章を通して初めて分かります。
対策は2つです。
- 空白を削るときは、対象を半角スペース・タブ・全角スペースに限定し、改行は対象に含めない
- 「改行を含む文章を通しても、改行の数が変わらない」ことを確かめるテストを足す
弊社の例では、この検査の追加にあわせて自動テストを91件から105件に増やし、改行が保たれることを確かめるテストもその中に含めました。検査を足すときのテストは、「止めたいものが止まること」だけでなく、「落としてはいけないものが残ること」の側を意識して厚くします。
本番への反映後は、本番環境の上で関数を直接呼び出して、英語の文が落ちること・店名入りの文が残ることを実測しています。このとき、実際のアンケート回答の流れには通していません。確認のためのダミーデータが、本物の集計に混ざるのを避けるためです。
ついでに見直す:AIの出力に付いてくる余計なもの
英語の混入を調べると、同じ場所でほかの「余計な出力」も素通りしていることに気づく場合があります。プログラムからAIを呼んで文章を受け取るとき、付いてきやすいのは次のようなものです。
- 「返信本文:」「以下が下書きです。」のような前置きやラベル
- 文章全体を囲むかぎ括弧や引用符
- コードを示すための記号(バッククォート3つ)で文章全体が囲まれている
これらも、指示文で「本文だけを出力」と書いていても確率的に付いてきます。弊社の仕組みでも、英語混入の確認の過程で、返信の下書きを作る箇所には出力の後処理が1つも入っていないことが分かり、あわせて追加しました。AIを呼び出している箇所が複数あるなら、出力を受け取った直後の処理が全箇所でそろっているかを一覧にして確認しておくと、抜けが見つかります。
「確率で動く部分」と「決まった動きをする部分」を分けて設計する考え方は、文章生成に限りません。数値の計算を伴う業務での分け方は、AIに在庫管理を任せるときの設計で扱っています。
この方法では止められないパターン
この検査には限界があり、把握したうえで使う必要があります。
日本語の文と文の間に挟まった英文は落ちません。たとえば「染まりました。The staff was kind. また伺います。」という文章は、そのまま通ります。英文は半角のピリオドで終わるため、句点(。)で区切る方式では、英文と後ろの日本語が1つの塊として扱われ、「日本語を含む文」と判定されるからです。
半角ピリオドでも区切れば落とせますが、そうすると「人気No.1メニュー」のような表記や、URL、小数点を含む文を途中で切ってしまい、正しい日本語文を壊すおそれが出てきます。英語の口コミへの返信に日本語を添えた、英日併記の文章も壊しかねません。弊社では、実際に確認された型が「末尾を英語で締める」だったことから、現時点では句点のみで区切り、中間への混入が実例として出た時点で区切り方を見直す、という判断にしています。起きていない問題のために、正しい文章を壊すリスクを先に取りに行かない、という順番です。
もう1つ、この検査が見ているのは「言語」だけです。日本語で書かれた、事実と違う内容や、指示にない感想の付け足しは通ります。内容の正しさは別の手段、つまり指示文での制約と、人が読める画面での定期的な目視で見ていく必要があります。
よくある質問
Q. ChatGPTの画面で人が使っているだけですが、この対策は必要ですか?
不要です。人が画面で出力を読んでから使う場合は、その人が検査の役割を果たしています。必要になるのは、プログラムからAIを呼び出し、出力を人が読まずに表示・保存・送信する仕組みを持っている場合です。外部の制作会社やツールに任せている場合は、「AIの出力をそのまま出していないか、間に検査があるか」を確認する質問として使えます。
Q. 指示文を英語で書くと混入しやすくなりますか?
そう言われることはありますが、弊社では比較検証をしていないため、断定はできません。確かなのは、弊社の例が、指示文が日本語で、日本語での出力も明記していた状態で起きている、ということです。指示文の言語にかかわらず、出力側の検査は必要だと考えてください。
Q. 英語以外の言語が混ざる場合にも効きますか?
「日本語の文字を含まない文を落とす」という条件なので、英語以外のアルファベットの言語やハングルなどの文も同じように落ちます。中国語は漢字を含むため、この条件では落ちません。中国語の混入が実際に問題になる場合は、ひらがな・カタカナを含むかどうかで判定する、といった条件の見直しが必要になります。
Q. 混入した文を落とすのではなく、AIに作り直させるのはどうですか?
作り直しは有効ですが、作り直した結果もまた確率で決まります。作り直しを採用する場合でも、最終的に外へ出す直前の検査は残してください。また、作り直しは生成の回数が増えるぶん、費用と待ち時間が増えます。末尾の一文を落とせば成立する文章なら、落とすほうが速く確実です。
まとめ
- 「日本語で出力」の指示は確率を下げるだけ。混入した1件を止めるのは、出力側の検査の役割
- 落とす条件は「英字を含む文」ではなく「日本語を1文字も含まない文」。店名やメニュー名がローマ字の店舗を巻き込まない
- 全部落ちたときの扱いは適用先ごとに決める。生成文がそのまま相手の目に触れる場所は定型文へ切り替え、人が確認して送信する場所は元の文章を残す
- 文章を加工する処理は改行を消しやすい。実際のデータの形(改行あり)で通して確かめる
- 文の途中に挟まった英文や、日本語で書かれた内容の誤りは、この検査では止まらない。人が読める画面での目視と併用する
弊社では、店舗向けの文章生成や業務の自動化について、仕組みづくりと既存の仕組みの見直しを承っています。「AIで文章を自動で作っているが、おかしな出力が出ていないか確かめる手段がない」「外注先が作った仕組みの中身が分からない」といった段階からご相談いただけます。