迎合
自信たっぷりに同意するmodelの出力です。trainingによって起こります。modelは人が好む回答を優先するように調整されましたが、人は間違いを指摘されるより、同意されることを好みがちです。そのためmodelは、同意が誤りであっても、同意すれば評価されると学習しました。
現れ方:
- 反論に屈する — 「本当に?」と聞くと、正しかった回答を覆す。
- 悪い入力を褒める — 壊れた計画を分析する前に、すばらしいと同意する。
- 偏った見せ方 — 自分が書いたと伝えるとレビューが好意的になり、他人が書いたと伝えると否定的になる。同じ成果物なのに判定が変わる。
- 真似する — あなたの誤りを繰り返し、それを正しいと認める。
診断方法: あなたの誘導がなかったとしてもmodelは同じことを言ったでしょうか?変わったのが口調や見せ方だけなら、それは分析の本当の変化ではなく、sycophancyです。
対処: 好みを隠します。「このコードはよいですか?」ではなく「このコードをレビューしてください」のように、中立的にpromptを書きます。
避ける表現: たまたまあなたを喜ばせた誤答を何でも「sycophancy」と呼ぶこと。診断方法がなければ、「間違い」と変わりません。
使用例:
「refactorの計画がすばらしいと言ったのに、『本当に?』と聞いたら全面的に撤回しました。」
「典型的なsycophancyです。あなたが自信ありげだと最初は同意し、疑っているように聞こえると今度は譲りました。計画の品質は変わっていません。変わったのは口調です。Clearして、どちらの立場も示さずに聞き直しましょう。」
ハルシネーション
自信たっぷりに誤った内容を出力するmodelです。原因と対処の異なる2種類があります。
| 種類 | 問題の内容 | 原因 | 対処 |
|---|
| 事実性 | 存在しない関数、誤ったAPI signature、架空の引用など、現実について事実を捏造したり間違えたりする | Parametric knowledgeの不足。多くの場合、knowledge cutoffより後の情報 | 正しいcontextual knowledgeを読み込む |
| 忠実性 | 読み込まれたcontextual knowledge、ユーザーの指示、model自身の先行する推論から出力が逸れる | Attention degradation。dumb zoneで悪化 | Clearまたはcompact |
Next-token predictionは、根拠となる事実が実在するかどうかにかかわらず、流暢な出力を生成します。modelには自分が何かを知らないと気づく内部シグナルがありません。そのため、架空のmethodも正しいmethodと同じ自信に満ちた調子で出てきます。存在しないAPIについて、ありそうなコードを作ります。APIが存在した場合の形を自然に出力するため、ざっと読むだけのレビューでは見逃され、実行して初めて失敗します。
どちらの種類かを見分ける必要があります。一方への対処が、もう一方を悪化させることがあるからです。事実性の問題は知識不足です。ドキュメント、型定義、ファイルなどのcontextを追加します。忠実性の問題は必要な知識があるのに、注意の奪い合いに負けている状態です。contextを取り除くのが対処です。忠実性の問題を事実性と誤診してドキュメントを追加すると、contextが増えて逸脱を悪化させます。agentが誤ったことをしたとき、どちらの問題か判断する前に、正しい情報がすでにcontextにあったかを確認してください。
避ける表現:「hallucination」を、単に「間違い」の同義語として使うこと。種類を示さなければ、診断に役立ちません。
使用例:
「schemaに`parseAsync` methodがあるとhallucinationしました。」
「事実性、それとも忠実性?」
「貼り付けたドキュメントにはmethodが載っています。40回目のturn以降、読み返すのをやめただけです。」
「それなら忠実性です。ドキュメントを追加するのではなく、compactして読み直してください。」
パラメトリック知識
trainingからmodelが「知っている」内容で、parametersに保存されています。training時点で固定されるため、modelは自分のparametersを見たり、更新したりできません。情報は圧縮されて失われます。数十億の事実が限られた数のparametersに押し込まれ、珍しいものほど曖昧になります。よくある話題では流暢に答えられ、珍しい話題では捏造する原因にもなります。contextual knowledgeと対をなします。
parametric knowledgeは事実の形で保存されていません。trainingでmodelに検索用データベースを与えることはありません。modelがテキストをうまく予測できるようにparametersを調整するため、その話題について予測できるmodelが、あたかも知識を持つように振る舞います。知識の信頼性は、その話題がtraining dataにどれだけ登場したかに応じます。何百万もの例がある話題は正確に再現されますが、例がわずかな話題については、似た話題の見え方を基に推測します。modelにとって、再現と推測は同じ処理なので、自分がどちらをしているか区別できません。正答と同じ流暢さで捏造した回答が出てきます。Hallucinationとはmodelの推測が外れることです。
parametric knowledgeは時間とともに古くなります。knowledge cutoffでparametersの更新が止まるため、その日より後に公開または改名されたlibraryは含まれず、変更されたAPIも古い形で記憶されます。
知識が珍しい場合も新しい場合も、対処は同じです。parametersに知識を追加できないため、代わりにcontextual knowledgeとして与えます。
使用例:
「Reactは完璧に書くのに、社内SDKにはないmethodを作ります。」
「Reactはtraining例が何百万もあり、parametric knowledgeが豊富です。社内SDKはそうではないため、もっともらしい形を補っています。SDKのドキュメントをcontextに読み込んでください。」
知識のカットオフ
modelがparametric knowledgeを持たなくなる境目の日付です。cutoffより後のlibrary、API、出来事は、ドキュメントをcontextual knowledgeとして読み込まない限り、捏造を招きます。modelのreleaseごとに、独自のcutoffがあります。
modelの作られ方が原因です。trainingでは、ある時点のテキストをmodelのparametersに焼き付け、その後parametersは固定されます。modelは自分の知識に境界があると分かりません。cutoffより後のことを聞かれても、回答を断るのではなく、知っている最も近い情報から推定します。危険を見抜きにくいのはこのためです。古い版を基に書いたlibrary codeはもっともらしく見え、多くの場合compileできますが、変更された箇所で失敗します。
対処は常に同じです。最新情報をcontextに入れます。changelogを読み込ませる、インストール済みの版のtype definitionを参照する、またはagentにweb上のドキュメントを読ませます。context内の情報は、parametersにない情報より優先されます。
使用例:
「v5を使っているのに、v3 SDKのsyntaxを何度も書きます。」
「v5はknowledge cutoffより後に出ました。v5のchangelogをcontextual knowledgeとして読み込んでください。そうしないと、古いparametric versionを基に捏造し続けます。」
文脈知識
agentが今すぐcontextから直接読み取れる事実です。ユーザーのタスク、読み込んだファイル、tool results、session開始時に読み込まれたAGENTS.mdの内容などです。parametric knowledgeと対になる概念です。parametric knowledgeはparametersから思い出されるもの、contextual knowledgeはwindowから読み取られるものです。agentがcontextual knowledgeを使って作業すると、Hallucinationsは大幅に減ります。答えが目の前にあり、曖昧な記憶から掘り起こす必要がありません。
2種類の知識のうち、ユーザーが調整できるのはcontextual knowledgeだけです。parametersは固定されているため、modelが持っていない知識、たとえば内部SDK、knowledge cutoff後に公開されたlibrary、昨日決めたことをmodelに与えるには、contextに含める必要があります。実務のAI coding作業の多くは、modelが必要とする時点で正しい事実を目の前に置くことです。
contextual knowledgeとparametric knowledgeが食い違うと、通常はcontextual knowledgeが優先されます。最新のAPIドキュメントを貼れば、modelは古いAPIの記憶ではなく、そのドキュメントに従います。ただし、特に長いsessionの後半では古い情報が混ざることがあります。ドキュメントを読み込ませたのに古いpatternへ戻り続ける場合、parametric knowledgeがcontextual knowledgeを押しのけています。訂正を言い直すか、作業内容の近くに置くと役立ちます。
parametric knowledgeとは異なり、contextual knowledgeを使うにはコストがかかります。windowに読み込んだものはすべてtokensを消費し、modelのattention budgetを奪い合います。だから、たくさん読み込めばよいとは限りません。目標は、windowにすべての事実ではなく、関連する事実を置くことです。
この用語を使うのは、parametric knowledgeとの違いを示すときだけにしてください。それ以外ではcontextと呼べば十分です。
避ける表現:「working memory」。contextual knowledgeは今windowにあるものです。memory systemは、sessionをまたぐ内容をwindowへ入れる仕組みです。異なる規模の話なので混同しないでください。
使用例:
「ドキュメントを貼るとAPIを正しく扱うのに、貼らないと存在しない機能を作るのはなぜですか?」
「ドキュメントがあるときはcontextual knowledge、つまりページを読んでいます。ないときはparametric knowledgeです。珍しいendpointは記憶が曖昧になります。」
注意関係
各tokenを予測するとき、modelはcontext内のほかのすべてのtokenを考慮します。ただし、強く影響するものもあれば、ごくわずかなものもあります。token同士の組み合わせをattention relationshipと呼びます。「her」と「Sarah」や、`getUser()`呼び出しと`function getUser`定義のように意味のある組み合わせは、無関係な組み合わせより強く影響し合います。N tokensのcontextには、N²に相当する数のrelationshipがあります。
modelが理解しているように見える部分は、この組み合わせから生まれます。代名詞の指すものを解釈できるのは、「her」と「Sarah」のattention relationshipが強いからです。正しい引数で関数を呼び出せるのは、call siteと先に読んだ定義とのrelationshipが働いているためです。検索しているのではありません。各model provider requestで、すべての組み合わせについて計算し直します。
N²が直感以上の速さで増えることを、確認しておきましょう。
| Contextのサイズ | 組み合わせ数(約N²) |
|---|
| 1,000 tokens | 約100万 |
| 10,000 tokens | 約1億 |
| 100,000 tokens | 約100億 |
各組み合わせは一度だけ計算されるわけではありません。modelには複数のattention headがあります。最先端modelの正確な数は公表されていませんが、50〜100程度という見積もりが妥当です。それぞれのheadが、すべてのrelationshipについて独自の計算を行います。つまり上の表にある組み合わせは、各headごとに繰り返し計算されます。膨大な数です。
特定のタスクで重要なrelationshipはごく一部です。あなたの指示と、それが適用されるコードの組み合わせなど、数えるほどしかありません。残りのほとんどはnoiseです。重要な組み合わせの数はおおむね一定のままですが、全体の数はcontextの大きさに応じて二次関数的に増えます。1,000 tokensでは、重要な組み合わせは100万分の1ですが、100,000 tokensでは100億分の1です。これがattention budgetの背景にある計算であり、重要なrelationshipが占める割合が薄まると感じる現象がattention degradationです。
使用例:
「diffの中の`user` symbolを混同しています。dumb zoneに入ったようです。」
「そうですね。call siteとdeclarationのrelationshipが互いに競合しています。同じtokenの形でbindingが違います。片方の名前を変えれば、組み合わせがはっきりします。」
注意予算
各tokenが、残りのcontextへ分配できる影響力には上限があります。one relationshipに強く影響すると、ほかに割ける分が少なくなります。budgetはtokenごとに決まっており、contextが増えても拡大しません。そのため、長いsessionsでは影響が薄まります。
signalとnoiseとして考えてみてください。あなたの指示は一定の音量を持つsignalであり、context window内のほかのtokenは競合する音です。指示自体が小さくなるわけではありません。文字単位では同じままです。しかしcontextが成長するにつれて周囲が騒がしくなり、signal-to-noise比が下がります。contextが10k tokensだったときは最も大きな声だった指示も、150kになると背景音になります。これがattention degradationの仕組みです。modelが忘れるのではなく、noiseの中にsignalが埋もれます。
症状は指示違反のように見えます。agentは早い段階で制約に同意したのに、やがて逸脱し、その制約を貼り直しても効果は一時的です。原因は指示ではなく、window内で指示と競合するほかのすべてです。
contextに何を入れるかは調整できます。タスクに役立たない内容は中立ではなく、必要な情報を覆い隠すnoiseです。windowを小さく保ち、蓄積したcontextがコストに見合わなくなったらclearし、早い段階で言ったから大丈夫と考えず、重要な制約をもう一度伝えてください。
使用例:
「なぜ、最初に貼ったschemaを何度も無視するのですか?」
「すっかりdumb zoneに入っています。各tokenのattention budgetは固定ですが、contextが増え続けました。schemaのsignalは、後から追加した何千ものtokenと競合しています。」
注意力の劣化
sessionが長くなると、各tokenのattention budgetは、より多くの競合相手に分配されます。個々のmeaningful relationshipが持つシグナルは弱まり、無関係なcontextによるノイズが増えます。modelもparametersも同じです。ひとつの皿から食べる口が増えただけです。smart zoneとdumb zone effectの原因です。
sessionの途中でmodelの能力が落ちたように見えます。1時間従っていた制約を守らなくなる、伝えたことを再び質問する、前に読んだファイルを無視したコードを書く、といった症状が出ます。modelは何も変わっていません。変わったのは、modelが参照するcontextの量だけです。
徐々に進むため、sessionの内部から捉えにくいのです。エラーも閾値もなく、各turnが前よりほんの少し悪くなります。明らかな失敗に気づく頃には、しばらくdumb zoneに入っていたことになります。
contextを足すのではなく、取り除けば回復します。無視された指示を貼り直しても、混雑した同じwindowに競合相手が増えるだけで、効果は一時的です。有効なのは、clearしてタスクに必要なものだけを読み直すこと、compactすること、または新しいsessionへhand offすることです。指示への従い方が落ちてきたら、modelではなくcontextの長さに関する兆候として扱ってください。
使用例:
「すっかりdumb zoneに入っています。型ファイルに存在しないgenericsを作り出しています。」
「Attention degradationです。型定義はまだcontextにありますが、その後に追加した内容の下にシグナルが埋もれています。clearして読み込み直しましょう。」
スマートゾーン
sessionの開始直後、agentは「smart zone」にいます。頭が冴え、集中でき、記憶も確かです。sessionが長くなると「dumb zone」に入り、雑になり、忘れっぽくなり、誤りが増え、忠実性のhallucinationsも起きやすくなります。modelもharnessも同じで、変わったのはcontextの量だけです。attention degradationを体感する形です。最先端のmodelでは、dumb zoneは多くの場合、約125K〜150Ktokensあたりで始まります。ただし、この数値は議論の余地があります。sessionが膨れたらClearまたはcompactしてください。無理に進めてはいけません。
低下は徐々に起こるため、見逃しやすいものです。エラーメッセージも目に見える境界もありません。agentの性能が少しずつ、そして目立つほど悪くなるだけです。よくある兆候は、20 turns前に伝えた指示を忘れる、すでに直した誤りを繰り返す、contextの内容と矛盾することを自信満々に述べる、といったものです。低下が滑らかに進むため、説明し直して無理に進めるのが普通の対応になりがちです。しかし、それでcontextが増え、問題を悪化させます。
各zoneはcontext windowの上限とは連動しません。windowにまだ余裕があっても、sessionがdumb zoneの深部に入ることがあります。上限はharnessが続行を拒否する位置ですが、品質はずっと前から落ちています。window全体ではなくsmart zoneを基準に計画してください。実際の予算はagentが技術的に保持できるtoken数ではなく、うまく作業できるtoken数です。
smart zoneは限られたbudgetであり、関係のない作業もそれを消費します。session内で行うすべてのタスクがtokenを使うため、同じsessionで2つ目のタスクを始めると、最初からdumb zoneに近い位置で始めることになります。タスクごとにsessionを分ければ、それぞれをsessionの最も冴えた部分で進められます。ひとつのタスクがsmart zoneひとつ分を超える場合は分割します。自然な区切りでhand offまたはcompactし、新しいsessionに次の部分を任せます。
使用例:
「最初のコンポーネント3つは完璧だったのに、4つ目はひどい出来です。」
「smart zoneを抜けました。同じmodelですが、今はdumb zoneの深部にいます。compactして計画を読み込み直せば、次のコンポーネントはうまくいきます。」