Needle in a Haystackとは
NIAH / 干し草の中の針
長いコンテキストの中に埋め込んだ短い一文をLLMが正確に検索・想起できるかを測るテスト
ひとことで言うと
長い文章のどこかに1文だけ紛れ込ませておき、AIがそれを正しく見つけ出せるか試すテスト。
概要
Needle in a Haystack(NIAH)は、無関係な大量のテキスト(haystack、干し草)の中に特定の短い一文(needle、針)を様々な位置に埋め込み、その内容についての質問にLLMが正確に答えられるかを測定するテスト。 これにより、コンテキストウィンドウ全体を実際にどれだけ有効活用できているかを検証する。 コンテキストウィンドウの長さそのものはモデルの仕様として公表されているが、長い入力の中の特定の情報を実際に検索・想起できる精度はまた別の問題となる。 特に文書の中間付近に埋め込まれた情報は、文書の冒頭や末尾と比べて想起精度が低下する傾向(いわゆる「Lost in the Middle」現象)が報告されている。 埋め込む位置(文書の何%の地点か)と、コンテキストの長さ(トークン数)を変化させたグリッド上で正答率をヒートマップとして可視化する手法が一般的で、モデルやAPI提供元の技術文書・ブログでもコンテキスト活用能力を示す指標として頻繁に引用される。 2023年にGreg Kamradtが公開したオープンソースの評価スクリプトが事実上の標準的な実装として広く使われている。
背景
コンテキストウィンドウの長さはモデルの仕様として公称されているが、公称値まで長い入力を与えた場合に、その全域にわたって情報を正確に検索・利用できるかどうかは別途検証する必要がある。 Needle in a Haystackは、この「名目上の長さ」と「実効的に使える長さ」のギャップを可視化するために考案された。
歴史
2023年: Greg Kamradtがオープンソースの評価スクリプトとしてNeedle in a Haystackテストを公開。 2023-2024年: 主要なLLM提供元が、新しいモデルの長いコンテキストウィンドウの性能を示す指標としてこのテストの結果を頻繁に引用するように。
ワークフロー
評価対象のコンテキスト長(例:1,000〜128,000トークン)と、needleを埋め込む位置(文書内の相対的な深さ)の組み合わせを複数用意する。 各組み合わせについて、needleを埋め込んだ長文をモデルへ与え、needleの内容に関する質問への回答精度を測定する。 コンテキスト長×埋め込み位置のグリッドごとに正答率を集計し、ヒートマップとして可視化する。
コード例
needleを埋め込んだプロンプトの構築例
def build_needle_prompt(haystack_text, needle, depth_percent):
insert_point = int(len(haystack_text) * depth_percent / 100)
prompt = haystack_text[:insert_point] + needle + haystack_text[insert_point:]
return prompt + "\n\n質問: needleに書かれていた内容は?"利点
- モデルが公称するコンテキストウィンドウの長さを、実際にどれだけ有効活用できているかを直接検証できる
- 埋め込み位置とコンテキスト長を変化させることで、性能が低下しやすい条件を具体的に特定できる
- オープンソースの実装が公開されており、独自のモデルやAPIに対しても再現しやすい
欠点
- 単純な一文の検索・想起というタスクであり、複数の情報を組み合わせて推論する複雑な長文理解能力までは測れない
- needleの内容や埋め込み方によって結果が変動しやすく、テスト条件の設計に注意が必要
- テストで高い性能が示されても、実際のRAGアプリケーションなど複雑な実運用環境での性能を必ずしも保証しない
比較
- コンテキストウィンドウ — Needle in a Haystackは、コンテキストウィンドウの公称の長さと実効的な利用可能長のギャップを検証するテスト
- MMLU — MMLUが幅広い知識を問うのに対し、Needle in a Haystackは長文中の特定情報の検索・想起精度に特化している
- RAG — RAGシステムの設計においても、コンテキストの中間に埋め込まれた情報の想起精度低下は考慮すべき課題とされる
- ロングコンテキスト — Needle in a Haystackは、ロングコンテキストが謳う実効性能を具体的に検証するための代表的なベンチマーク
関連用語
よくある質問
「Lost in the Middle」現象とは?
長いコンテキストの中間付近に配置された情報が、冒頭や末尾に配置された情報と比べて、モデルに正しく想起されにくくなる傾向のこと。Needle in a Haystackテストの結果から広く知られるようになった。
コンテキストウィンドウが長いモデルほど有利?
公称のコンテキストウィンドウが長くても、実際にその全域を高精度で利用できるとは限らない。Needle in a Haystackはこの実効的な利用可能長を検証する目的で使われる。