본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 9장: 컨텍스트 품질 측정과 개선
2026년 3월 24일·AI / ML·

9장: 컨텍스트 품질 측정과 개선

컨텍스트 엔지니어링의 효과를 정량적으로 측정하는 방법을 다룹니다. 태스크 성공률, 토큰 효율성, A/B 테스트, 컨텍스트 드리프트 감지를 분석합니다.

17분683자8개 섹션
aiai-agentclaude-codellm
공유
context-engineering9 / 10
12345678910
이전8장: 컨텍스트 엔지니어링 도구와 기법다음10장: 실전 프로젝트 -- 컨텍스트 엔지니어링 시스템 구축

이 장에서 배우는 것

  • 태스크 성공률과 컨텍스트의 상관관계
  • 토큰 효율성 메트릭 정의와 측정
  • A/B 테스트를 통한 컨텍스트 비교
  • 컨텍스트 드리프트 감지와 대응
  • 지속적 개선 루프 설계
  • 비용-품질 트레이드오프 분석

측정 없이는 개선도 없다

컨텍스트 엔지니어링은 직관과 경험에 의존하기 쉬운 분야입니다. "이 CLAUDE.md가 더 나은 것 같다", "이 포맷이 효과적인 것 같다"는 주관적 판단만으로는 체계적인 개선이 어렵습니다.

핵심 메트릭

1. 태스크 성공률

가장 중요한 메트릭은 태스크 성공률(Task Success Rate)입니다. 에이전트가 주어진 작업을 올바르게 완료하는 비율입니다.

task-success-metrics.ts
typescript
interface TaskResult {
  taskId: string;
  taskType: "create" | "modify" | "fix" | "refactor" | "test";
  
  // 성공 여부 판정 기준
  buildPassed: boolean;       // 빌드 성공
  testsPassed: boolean;       // 관련 테스트 통과
  lintPassed: boolean;        // 린트 통과
  humanApproved: boolean;     // 사람의 최종 승인
  
  // 컨텍스트 정보
  contextTokens: number;      // 사용된 컨텍스트 토큰 수
  contextFiles: number;       // 포함된 파일 수
  contextStrategy: string;    // 사용된 컨텍스트 전략
  
  // 효율성
  totalTokens: number;        // 전체 토큰 (입력 + 출력)
  responseTime: number;       // 응답 시간 (ms)
  iterationCount: number;     // 수정 반복 횟수
  cost: number;               // 비용 (USD)
}
 
function calculateSuccessRate(results: TaskResult[]): SuccessMetrics {
  const total = results.length;
  
  return {
    buildSuccessRate: results.filter(r => r.buildPassed).length / total,
    testSuccessRate: results.filter(r => r.testsPassed).length / total,
    fullSuccessRate: results.filter(r => 
      r.buildPassed && r.testsPassed && r.lintPassed
    ).length / total,
    humanApprovalRate: results.filter(r => r.humanApproved).length / total,
    
    // 첫 시도 성공률 (수정 없이 바로 통과)
    firstAttemptRate: results.filter(r => 
      r.buildPassed && r.testsPassed && r.iterationCount === 1
    ).length / total,
  };
}
Info

"첫 시도 성공률(First Attempt Success Rate)"은 컨텍스트 품질의 가장 직접적인 지표입니다. 컨텍스트가 충분하면 에이전트는 첫 시도에 올바른 결과를 만들고, 부족하면 여러 번의 수정이 필요합니다.

2. 토큰 효율성

토큰 효율성은 사용된 토큰 대비 작업 성공의 효율을 측정합니다.

token-efficiency.ts
typescript
interface TokenEfficiency {
  // 토큰당 성공률
  successPerToken: number; // 성공률 / 컨텍스트 토큰 수
  
  // 불필요한 토큰 비율
  wasteRatio: number; // 사용되지 않은 컨텍스트 비율 추정
  
  // 비용 효율성
  costPerSuccess: number; // 성공 1건당 비용
  
