🤖

なぜあなたのLLMはうまくタスクをこなせなかったのか

に公開

LLMがタスクに失敗したとき、なぜ失敗したのかを理解できれば、適切な対策が取れます。「プロンプトをいじくり回してもうまくいかない」「何度も同じ失敗をする」 そんな経験はないでしょうか?

この記事では、よくある失敗パターンを「原因」で整理します。

  • 知識不足
  • 指示の曖昧さ
  • 推論の複雑さ
  • 容量の限界

本文中ではそれぞれの特徴と対策について説明します。

もっと手頃なTipsを求めている方はうまく頼むコツについての基本は過去記事もご利用ください。

LLMはどう動くのか

LLMは学習によって獲得した知識を持っています。ここでは、LLMが知っている情報の範囲を「知識空間」と呼びます。

(技術的には、学習で獲得した知識がモデル内部に表現されたものですが、ここでは直感的に「LLMが答えられる範囲」と考えてください)

LLMはプロンプト(タスク)を受け取ると、広い知識空間の中から、入力に関連する部分へと絞り込んでいきます。絞り込んだ知識をもとに、確率的にトークンを生成して、出力します。

このとき、タスクの成功/失敗を以下のように考えます。

  • 成功: LLMの出力が、期待される答えに含まれている(数式で書くと output ∈
    A)
  • 失敗: LLMの出力が、期待される答えから外れている(output ∉ A)

これを別の見方で表現すると、LLMはプロンプトを受け取って出力を返す、関数のような操作をしている、と捉えられます。
(output = f(prompt) のようなイメージ。ここでfは知識空間を内包したモデル)

ここで、期待される答え(A)も集合です。
たいていの場合、LLMにやらせるタスクは複数の答えがあります(文章なら言い回しが変わっても許容できる、など)。完全に1つに定まることを期待する場合もありますが、それは要素数1の集合として扱えます。

失敗の分類

知識がモデルに存在しない(知識空間外にある)

LLMの知識空間は、学習データから獲得されます。しかし、世界に存在する情報すべてを学習できるわけではありません。

世界の情報空間 ⊃ LLMの知識空間

つまり、世界には存在するが、LLMは知らない情報があります。

例:

  • 「わたしの親の名前は?」→ 世界には存在するが、学習データにない
  • 「2025年1月以降のニュース」→ 学習データのカットオフ後
  • 「あなたの会社の内部文書」→ データとして存在するが、公開されていないため学習データに含まれていない

モデルが持っている知識空間に答えがない(知識空間外部に答えが存在する)場合、正しい答えを出すことはできません。

対策:

  • RAGやMCPなどの仕組みで、外部から情報を動的に追加することで答えられるようになることがある

指示が不十分で知識を絞り込めない

知識空間に答えは存在するのに、不十分な指示によりうまく絞り込めないケースです。

例:

  • 「レビューを書いて」→ 製品?書籍?論文?トーン?が曖昧
  • 「それについて説明して」→「それ」が何を指すか不明
  • 「去年の売上データを分析して」→ どの製品?どの地域?どんな分析?

なぜ失敗するか?

  • 指示が不足している・曖昧であるため、知識空間のどの部分に注目すべきか定まらない
  • f(prompt)で考えると、promptに必要な情報が不足している(適切でない)という状態
  • モデルの絞り込み能力(推論能力)が不足している場合もある

対策:

  • 指示を具体的に、明確にする(例:「このPython書籍のレビューを、初心者向けに書いて」)
  • Few-shotで求める出力のイメージを示す(例:トーン、形式、判断基準を例示)
  • 関連する情報をプロンプトに含めて、絞り込みを助ける
  • Chain of Thought(CoT)などで段階的に推論させる

推論の経路が見つからない

このパターンは、他のパターンとは少し性質が違います。
「知識がない」のではなく、必要な情報や概念は知っているのに、それらを組み合わせて答えを導けない状態です。

知識空間を絞り込んでいく過程を「経路を辿る」と考えると、このパターンでは、その経路が長く複雑すぎて、ゴール(正解)にたどり着けない状態と言えます。

TODO: 図

例:

  • 「AはBより速く、BはCより速い。最も速いのは?」
    → 比較の概念は知っているが、逐次的な推論に失敗してCを選ぶ
  • 「2 + 3 + 5 + 8 + 13 = ?」
    → 足し算の方法は知っているが、多段階計算で迷う
  • 「この5つの条件を全て満たす解は?」
    → 各条件の意味は分かるが、多段階の論理チェックができない

