句読点で指示が分断される/前文が飛ぶ問題を直した話(プロンプト設計の学び)
$user_prompt .= "カテゴリから関連キーワードを10個生成して、その中からランダムにテーマを決めてください( bodyの最後の段落の直後に、関連キーワードの10個を表示してください)。\n";
下記のプロンプトが最初に実行していたプロンプトだ。このプロンプトでは、関連キーワードはうまく生成されていてもランダムに選択する指示をしても偏りが発生した。下記の画像がスポーツカテゴリで起きたテーマ(タイトル)の偏りだ。OpenAIの日本語解析方法に疑問を感じた出来事であった。

ChatGPTにまとめ記事を書いてもらった。
Pinpoint 開発メモ
句読点で指示が分断される/前文が飛ぶ問題を直した話
自動投稿のプロンプトで「ランダムに選んでるはずなのに偏る」「最初の文章が飛ぶ」現象が出たので、 原因を“日本語の指示構造”として整理し、安定させた手順をまとめます。
起きていた症状
- 「ランダムにテーマを決める」と書いているのに、特定テーマ(例:ランニング)に偏る。
- 導入や前文の指示が、出力から抜け落ちる(最初の文章が飛ぶ)。
- カテゴリによってはうまくいくが、特定カテゴリで偏りが顕著に出る。
原因の本体:句読点が“かかり先”を曖昧にする
日本語で「Aして、その中からBして…」のように句読点で繋ぐと、BがAに掛かるのか別工程なのかが曖昧になります。 人間は文脈で補完できますが、モデルは「自然に読める解釈」を選びやすく、結果として工程が入れ替わったり、 注意事項が想定外の工程に掛かったりします。
ポイント
句読点そのものが悪いのではなく、指示の“適用範囲”が句読点でズレることが問題。 このズレが、偏りや分断の起点になりました。
もう一つの原因:強い制約が前文を上書きして“飛ばす”
複数の指示が同時にあると、モデルは破綻しない出力を優先して、後ろの強い制約(出力形式・末尾表示・禁止事項など)を守るために、 導入や前段の説明を省略することがあります。結果として「最初の文章が飛ぶ」現象が起きます。
- 末尾に必須要素がある(例:関連キーワードの表示)
- 重複回避や禁止事項など、遵守の圧が高い
- 出力形式が曖昧で、省略の余地が残っている
対策:工程を番号で固定し、参照範囲を明示する
分断を止めるには、自然文で“つなぐ”のをやめて、工程を番号で固定し、各工程の入力・禁止事項・選択対象を明示します。 特に効いたのは「どの集合から選ぶか」を確定させる書き方でした。
- 最初に10個を生成(この10個を“候補集合”として確定)
- 注意事項は重複回避の判定にだけ使う(範囲を固定)
- 選択は“最初に生成した10個の中から”(選択対象を固定)
- 出力順を固定(LEAD/TITLE/BODY/関連キーワード等)して省略余地を潰す
今回の学び(要点)
- 句読点で繋ぐほど、指示の“かかり先”がズレる。
- 後段の強い制約があるほど、前段の文は省略されやすい。
- 番号・範囲・禁止事項で一本道にすると安定する。
採用したプロンプト(差分の核)
「注意事項のタイトル一覧を読んで、最初に生成した10個の中から重複しないテーマを選択する」 と明記したことで、注意事項がキーワード生成に誤って掛かる解釈を減らし、分断を抑えられました。
$user_prompt .= "カテゴリから関連キーワードを最初に10個生成します。その中から下記の注意事項に従ってランダムにテーマを決めてください( bodyの最後の段落の直後に、関連キーワードの10個を表示してください)。\n";
$user_prompt .= "※注意事項\n";
$user_prompt .= "下記の10個のタイトル一覧を読込んで最初に生成した10個の中から重複しないテーマを選択してください。\n";
$user_prompt .= "直近タイトル一覧:\n{$recent_titles_text}\n";
重要なのは「最初に生成した10個」が候補集合として固定されること。これにより、選択工程が暴れにくくなります。
まとめ
“ランダムが偏る”問題は、乱数そのものよりも、前段の候補集合が偏る・指示が分断される・強い制約が前文を上書きする、 という日本語プロンプト設計の問題として発生しやすいことが分かりました。 工程の番号化と、参照範囲・選択対象の固定で、挙動はかなり安定します。
上の記事にもあるが、最終的に下記のプロンプトに落ち着いて様子を見ている。これでうまくいってほしい。
$user_prompt .= "カテゴリから関連キーワードを最初に10個生成します。その中から下記の注意事項に従ってランダムにテーマを決めてください( bodyの最後の段落の直後に、関連キーワードの10個を表示してください)。\n";
$user_prompt .= "※注意事項\n";
$user_prompt .= "下記の10個のタイトル一覧を読込んで最初に生成した10個の中から重複しないテーマを選択してください。\n";
$user_prompt .= "直近タイトル一覧:\n{$recent_titles_text}\n";
