スマホ 1 台を回して 3〜8 人で遊ぶパーティーゲームのサイト (mawashite.com) で、ゲームが読み上げる「お題」を単語の組み合わせで機械生成しています。お題を 1 つずつ手で書く方式では物量が続かなかった (40 個書いても遊ぶ側はその晩に一周します) ためで、組み合わせ生成で物量は解決しました。代わりに、公開前の審査——生成されたお題が実在の言葉とぶつかっていないか、学校でも使えるかの検査——が、問題のある語を削っても削っても終わらなくなりました。
審査が終わらない原因を追うと、3 つに分解できました。審査の単位が生成空間になっていなかったこと、生成物がぶつかる相手の集合が開いていたこと、審査する側が較正されていなかったことです。特に 2 つ目が効いていて、語を 1 つずつ削る作業に終わりがあるかどうかは、衝突相手の一覧を手元で引けるかどうかで最初から決まっていました。
以下、生成の仕組み、審査が収束しなかった事例と 3 つの原因、収束条件の一般化の順で書きます。生成コンテンツのモデレーションや、LLM にレビューをさせる開発フローを持つ人向けです。
生成の仕組み: 1 デッキ 40 語とパターン数本で 1600 通り
お題のデータ (デッキと呼んでいます) が持つのは、穴あきのパターンと、はめ込む単語 2 組だけです。単語は各 20 個あり、長いので抜粋します。
{
"title": "架空のことわざ",
"patterns": ["{a}に{b}", "{a}より{b}", "{a}の上にも{b}", "{a}の夢に{b}"],
"slotA": ["猫", "タコ", "カラス", "亀", "犬"],
"slotB": ["靴下", "ラーメン"]
}
はめ込む処理はこれだけです。
export function composeTopicText(pattern: string, a: string, b: string): string {
return pattern.replaceAll('{a}', a).replaceAll('{b}', b);
}
各スロット 20 語でパターンが 4 本なら 4 × 20 × 20 = 1600 通り。組み合わせ型のデッキは 10 本あるので、手書きは計 400 語ほどなのに、生成されるお題は合計 11,600 通りになります。
お題は人前で読み上げられるので、公開前に 3 つの観点 (実在の作品や言葉との衝突・組み合わせ事故・学校でも使える健全さ) で審査しています。審査役は人ではなく LLM です。開発に使っているエージェントに独立したレビュー役を立てて反証させ、出てきた指摘を僕が判定して語を差し替え、また審査に戻す——この往復を 1 巡と数えます。この記事の「収束しない」は、この巡回で指摘が毎回新しく生成され続けるという意味です。
原因 1: 審査の単位が語リストのままで、生成空間になっていなかった
最初の失敗は審査の単位です。40 語のリストを縦に読んで「大丈夫そう」と言ってしまったのですが、人前に出るのは 40 語ではなく 1600 通りのほうでした。単語単体では無害でも、組み合わさった瞬間に既存の言葉と一字一句同じになることがあります。{a}に{b} というパターンで slotA に「猫」、slotB に「小判」がいれば「猫に小判」が生成されうる。どちらも日常語なので、リストを読んでいる限り気づけません。
1600 通りを機械で全部並べること自体は、上の関数を三重ループで回すだけなので一瞬です。難しいのは 1 行ずつ「これは危ないか」を判定するほうで、コストは行数に比例します。だから実際の審査は、危ない組を先に思いついて確かめる形になる——そしてこの列挙には、尽きたかどうかを判定する方法がありません。思いつけた組しか挙がらないので、「小判は塞いだ」は「同種の穴が他にない」の証拠にならない。この不完全さが、後で構造の対処に寄せる理由になります。
なお線引き自体は「見た人が特定の作品や行事を 1 つ名指しできるか」に置いています。ジャンルとして似ているだけなら通す。ジャンルの類似まで弾いてしまうと、日常語で組む方式そのものが成立しないためです。
原因 2: ぶつかる相手の集合が開いていた
原因 1 が「どこを見るか」の失敗だったのに対し、2 つ目の原因は「見た先の作業に終わりがあるか」の話です。いちばん時間を溶かしたのは「架空のマナー・作法」のデッキで、パターンは {a}の{b}方、slotA は日用品でした。ここから「傘のたたみ方」「けん玉の選び方」が出てきます。架空でも何でもない、実在する手順です。
実在の手順を落とすときの判定基準は「知っている人がその場にいたら、ゲームが成立しなくなるか」です。このお題を配る 知ったかリレー は、実在しないお題を全員が知ったかぶりで解説するゲームで、誰も本当のことを知らないからこそ全員が対等にでっち上げられます。お題が実在すると、たまたま知っている人が正解を言い、知らない人だけが恥をかく。話すのが得意でない人を守る土台が、そこだけ外れます。だから面白さの問題ではなく土台の問題として落とします。
指摘された語を外すと、次の巡で別の語から同じことが起きました。外してはまた出る。これを 4 巡繰り返しても収束しませんでした。原因は語ではなくパターンです。◯◯の△△方 は手順を生成するパターンで、主語が実在の物である限り実在の手順を生む。日用品の扱い方は、世の中の誰かが必ず書いているからです。
ここで効いている軸は「もの か 手順 か」ではなく、ぶつかる相手の集合が閉じているか、開いているかだと考えています。実在のことわざは有限で、辞書として引けます。だから「猫に小判」型の衝突には終わりが定義されている。一方「◯◯の扱い方」は誰でも今日新しく書けるので、集合が開いていて、語を削る作業に終わりが定義されていません。4 巡で終わらなかったのは根気の問題ではなく、この構造でした。
付け加えると、閉じていれば済むわけでもありません。条件は有限性ではなく「手元で引ける参照があること」です。別のゲームで架空の単語を手で作ったときは、造語が実在の語や人名と 3 連続で衝突しました。日本語の語彙は有限でも、突き合わせられる一覧が手元になければ想起で尽くすしかない。このときは候補を 1 つずつ検索にかける手順を挟んで、初めて回るようになりました。
対処はパターン側の書き換えです。{a}{b}の作法 に変え、日用品と行事の合成語で存在しない行事を作る——「輪ゴム朝礼の作法」「バケツ面接の作法」。その組み合わせ固有の作法を書いた文献は存在しないので、ぶつかる相手がほぼ消えます。パターンは 1 行の変更ですが、slotB は行事の語への総入れ替えなので、実際には語彙設計のやり直しでした。それでも原理的に安全になったわけではありません。日本語の複合語は右側の語が意味の中心になる (「バケツ面接」はバケツではなく面接の一種と読まれる) ので、「面接の作法」が実在して広く知られている以上、詳しい人がそれらしいことを喋れる余地は残ります。発生率を下げた、が正確なところです。
原因 3: 審査する側も、較正しないと発散する
収束しなかったデッキがもう 1 本あります (こちらは組み合わせ生成ではなく、状況文を手で書く別ゲームのものです)。原因は逆側、審査する側にありました。「問題を見つけよ」とだけ指示された審査役は、巡を重ねるごとに新しい連想の鎖を発明します。「定規」という語から体罰を、「扇風機」と「就寝」の組から都市伝説を連想する、という具合に、3 段以上の仮定を積めばたいていの語は何かに繋がります。
原因が対象側ではないと見当を付けられたのは、同じデッキを同じ条件で見ていた他の 2 観点 (実在作品の想起、組み合わせ事故) がどちらも収束していたからです。デッキが本当に危ないなら全観点が荒れるはずです。厳密には「荒れた観点の指示文だけが元々曖昧だった」可能性も残りますが、どちらの仮説でも直す場所は審査側の指示文なので、切り分けはここまでで足ります。
効いたのは、指摘に「対処不要」の等級を用意することでした。逃がし先がないと、審査側は懸念を全部「要対処」に格上げして出してきます。そのうえで「普通のプレイヤーが制限時間内に自然に到達する解釈だけを対処対象にする」と線を引き、3 段以上の連想は記録だけ残して進む。較正後の再審査で、同じデッキは 1 巡目で通りました。これは見逃す側に寄せた判断で、線の過剰適用と、読み直されない記録の山という負債を抱えたままです。
考察: 閉じた集合は機械照合に落とせる
閉じているか開いているかの軸は、判定基準である以上に、完全性チェックを実装できるかどうかの差として効きます。相手が引ける形で閉じているなら、11,600 通りを全部並べてことわざ一覧と突き合わせれば、少なくとも一覧と同一表記の衝突については「同種の穴が他にない」を言い切れる (表記ゆれや近似一致まで含めるなら照合の設計がもう 1 段要ります)。原因 1 で書いた「列挙は尽きたか判定できない」という不完全さが、この観点についてだけ消えます。開いた集合には突き合わせる相手がいないので、何巡回しても言い切れません。
いまの実装はそこまで届いておらず、デッキの検証はパターンに {a} と {b} が両方あることくらいしか見ていません。ただし届かせられる範囲ははっきりしていて、辞書照合もパターン変更の検知も、閉じたデッキについては書けます。届かないのは開いたデッキだけ。この非対称が分かったことが、4 巡の収穫でした。
まとめ
生成コンテンツの審査が終わらないときは、対象の語を眺める前に 3 つを疑うのが良い、というのがこの経験の持ち帰りです。審査の単位が生成空間になっているか。生成物がぶつかる相手の集合は、手元で引ける形で閉じているか——開いているなら語の除去では終わらず、直すのは生成パターンのほうです。そして審査側に「対処不要」の逃がし先と線引きを渡してあるか。ここで作った 11,600 通りは 知ったかリレー と、姉妹作の 知ったかグルメ (実在しない料理を知ったかぶりで解説するゲーム) で実際に配られています。