なぜ失敗するか?

  • LLMは1トークンずつ確率的に生成していくため、「長い推論」は苦手
  • 推論チェーンが長すぎて、途中で道に迷う
  • 中間状態を保持しきれない
  • 確率的に逸脱してしまう(トークン生成の性質上)

対策:

  • Chain of Thought(CoT)で「考える手順」を明示的に書かせる
    • 例:「1. 条件を整理し、2. 順に比較し、3. 結論を述べて」
  • 問題を小さく分割して、段階的に解く

入力や思考が収まりきらない(トークン数の制限)

LLMには一度に処理できる情報量の上限があります。
これは「トークン数」という単位で測られ、文字数のようなものと考えてください。
(この上限は「コンテキストウィンドウサイズ」とも呼ばれます)

入力(プロンプト + 会話履歴 + 渡した文書など)と、LLM内部の思考(Chain of Thoughtなど)を合わせて、この上限を超えると、情報が切り詰められたりエラーになったりします。

例:

  • 長大な文書全体を読んで要約してほしい → 途中で切れる
  • 長い会話履歴の中で最初の情報を参照してほしい → 古い情報が削られている
  • 複数の大きなファイルを同時に分析してほしい → 入りきらない

なぜ失敗するか?

  • トークン数の物理的制限(技術的制約)
  • 知識の問題でも推論の問題でもなく、容量の問題

対策:

  • 情報を要約・圧縮してから入力する
  • 問題を分割して、複数回に分けて処理する
  • RAGなどで必要な部分だけを動的に取得する
  • より大きなトークン数上限を持つモデルを使う

補足:その他の失敗パターン

上記以外にも、以下のような失敗パターンがあります:

学習データの偏り(バイアス):
知識はあるが、学習データの偏りにより、出力確率が特定の立場や視点に寄ることがあります。
例:「〇〇は良いか?」という質問に対して、データの偏りにより一方的な視点で答える。

複数文脈の競合:
質問が複数の意味を持ち、どの文脈を優先すべきか判断できない。
例:「PythonでAPIを作るいい方法は?」→ フレームワーク選定?設計パターン?セキュリティ?

出力形式の制約を守れない:
内容は正しいが、指定された形式(JSON、文字数制限など)を守れない。
学習データに類似例が少ない場合や、複雑な制約を保持しきれない場合に発生。

失敗の表れ方から原因を探る

原因については整理できたので、よくある症状と原因をつなげて考えてみましょう。

存在しない情報を答える(ハルシネーション)
存在しない論文を引用したり、架空の統計データを示したりする。
→ 主な原因: 知識不足(知らないことを無理やり答えようとする)
→ 他の原因: 絞り込み失敗、推論失敗で関連性の低い情報を引き出している場合も

曖昧・抽象的な答えになる
「いろいろな方法があります」「状況によります」と繰り返すだけで、具体的な結論を出さない。
→ 主な原因: 指示が不十分で絞り込めない
→ 他の原因: 知識不足で自信がない場合も

途中で諦める・話題が逸れる
計算や論理的推論の途中で間違えたり、関係ない話題に飛んだりする。
→ 原因: 推論の経路が見つからない

情報が欠落・切れる
長文の最初の方が抜けたり、会話履歴の古い情報が消えたりする。
→ 原因: トークン数オーバー

診断フロー

段階的な診断により原因を絞り込めることがあります。

  1. 外部情報を追加 → 改善したら「知識不足」
  2. 指示を具体化 → 改善したら「絞り込み失敗」
  3. 問題を分割 → 改善したら「推論失敗」またはトークン数オーバー
  4. 複数回実行 → 毎回違う答えなら「絞り込み失敗」、一貫して間違いなら「知識不足」

原因は複数重なっていることもあるので、段階的に試していくのがおすすめです。

まとめ

LLMがタスクをこなせなかったとき、闇雲に再試行するのではなく、
なぜ失敗したのかを考えることで、効果的な対策が見えてきます。

この記事で紹介した分類は、その「なぜ」を整理するためのフレームワークです。
完璧な分類ではありませんが、失敗への対処を考える手がかりになれば幸いです。

失敗の原因は複数重なっていることもあるので、ひとつずつ試しながら、
自分なりの「LLMとの付き合い方」を見つけていってください。

NCDCエンジニアブログ

Discussion