  // 속도 효율성
  timePerSuccess: number; // 성공 1건당 소요 시간
}
 
function analyzeTokenEfficiency(results: TaskResult[]): TokenEfficiency {
  const successful = results.filter(r => r.humanApproved);
  const failed = results.filter(r => !r.humanApproved);
  
  const avgSuccessTokens = average(successful.map(r => r.contextTokens));
  const avgFailTokens = average(failed.map(r => r.contextTokens));
  
  return {
    successPerToken: successful.length / sum(successful.map(r => r.contextTokens)),
    wasteRatio: estimateWaste(results),
    costPerSuccess: sum(successful.map(r => r.cost)) / successful.length,
    timePerSuccess: sum(successful.map(r => r.responseTime)) / successful.length,
  };
}

3. 컨텍스트 관련도 점수

포함된 컨텍스트가 실제 작업에 얼마나 활용되었는지를 측정합니다.

relevance-scoring.ts
typescript
interface RelevanceScore {
  // 제공된 파일 중 실제로 참조/수정된 비율
  fileUtilization: number;
  
  // 제공된 코드 라인 중 실제로 관련된 비율
  lineRelevance: number;
  
  // 누락된 컨텍스트 (에이전트가 추가로 탐색한 파일)
  missingContext: string[];
  
  // 불필요했던 컨텍스트 (제공했지만 미사용)
  unusedContext: string[];
}
 
async function evaluateRelevance(
  providedContext: ContextBlock[],
  agentActions: AgentAction[]
): Promise<RelevanceScore> {
  const providedFiles = new Set(providedContext.map(c => c.filePath));
  const accessedFiles = new Set(agentActions
    .filter(a => a.type === "read" || a.type === "edit")
    .map(a => a.filePath));
  
  const utilized = [...providedFiles].filter(f => accessedFiles.has(f));
  const missing = [...accessedFiles].filter(f => !providedFiles.has(f));
  const unused = [...providedFiles].filter(f => !accessedFiles.has(f));
  
  return {
    fileUtilization: utilized.length / providedFiles.size,
    lineRelevance: await calculateLineRelevance(providedContext, agentActions),
    missingContext: missing,
    unusedContext: unused,
  };
}

A/B 테스트

컨텍스트 전략의 효과를 비교하는 가장 신뢰할 수 있는 방법은 A/B 테스트입니다.

테스트 설계

테스트 구현

context-ab-test.ts
typescript
interface ABTestConfig {
  name: string;
  description: string;
  
  // 비교 대상
  controlStrategy: ContextStrategy;  // 현재 전략
  testStrategy: ContextStrategy;      // 테스트 전략
  
  // 테스트 태스크
  tasks: Task[];
  
  // 반복 횟수 (통계적 유의성)
  repetitions: number;
  
  // 측정 메트릭
  primaryMetric: "successRate" | "firstAttemptRate" | "costPerSuccess";
}
 
async function runABTest(config: ABTestConfig): Promise<ABTestResult> {
  const controlResults: TaskResult[] = [];
  const testResults: TaskResult[] = [];
  
  for (let i = 0; i < config.repetitions; i++) {
    for (const task of config.tasks) {
      // Control: 현재 전략으로 실행
      const controlContext = await config.controlStrategy.build(task);
      const controlResult = await executeWithContext(task, controlContext);
      controlResults.push(controlResult);
      
      // Test: 새 전략으로 실행
      const testContext = await config.testStrategy.build(task);
      const testResult = await executeWithContext(task, testContext);
      testResults.push(testResult);
    }
  }
  
  return {
    control: calculateMetrics(controlResults),
    test: calculateMetrics(testResults),
    improvement: calculateImprovement(controlResults, testResults),
    isSignificant: statisticalTest(controlResults, testResults),
  };
}

테스트할 수 있는 변수들

