구조화된 데이터에서 LLM 프롬프트 토큰을 손실 없이 줄이는 방법
요약
ctxfold는 로그, JSON, CSV와 같은 구조화된 데이터의 토큰을 손실 없이 줄여주는 경량 도구입니다. 의미론적 요약 대신 구조적 재인코딩 방식을 사용하여 데이터 손실 없이 토큰을 약 35~40% 절감합니다.
핵심 포인트
- 의미론적 압축과 달리 데이터 손실이 전혀 없는 무손실(Lossless) 방식 제공
- 반복되는 구조를 헤더로 추출하여 토큰 사용량을 35~40% 절감
- API 호출이나 외부 의존성 없이 작동하는 순수 텍스트 변환 도구
- 인코더와 디코더의 검증을 통해 데이터 재현성을 코드 수준에서 보장
구조화된 데이터에서 LLM 프롬프트 토큰을 손실 없이 줄이는 방법
로그, JSON, CSV를 단 1바이트도 놓치지 않고 프롬프트 내에서 축소할 수 있는 의존성 없는 작은 도구
로그, JSON, CSV는 우리가 LLM에 입력하는 데이터 중 가장 부피가 크고 반복적인 요소들입니다. 또한 프롬프트 토큰 (prompt-token) 비용이 조용히 쌓이는 주범이기도 합니다.
손실 압축 (lossy compression)의 문제점
일반적인 해결책은 **의미론적 압축 (semantic compression)**입니다. 모델이 입력을 요약하고 "정보량이 낮은" 토큰을 삭제하도록 하는 방식입니다. 이 방식은 효과가 있지만, 질문이 삭제된 데이터를 필요로 하는 순간 문제가 발생합니다.
다음과 같이 질문한다고 가정해 봅시다:
"이 로그에 에러가 몇 개 있나요?"
"이 400개 행의 총합은 무엇인가요?"
…이때 손실 압축기는 확신에 찬 틀린 답변을 내놓을 수 있습니다. 왜냐하면 압축기가 삭제한 행들이 바로 당신이 필요로 했던 행들이었기 때문입니다. 압축 결과는 훌륭해 보일지 모르지만, 답변은 망가집니다.
다른 선택지: 무손실(lossless) 또는 무작위 동작 없음(no-op)
ctxfold는 정반대의 접근 방식을 취합니다. 이 도구의 단 하나의 규칙은 다음과 같습니다:
무손실(Lossless)이거나, 아니면 아무것도 하지 않거나(no-op). 절대 손실(lossy)이 있어서는 안 된다.
요약하는 대신, ctxfold는 _구조 (structure)_를 재인코딩합니다. 로그, JSON 배열, CSV는 변장한 테이블과 같습니다. 동일한 키(key), 접두사(prefix), 템플릿이 모든 행에서 반복됩니다. ctxfold는 이러한 반복되는 부분을 일회성 헤더(header)로 끌어올리고, 행마다 변하는 부분만 남겨 모델이 직접 읽을 수 있는 컴팩트하고 자체 라벨링된 테이블을 생성합니다. 어떠한 데이터도 삭제되지 않습니다.
이 보장은 코드 수준에서 강제됩니다. 모든 인코더(encoder)는 디코더(decoder)와 함께 제공되며, compress() 함수는 출력을 디코딩했을 때 입력값이 그대로 재현되는지 확인한 후에 결과를 반환합니다. 만약 재현할 수 없다면, 수정되지 않은 원래 텍스트를 그대로 돌려받게 됩니다. 이 도구는 데이터를 손상시킬 수 없습니다. 최악의 경우, 아무것도 하지 않을 뿐입니다.
모델이 여전히 읽을 수 있는가?
네, 그렇습니다. 실제 데이터에서 ctxfold는 템플릿화된 로그와 JSON 배열의 토큰을 약 35~40% 절감하면서도 완전히 무손실을 유지합니다. 또한 출력값이 평문(plain text) 형태의 라벨링된 텍스트이기 때문에, 모델은 원본 입력만큼이나 잘 읽어들입니다. GPT-4o-mini를 대상으로 한 조회 테스트(lookup tests) 결과, 압축된 형태에서의 답변은 원본 데이터에서의 답변과 필드별로 일치했습니다.
(가독성은 GPT-4o-mini에서 검증되었습니다; 손실 없는 보장은 모델에 독립적입니다.)
사용해 보기
npm install ctxfold
const { compress } = require("ctxfold");
const { text, stats } = compress(bigLogOrJsonOrCsv);
...
이것은 순수 텍스트 변환(text transform)입니다. API 호출도, 모델도, 의존성(dependencies)도 없으므로 어떤 LLM과도 함께 작동합니다.
대체재가 아닌 — 나머지 절반
ctxfold는 의미론적 압축 (semantic compression)의 경쟁자가 아니라 보완재입니다. 부분 집합을 추출하기 위해 요약(Summarize)하고, 아무것도 잃지 않으면서 반복을 줄이기 위해 ctxfold를 사용하세요. ctxfold는 산문(prose)이 아닌 구조화된 데이터 (structured data)에서 빛을 발합니다.
제작 동기
이 프로젝트는 단순한 좌절감에서 시작되었습니다. 손실이 발생하는 프롬프트 압축기 (lossy prompt compressors)들은 인상적인 토큰 절감 효과를 보여주었지만, 집계 질문(aggregate questions) — 개수, 합계, "이 레코드 찾기" 등 — 에 대해서는 답변이 틀리게 돌아왔습니다. 답변에 필요한 데이터가 요약 과정에서 사라졌기 때문입니다. 훌륭한 압축이었지만, 결과는 망가진 상태였습니다. 해결책은 더 똑똑한 요약기를 만드는 것이 아니었습니다. 데이터를 아예 떨어뜨리지 않는 것이었습니다. 반복적인 구조화된 텍스트는 손실 없이 (losslessly) 압축할 수 있습니다. 단지 그것을 산문이 아닌 구조로 취급하기만 하면 됩니다.
만약 여러분이 많은 양의 로그, JSON, 또는 CSV를 프롬프트에 밀어 넣고 있다면, 여러분의 페이로드 (payloads)가 어떤 형태인지, 그리고 손실 없는 트레이드오프 (lossless tradeoff)가 여러분의 유스케이스 (use case)에 맞는지 진심으로 알고 싶습니다. 현재 여러분의 프롬프트에서 가장 많은 토큰을 잡아먹고 있는 것은 무엇인가요? 질문, 비판, 그리고 이를 망가뜨리는 예외 케이스 (edge cases) 모두 댓글로 환영합니다.
Repo & docs: https://github.com/antrixy/ctxfold · npm: npm install ctxfold · MIT 라이선스.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기