긴 문맥 평가 — NIAH, RULER, LongBench, MRCR

Gemini 3 Pro는 10M 토큰의 문맥(context)을 광고합니다. 그러나 1M 토큰 길이에서 8-needle MRCR 점수는 26.3%까지 떨어집니다. 광고된 길이와 실제로 쓸 수 있는 길이는 다릅니다. 긴 문맥 평가(Long-Context Evaluation)는 배포하려는 모델이 실제로 감당할 수 있는 용량(capacity)을 알려줍니다.

유형: Learn 언어: Python 선수 강의: Phase 5 · 13 (Question Answering), Phase 5 · 23 (Chunking Strategies) 예상 시간: 약 60분

학습 목표

  • 광고된 문맥 창(advertised context window)과 유효 문맥 길이(effective context length)를 구분합니다.
  • NIAH, RULER, LongBench, MRCR이 각각 무엇을 측정하는지 설명합니다.
  • 긴 문맥 모델을 평가할 때 검색(retrieval) 과제와 추론(reasoning) 과제를 분리해 보고합니다.
  • 도메인(domain)별 맞춤 NIAH 시험을 설계합니다.

문제

200쪽짜리 계약서(contract)가 있다고 가정합니다. 모델은 1M 토큰의 문맥을 지원한다고 주장합니다. 계약서를 그대로 붙여 넣고 "해지 조항(termination clause)은 무엇인가?"라고 묻습니다. 모델은 답합니다. 그러나 해지 조항이 120k 토큰 깊이에 있다면, 모델은 실제로 그곳까지 주의를 기울이지 못해 표지(cover page)에 있던 내용을 보고 답할 수 있습니다.

이것이 2026년의 문맥 용량 격차(context-capacity gap)입니다. 사양서(spec sheet)에는 1M 또는 10M이라고 적혀 있지만, 현실에서는 그중 60-70%만 쓸 수 있는 경우가 많고, "쓸 수 있다"는 표현의 의미도 과제 종류에 따라 달라집니다.

  • 검색(Retrieval, single needle in haystack): 최신 프런티어 모델(frontier model)에서는 광고된 최대 길이까지 거의 완벽합니다.
  • 다중 홉(Multi-hop) / 집계(aggregation): 대부분의 모델에서 약 128k 이후 급격히 나빠집니다.
  • 분산된 사실에 대한 추론: 가장 먼저 실패하는 과제 유형입니다.

긴 문맥 평가는 이런 축들을 측정합니다. 이번 강의에서는 벤치마크의 이름, 각 벤치마크가 실제로 무엇을 측정하는지, 그리고 자신의 도메인에 맞춘 needle 시험을 어떻게 만드는지 다룹니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.모델의 사양서(spec sheet)에 '1M 토큰 문맥 창(context window)'이라고 적혀 있습니다. 다중 홉(multi-hop) 추론 과제에서 이 숫자가 왜 오해의 소지가 있을 수 있나요?

2.건초 더미 속 바늘(Needle-in-a-Haystack; NIAH) 벤치마크는 무엇을 측정하나요?

0/2 답변 완료

개념

needle-in-haystack grid — depth × length pass rate NIAH pass-rate heatmap 4k 16k 64k 256k 1M depth 0.1 depth 0.3 depth 0.5 depth 0.7 depth 0.9 pass ≥ 90% partial 60-90% fail < 60% middle depths degrade first — "lost in the middle" beyond NIAH RULER — 13 tasks: multi-needle, variable tracing, aggregation, QA. Exposes models that saturate NIAH but fail multi-hop. LongBench v2 — 503 multiple-choice Qs, 8k–2M context, six real-world categories. MRCR 8-needle — Gemini 3 Pro advertises 10M; scores 77% at 128k, 26.3% at 1M. NoLiMa / BABILong — non-lexical needle and reasoning-in-haystack — hardest variants. report two numbers, not one: effective retrieval length & effective reasoning length (usually 25-50% of advertised window)