변수ControlTest측정 대상
CLAUDE.md 길이300줄100줄성공률 변화
압축 수준전체 코드인터페이스만성공률 vs 비용
배치 순서시간순U자형첫 시도 성공률
포맷마크다운XML정확도
참조 파일 수5개15개성공률 vs 비용
Warning

A/B 테스트는 동일한 태스크를 두 전략으로 실행해야 하므로, LLM의 비결정적 특성을 고려하여 충분한 반복 횟수가 필요합니다. 최소 20회 이상의 반복으로 통계적 유의성을 확보하는 것이 권장됩니다.

컨텍스트 드리프트 감지

컨텍스트 드리프트(Context Drift)는 시간이 지나면서 컨텍스트 파일의 내용이 실제 프로젝트 상태와 괴리되는 현상입니다.

드리프트의 원인

드리프트 감지 자동화

drift-detection.ts
typescript
interface DriftReport {
  file: string;
  issues: DriftIssue[];
  severity: "low" | "medium" | "high";
  lastUpdated: Date;
  staleDays: number;
}
 
interface DriftIssue {
  type: "stale-path" | "wrong-version" | "missing-module" | "dead-rule";
  description: string;
  evidence: string;
}
 
async function detectDrift(claudeMdPath: string): Promise<DriftReport> {
  const content = await readFile(claudeMdPath);
  const issues: DriftIssue[] = [];
  
  // 1. 경로 유효성 검사
  const mentionedPaths = extractPaths(content);
  for (const path of mentionedPaths) {
    if (!await fileExists(path)) {
      issues.push({
        type: "stale-path",
        description: `경로 '${path}'가 실제로 존재하지 않습니다`,
        evidence: path,
      });
    }
  }
  
  // 2. 패키지 버전 확인
  const mentionedVersions = extractVersions(content);
  const actualVersions = await getPackageVersions();
  for (const [pkg, mentioned] of mentionedVersions) {
    const actual = actualVersions.get(pkg);
    if (actual && actual !== mentioned) {
      issues.push({
        type: "wrong-version",
        description: `${pkg}: 문서 ${mentioned} vs 실제 ${actual}`,
        evidence: `${pkg}@${mentioned} -> ${pkg}@${actual}`,
      });
    }
  }
  
  // 3. 새 모듈 누락 확인
  const documentedModules = extractModules(content);
  const actualModules = await scanModules("src/");
  for (const module of actualModules) {
    if (!documentedModules.has(module)) {
      issues.push({
        type: "missing-module",
        description: `모듈 '${module}'이 문서에 누락되어 있습니다`,
        evidence: module,
      });
    }
  }
  
  // 4. 마지막 수정일 확인
  const lastModified = await getLastModified(claudeMdPath);
  const staleDays = daysSince(lastModified);
  
  return {
    file: claudeMdPath,
    issues,
    severity: issues.length > 5 ? "high" : issues.length > 2 ? "medium" : "low",
    lastUpdated: lastModified,
    staleDays,
  };
}

자동 갱신 파이프라인

auto-refresh-pipeline.ts
typescript
// CI/CD에 통합하여 주기적으로 실행
async function refreshContextFiles(): Promise<void> {
  const report = await detectDrift("CLAUDE.md");
  
  if (report.severity === "high") {
    // PR 자동 생성
    await createDriftFixPR(report);
  } else if (report.severity === "medium") {
    // Slack/이메일 알림
    await notifyTeam(report);
  }
  
  // 메트릭 기록
  await recordDriftMetrics({
    file: report.file,
    issueCount: report.issues.length,
    staleDays: report.staleDays,
    timestamp: new Date(),
  });
}

지속적 개선 루프

컨텍스트 엔지니어링은 일회성 작업이 아니라 지속적인 개선 과정입니다.

