はじめに
ChatGPT をはじめとする大規模言語モデル (LLM) は、その驚異的な文章生成能力や対話能力で、私たちの仕事や生活に大きな変化をもたらしています。しかし、その動作原理は、基本的にはただ 「次に来る単語 (トークン) を予測している」 だけです。この原理だけでこれほどの能力が発揮されることを予想していなかった専門家も多く、業界に衝撃を与えました。
一方で、いかに賢そうに見えても「次の単語予想マシン」であるが故の不得手が存在します。本記事では、好ましくない性質が顕著に現れる実例を示し、LLMをうまく使いこなすための対策について解説します。
簡単な原理の説明
大規模言語モデル (LLM) は、文字通り “言語モデル” のうち大規模なものを指します。
言語モデルは、入力された文脈に基づいて、次に来る確率が最も高い単語を予測し、出力します。1
(厳密には、言語モデルとは単語の並びがどれくらい自然かを計算するモデルであり、次の単語の予測はその応用の一つです。)
例えば “This is a” という単語列があった時、言語モデルは語彙中の全ての単語に対して「この次にその単語が来る確率」を予測し、確率の高い単語を一つ選びます。
日本人が言語モデルだとしたら “pen” を選ぶでしょう。アメリカ人言語モデルがどうだかは知らないですが、 “book” など、いろいろ選び方はありそうです。一方で、直前の単語が “an” ではないので “apple” は選ばれないでしょうし、そもそも名詞ではない “have” などは選ばれないはずです。
ただそれだけなのですが、1,000,000,000 個レベルのパラメータを持つ大規模な言語モデル (= LLM) を持ってきて精度良く予測すると、人と区別するのが難しいほど流暢に人の言葉を話すようになるというのが LLM における発見です。
LLM の化けの皮の剥がし方
LLM の活用術に Chain-of-thought (CoT) というものがあり、LLM に依頼するタスクを step by step で細かく実行できるように分解してあげるとタスクの遂行精度が上がります。
これは逆に考えると、LLM は 論理の飛躍に弱い ことを示しています。
また、一度出力を確定するとそれを前提として次の単語を生成するので、 うっかり間違ったことを生成してしまうとそのまま暴走してしまう 傾向があります。
これは “ハルシネーション” (幻覚) と呼ばれています。
つまり、LLM の “思考” 順序に逆らった順序で出力をさせれば簡単に馬脚を現します。
実例
ここでは、テキストから何らかの条件で該当箇所を抜き出すタスクをさせたいとしましょう。
抜き出した箇所がテキストに複数回出現する事案が発生したので、区別できるように抜き出した部分の前や後ろも一緒に抜き出してもらうようにしたという設定を加えます。
以下のプロンプトで ChatGPT 4o にタスクを依頼します。
以下の文を読んで、国民主権について触れている部分を抜き出してください。その際、テキストの位置が機械的に特定できるよう、抜き出した部分より前10文字程度を prefix として抜き出してください。出力フォーマットは {"prefix": "あいうえおかきくけこ", "match": "たちつてと"} とします。
日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。
結果は以下の通りです。
以下が国民主権に関する記述とその前10文字の prefix を含めた抽出結果です:
[ { "prefix": "政府の行為によつて再び戦", "match": "ここに主権が国民に存することを宣言し" }, { "prefix": "そもそも国政は、国民の厳", "match": "粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する" } ]
ランダム性があるのでうまくいくこともありますが、何度かやるとこのように失敗するはずです。
なぜこうなるのでしょうか?
以下、 LLM の気持ちが正確に分かる訳ではないので、仮説ベースの話になります。
人間であれば、まず該当箇所を探して、該当箇所から 10 文字戻って prefix
を得ます。しかし LLM は次の単語の出力に集中するので、言わば 「該当箇所の prefix
」そのものをいきなり生成しようという発想を多かれ少なかれ持ってタスクにあたっている ような動作をします。
出力例の “思考” を再現するならば、「国民主権について述べている箇所の prefix
かあ、なんかこの辺で国民主権の話してるし大体この辺かな? あ、やべ 10 文字超えちゃった、こっそり本題に飛んじゃえ! 次はこの辺かな? あ、やべ、また 10 文字出力してる間になんか本題入っちゃってる、このまま match
出力しちゃお!」という感じでしょうか。
LLM にちゃんと働いてもらうために
では、このタスクを LLM を正確に行わせるためにはどうしたらいいでしょうか?
それは、先ほど行ったことの逆で、 LLM の “思考” の順序に沿う形でタスクを設計してあげる ことです。
実例
今回のタスクを例にとると、 JSON 出力の順序を prefix
→ match
から match
→ prefix
に変更するというのはいい案で、実際に効果があります。
しかし、 match
→ prefix
という順序はやや不自然な順序なので、 prefix
の代わりに suffix
(match
の後ろ) を出力するようにするのがさらに良い方法です 2。
以下の文を読んで、国民主権について触れている部分を抜き出してください。その際、テキストの位置が機械的に特定できるよう、抜き出した部分より後ろ10文字程度を suffix として抜き出してください。出力フォーマットは {"match": "あいうえお", "suffix": "かきくけこたちつてと"} とします。
(後略)
この変更により出力は以下のようになります。
以下が国民主権に関する記述と、その後ろ約10文字を含むsuffixを指定フォーマットで抜き出したものです:
[ { "match": "ここに主権が国民に存することを宣言し", "suffix": "、この憲法を確定する。" }, { "match": "その権威は国民に由来し", "suffix": "、その権力は国民の代表者がこれを行使し" } ]
LLM は文字を数えるのが苦手 3 なので 10 文字というのは正確には守られていませんが、先ほどの例と比べると圧倒的な安定感を感じます。
まとめ
LLM の “思考” 様式に逆らったプロンプトを与えるだけで、一見簡単に見えるようなタスクであっても LLM はこなせなくなることを示しました。
LLM がただの「次の単語予測マシン」であることを意識して指示を出すことで、 LLM を上手に活用して生産性を向上していきましょう。
また、 LLM が言うことを聞いてくれなかった時は「こいつは次の単語を予測してるだけのバカなんだ」と溜飲を下げることも生産性の向上に役立つはずです。
この記事が、読んでくださった方々の何らかの利益になれば幸いです。