건초 더미 속 바늘(Needle-in-a-Haystack; NIAH, 2023). 긴 문맥 안의 특정 깊이에 사실 하나를 심습니다. 예를 들어 "the magic word is pineapple"을 넣고 모델에게 그것을 다시 꺼내(retrieve) 보게 합니다. 깊이와 길이를 함께 훑어(sweep) 봅니다. 긴 문맥 벤치마크의 원형입니다. 최신 프런티어 모델은 이제 이 시험을 거의 포화시키기 때문에 필요하지만 충분하지는 않은 기준선(baseline)입니다.

RULER (Nvidia, 2024). 네 개의 범주(category)에 걸친 13가지 과제 유형을 포함합니다. 검색(single / multi-key / multi-value), 다중 홉 추적(multi-hop tracing, variable tracking), 집계(aggregation, common word frequency), 그리고 질의응답(QA)입니다. 문맥 길이는 4k에서 128k 이상까지 설정할 수 있습니다. NIAH는 통과하지만 다중 홉에서 실패하는 모델을 드러냅니다. 2024년 릴리스에서는 32k 이상을 지원한다고 주장한 17개 모델 중 절반만이 32k에서 품질을 유지했습니다.

LongBench v2 (2024). 503개의 객관식(multiple-choice) 문항, 8k에서 2M 단어 길이의 문맥, 그리고 6가지 과제 범주를 다룹니다. 단일 문서 질의응답(single-doc QA), 다중 문서 질의응답(multi-doc QA), 긴 문맥 학습(long in-context learning), 긴 대화(long dialogue), 코드 저장소(code repo), 긴 구조화 데이터(long structured data)가 포함됩니다. 실제 환경의 긴 문맥 동작을 보기 위한 운영용(production) 벤치마크입니다.

MRCR (Multi-Round Coreference Resolution). 큰 규모에서의 다중 라운드 상호참조 해결(multi-turn coreference)입니다. 8-needle, 24-needle, 100-needle 변형이 있습니다. 모델이 주의력(attention)이 무너지기 전까지 동시에 몇 개의 사실을 다룰 수 있는지를 보여줍니다.

NoLiMa. "비어휘(non-lexical) 바늘"입니다. needle과 질의(query)가 글자 그대로 겹치는 토큰을 공유하지 않기 때문에 한 단계의 의미적 추론(semantic reasoning)이 있어야 검색이 가능합니다. NIAH보다 어렵습니다.

HELMET. 여러 문서를 이어 붙이고 그중 하나에서 질문을 만듭니다. 선택적 주의력(selective attention)을 시험합니다.

BABILong. 관련 없는 건초 더미 안에 bAbI 추론 사슬(reasoning chain)을 끼워 넣습니다. 단순한 검색이 아니라 건초 더미 속 추론(reasoning-in-a-haystack)을 시험합니다.

실제로 보고해야 할 것

  • 광고된 문맥 창(Advertised context window). 사양서(spec sheet)에 적힌 숫자입니다.
  • 유효 검색 길이(Effective retrieval length). 특정 기준(예: 90%) 이상으로 NIAH를 통과하는 길이입니다.
  • 유효 추론 길이(Effective reasoning length). 같은 기준에서 다중 홉이나 집계 과제를 통과하는 길이입니다.
  • 저하 곡선(Degradation curve). 과제 유형별로 그린 정확도 대비 문맥 길이 그래프입니다.

사양서에는 두 개의 숫자를 보고합니다. 검색 유효 길이(retrieval-effective)와 추론 유효 길이(reasoning-effective)입니다. 보통 추론 유효 길이는 광고된 창의 25-50% 정도입니다.

직접 만들기

Step 1: 도메인 맞춤 NIAH

code/main.py를 참고합니다. 뼈대(skeleton)는 다음과 같습니다.