주간 컨텍스트 리뷰 체크리스트

  1. 성공률 추적: 지난 주 태스크 성공률은 목표 대비 어떤가
  2. 비용 추적: 태스크당 평균 비용이 증가하고 있는가
  3. 드리프트 확인: CLAUDE.md가 최신 상태인가
  4. 반복 패턴: 같은 유형의 실패가 반복되고 있는가
  5. 새 규칙 필요성: 자주 발생하는 실수에 대한 규칙을 추가해야 하는가

비용-품질 트레이드오프

컨텍스트를 늘리면 성공률이 올라가지만 비용도 증가합니다. 최적점을 찾는 것이 중요합니다.

전략비용 영향품질 영향권장 상황
최소 컨텍스트매우 낮음낮음단순 작업, 자동완성
선택적 컨텍스트중간높음대부분의 작업
최대 컨텍스트높음높음 (정체 가능)복잡한 리팩토링
동적 조립중간 (최적화)높음반복적 워크플로우
Tip

비용 최적화의 가장 효과적인 방법은 "모든 작업에 동일한 컨텍스트를 사용하지 않는 것"입니다. 작업 복잡도에 따라 컨텍스트 수준을 동적으로 조절하면, 단순 작업에서의 비용을 크게 줄이면서도 복잡한 작업의 성공률은 유지할 수 있습니다.


요약

컨텍스트 품질 측정의 핵심 메트릭은 태스크 성공률(특히 첫 시도 성공률), 토큰 효율성, 컨텍스트 관련도 점수입니다. A/B 테스트를 통해 컨텍스트 전략 변경의 효과를 통계적으로 검증하고, 드리프트 감지를 자동화하여 컨텍스트 파일의 최신성을 유지합니다.

지속적 개선 루프를 통해 수집-분석-가설-실험-적용-모니터링 사이클을 반복하며, 비용과 품질의 트레이드오프에서 작업 복잡도에 따른 동적 컨텍스트 조절이 최적의 전략입니다.

다음 장(최종장)에서는 이 시리즈에서 배운 모든 개념을 종합하여 실전 프로젝트 -- 컨텍스트 엔지니어링 시스템 구축 실습을 진행합니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#ai#ai-agent#claude-code#llm

관련 글

AI / ML

10장: 실전 프로젝트 -- 컨텍스트 엔지니어링 시스템 구축

시리즈 전체를 종합하여 실전 컨텍스트 엔지니어링 시스템을 구축합니다. CLAUDE.md 작성, MCP 서버 구현, 멀티에이전트 파이프라인, 측정 대시보드를 실습합니다.

2026년 3월 26일·20분
AI / ML

8장: 컨텍스트 엔지니어링 도구와 기법

Claude Code, Cursor, GitHub Copilot에서 컨텍스트를 최적화하는 구체적 방법과, MCP 서버를 통한 동적 컨텍스트 확장 기법을 다룹니다.

2026년 3월 22일·16분
AI / ML

7장: 컨텍스트 격리와 멀티에이전트 설계

멀티에이전트 시스템에서 에이전트별 컨텍스트를 격리하고, 크로스 오염을 방지하며, 공유 컨텍스트를 효과적으로 관리하는 전략을 다룹니다.

2026년 3월 20일·18분
이전 글8장: 컨텍스트 엔지니어링 도구와 기법
다음 글10장: 실전 프로젝트 -- 컨텍스트 엔지니어링 시스템 구축

댓글

목차

약 17분 남음
  • 이 장에서 배우는 것
  • 측정 없이는 개선도 없다
  • 핵심 메트릭
    • 1. 태스크 성공률
    • 2. 토큰 효율성
    • 3. 컨텍스트 관련도 점수
  • A/B 테스트
    • 테스트 설계
    • 테스트 구현
    • 테스트할 수 있는 변수들
  • 컨텍스트 드리프트 감지
    • 드리프트의 원인
    • 드리프트 감지 자동화
    • 자동 갱신 파이프라인
  • 지속적 개선 루프
    • 주간 컨텍스트 리뷰 체크리스트
  • 비용-품질 트레이드오프
  • 요약