All notes

프롬프트에 쓰레기를 채워서 값을 낮췄다

캐시 바닥 아래 프롬프트는 길게 만들면 싸진다. 채워 넣은 쓰레기가 정확도를 깎는지 500문항으로 확인했다. 안 깎였고, 쓸모 있는 걸로 채우면 두 번 남는다.

4 분 읽기서울과 나트랑에서 씁니다

캐시 할인에 바닥이 있다는 걸 알고 나면 해법은 저절로 써진다. 프리픽스가 캐시되기엔 너무 짧으면, 길게 만들면 된다. 계량기를 속이는 것처럼 들리는데, 계산해보면 아슬아슬한 이득이 아니다.

패딩이 이기는 정확한 조건

F를 바닥, r을 캐시 요금 배수, p를 지금 프리픽스 길이라고 하자. 바닥까지 채우면 호출당 p 대신 F·r을 낸다. 그러니 패딩이 이기는 조건은 이렇게 된다.

F · r < p        // 1024 × 0.1 = 102 tokens

p < 102      pay full price, the floor is irrelevant
102 .. 1024  below the floor, but padding to it strictly wins
p >= 1024    already caching

가운데 저 구간이 우리가 지금까지 써온 프로덕션 시스템 프롬프트가 사실상 전부 들어앉아 있는 자리다. 900 토큰짜리 프롬프트는 채워 넣었을 때보다 아홉 배 가까운 값을 내고 있다. 그러면 남는 질문은 하나다. 채워 넣은 글이 모델을 멍청하게 만드는가.

실험

무관한 문맥에 대한 선행 연구는 안심시켜 주지 않는다. 모델은 관련 없는 정보에 주의를 뺏기고, 긴 문맥의 가운데를 흘리고, 검색 노이즈에 답이 흐려진다. 그래서 가정하지 않고 돌렸다.

정답이 하나로 정해지고 완전일치로 채점되는 500문항, 네 묶음이다. 산수, 정렬, 단어 추출, 그리고 독해. 마지막 묶음이 핵심인데, 주어진 지문을 실제로 읽어야만 풀리는 문제라서 채워 넣은 글이 해를 끼칠 수 있다면 여기서 티가 난다. 지시문 알맹이는 같고 길이만 다른 시스템 프롬프트 셋으로 비교했다.

조건시스템 토큰캐시정확도 (n=500)독해만 (n=130)짝지은 차이
깨끗함, 바닥 아래38안 됨81.8%86.9%기준
쓰레기 패딩1,082됨82.0%86.9%+0.2 pp [-1.1, +1.5]
예시 패딩1,032됨86.0%87.7%+4.2 pp [+1.8, +6.6]

쓰레기는 등대의 역사 1,000 토큰이다. 주의를 뺏길 모델이 붙잡을 게 있도록 그 안에 자체 숫자와 달러 금액을 일부러 심어뒀다. 아무것도 안 바뀌었다. 합산 정확도는 0.2 포인트 움직였는데 그건 잡음이고, 애초에 합산은 이 결과를 읽는 약한 방법이다. 짝지어 보면 500문항 중 489문항이 두 프롬프트에서 똑같이 나왔고, 5문항이 깨끗한 쪽으로, 6문항이 쓰레기 쪽으로 뒤집혔다. McNemar χ² = 0.0 이다.

p값 말고 상한을 보고한다

p값이 크다는 건 효과가 없다는 증거가 아니고, 범위를 못 대는 무효과는 결과가 아니다. 그래서 우리가 실제로 내놓는 숫자는 짝지은 차이의 신뢰구간이다. 쓰레기 패딩의 정확도 손실이 1.1 포인트를 넘을 가능성은 95% 신뢰수준에서 배제된다. 독해 묶음은 더 조인다. 130문항 중 113문항이 동일했고 양쪽으로 정확히 한 문항씩 뒤집혔다. 짝지은 차이는 0.0 포인트 [-2.1, +2.1] 이다.

운영 관점에서 재미있는 건 세 번째다. 쓰레기 대신 풀이 예시로 채우면 정확도가 4.2 포인트 올라간다(p=0.001). 상승분은 거의 전부 형식에 민감한 단어 추출 묶음에서 나왔고, 이 묶음은 39%에서 56%로 올랐다. 평범한 few-shot 프롬프팅이 평범하게 제 일을 한 것이다. 길이가 도움이 된다는 증거는 아니고, 그 점은 분명히 적어둔다. 저 조건은 길이와 예시를 같이 늘렸으니까. 다만 이 기법의 쓸모 있는 버전은 두 번 남는다는 뜻은 된다. 예시는 제값을 하고, 캐시 자격은 덤으로 따라온다.

그래서 규칙으로 박은 것

if (tokens(prefix) < FLOOR) {
  // never with filler. examples, schema notes, edge cases,
  // anything a reviewer would defend in a code review.
  prefix = prefix + examples(FLOOR - tokens(prefix));
}
assert(tokens(prefix) % 128 === 0);   // do not donate the remainder

마지막 줄 어서션은 장식이 아니다. 캐시 안 되는 나머지가 우리 프롬프트 전반에서 평균 57~69 토큰이고 최대 125 토큰까지 간다. 2,000 토큰짜리 프리픽스의 6% 정도가 매 호출마다, 그 프롬프트가 살아 있는 내내 정가로 청구된다는 소리다. 블록 경계에 딱 맞춰 끝내는 건 아무도 안 주워 가는 공돈이다.

범위는 정직하게 적어둔다. 짧고 기계 채점 가능한 과제 네 묶음, 제공사 하나, 모델 하나다. 패딩이 언제나 안전하다는 걸 보인 게 아니고, 위에 인용한 선행 연구는 긴 문맥 작업에 대한 진짜 경고다. 우리가 보인 건 이 바닥을 넘어서는 비용이 우리 작업 부하에서는 공짜였다는 것이고, 그것만으로 이 바닥은 자연법칙이 아니라 회계상의 변덕이 된다.