def build_haystack(filler_text, needle, depth_ratio, total_tokens):
    if not (0.0 <= depth_ratio <= 1.0):
        raise ValueError(f"depth_ratio must be in [0, 1], got {depth_ratio}")
    if total_tokens <= 0:
        raise ValueError(f"total_tokens must be positive, got {total_tokens}")

    filler_tokens = tokenize(filler_text)
    needle_tokens = tokenize(needle)
    if not filler_tokens:
        raise ValueError("filler_text produced no tokens")

    # 건초 더미 본문을 채울 만큼 filler를 반복합니다.
    body_len = max(total_tokens - len(needle_tokens), 0)
    while len(filler_tokens) < body_len:
        filler_tokens = filler_tokens + filler_tokens
    filler_tokens = filler_tokens[:body_len]

    insert_at = min(int(body_len * depth_ratio), body_len)
    haystack = filler_tokens[:insert_at] + needle_tokens + filler_tokens[insert_at:]
    return " ".join(haystack)


def score_niah(model, haystack, question, expected):
    answer = model.complete(f"Context: {haystack}\nQ: {question}\nA:", max_tokens=50)
    return 1 if expected.lower() in answer.lower() else 0

depth_ratio{0, 0.25, 0.5, 0.75, 1.0}, total_tokens{1k, 4k, 16k, 64k} 식으로 훑어 봅니다. 그 결과를 히트맵(heatmap)으로 그리면 대상 모델의 NIAH 카드가 됩니다.

Step 2: 다중 needle 변형

def build_multi_needle(filler, needles, total_tokens):
    depths = [0.1, 0.4, 0.7]
    chunks = [filler[:int(total_tokens * 0.1)]]
    for depth, needle in zip(depths, needles):
        chunks.append(needle)
        next_chunk = filler[int(total_tokens * depth): int(total_tokens * (depth + 0.3))]
        chunks.append(next_chunk)
    return " ".join(chunks)

"세 개의 magic word는 무엇인가?" 같은 질문은 세 needle을 모두 찾아야 답할 수 있습니다. 단일 needle 성공이 다중 needle 성공을 보장하지는 않습니다.

Step 3: 다중 홉 변수 추적 (RULER 스타일)

haystack = """X1 = 42. ... (filler) ... X2 = X1 + 10. ... (filler) ... X3 = X2 * 2."""
question = "What is X3?"

답을 얻으려면 세 개의 대입을 사슬처럼 이어가야 합니다. 128k 길이에서는 프런티어 모델도 정확도가 50-70% 수준으로 떨어지는 경우가 많습니다.

Step 4: 자신의 스택 위에서 LongBench v2 돌리기

from datasets import load_dataset
longbench = load_dataset("THUDM/LongBench-v2")

def eval_model_on_longbench(model, subset="single-doc-qa"):
    tasks = [x for x in longbench["test"] if x["task"] == subset]
    correct = 0
    for x in tasks:
        answer = model.complete(x["context"] + "\n\nQ: " + x["question"], max_tokens=20)
        if normalize(answer) == normalize(x["answer"]):
            correct += 1
    return correct / len(tasks)

범주별 정확도를 따로 보고합니다. 통합 점수는 과제 수준의 큰 차이를 가릴 수 있습니다.

흔한 함정

  • NIAH만으로 평가하기. 1M 토큰에서 NIAH를 통과해도 다중 홉 성능은 알 수 없습니다. RULER나 직접 만든 다중 홉 시험을 함께 돌립니다.
  • 균일한 깊이만 표본 추출. 많은 구현이 depth=0.5만 시험합니다. depth 0, 0.25, 0.5, 0.75, 1.0을 모두 시험해야 합니다. "중간에서 길을 잃는(lost in the middle)" 현상은 실제로 일어납니다.
  • filler와 needle의 어휘 중첩(lexical overlap). needle이 filler와 키워드를 공유하면 검색이 너무 쉬워집니다. NoLiMa 스타일로 겹치지 않는 needle을 씁니다.
  • 지연 시간 무시. 1M 토큰 프롬프트는 사전 처리(prefill)에 30-120초가 걸릴 수 있습니다. 정확도와 함께 첫 토큰까지의 시간(time-to-first-token)을 측정합니다.
  • 공급사 자체 보고 수치. OpenAI, Google, Anthropic은 모두 자체 점수를 발표합니다. 실제 사용 사례에서 독립적으로 다시 돌려야 합니다.

사용하기

2026년의 스택은 다음과 같습니다.

상황벤치마크
빠른 정상성 확인(sanity check)3개 깊이 × 3개 길이의 맞춤 NIAH
운영 환경용 모델 선정목표 길이에서의 RULER (13 tasks)
실제 환경 QA 품질LongBench v2 단일 문서 QA(single-doc-QA) 부분집합
다중 홉 추론BABILong 또는 직접 만든 변수 추적 과제
대화 / dialogue목표 길이에서의 MRCR 8-needle
모델 업그레이드 회귀(regression) 점검내부 고정 NIAH + RULER 하니스(harness), 새 모델마다 실행

운영 환경의 경험칙은 간단합니다. 의도한 길이에서 NIAH와 추론 과제 한 개를 통과시키기 전에는 그 문맥 창을 믿지 않습니다.

산출물 만들기

outputs/skill-long-context-eval.md로 저장합니다.

---
name: long-context-eval
description: Design a long-context evaluation battery for a given model and use case.
version: 1.0.0
phase: 5
lesson: 28
tags: [nlp, long-context, evaluation]
---

Given a target model, target context length, and use case, output:

1. Tests. NIAH depth x length grid; RULER multi-hop; custom domain task.
2. Sampling. Depths 0, 0.25, 0.5, 0.75, 1.0 at each length.
3. Metrics. Retrieval pass rate; reasoning pass rate; time-to-first-token; cost-per-query.
4. Cutoff. Effective retrieval length (90% pass) and effective reasoning length (70% pass). Report both.
5. Regression. Fixed harness, rerun on every model upgrade, surface deltas.

Guide the student in Korean.

Refuse to trust a context window from the model card alone. Refuse NIAH-only evaluation for any multi-hop workload. Refuse vendor self-reported long-context scores as independent evidence.

연습문제

  1. 쉬움. 3개 깊이(0.25, 0.5, 0.75) × 3개 길이(1k, 4k, 16k)로 NIAH를 만듭니다. 아무 모델이나 골라 실행한 뒤 통과율(pass rate)을 3×3 히트맵으로 그립니다.
  2. 중간. 3-needle 변형을 추가합니다. 각 길이에서 세 needle을 모두 검색하는 비율을 측정하고, 같은 길이의 단일 needle 통과율과 비교합니다.
  3. 어려움. 64k 길이의 filler 안에 3-hop 변수 추적 과제(X1 → X2 → X3)를 끼워 넣습니다. 세 개의 프런티어 모델에서 정확도를 측정하고 모델별 유효 추론 길이를 보고합니다.

핵심 용어

용어흔한 설명실제 의미
NIAHNeedle in haystackfiller 안에 사실을 심고 모델이 그것을 검색해 내는지 확인합니다.
RULERNIAH on steroids검색, 다중 홉, 집계, 질의응답을 포함한 13개 과제 유형입니다.
유효 문맥(Effective context)실제 용량정확도가 기준 이상으로 유지되는 길이입니다.
중간에서 길을 잃기(Lost in the middle)깊이 편향모델이 긴 입력의 중간 부분에 덜 주의를 기울이는 현상입니다.
다중 needle(Multi-needle)여러 사실을 한 번에여러 needle을 심어 주의력의 동시 처리 능력을 시험합니다.
MRCRMulti-round coref8, 24, 100개의 needle 상호참조로 주의력 포화를 드러냅니다.
NoLiMaNon-lexical needleneedle과 질의가 문자 그대로 겹치지 않아 추론이 필요합니다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

long-context-eval

Design a long-context evaluation battery for a given model and use case.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.프런티어 모델(frontier model)이 1M 토큰에서 단일 바늘(single-needle) NIAH를 98% 정확도로 통과하지만, 128k 토큰의 3-hop 변수 추적(variable tracking) 과제에서는 55%만 기록합니다. 이 격차가 드러내는 것은 무엇인가요?

2.법률 계약서 검토 시스템을 위한 맞춤 NIAH 시험을 설계하고 있습니다. 시험의 타당성(validity)을 가장 높이는 설계 선택은 무엇인가요?

3.운영 환경(production) 배포를 위한 긴 문맥 평가 결과를 보고할 때, 광고된 문맥 창(context window)과 함께 포함해야 하는 두 가지 숫자는 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다