[Core] UTF-8 byte 기반 HeuristicTokenEstimator 구현 - #58
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (14)
📝 WalkthroughSummary by CodeRabbit
Walkthrough공개 토큰 추정 계약과 결과 모델을 추가했습니다. UTF-8 바이트 기반 휴리스틱 추정기와 factory를 구현했습니다. 생성된 consumer는 추정 결과와 런타임 classpath를 검증합니다. Changes토큰 추정 기능
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1⚔️ Resolve merge conflicts 💡
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
검토 결과 UTF-8 byte 계산식과 HEURISTIC/TEXT_ONLY 결과 계약은 #31 요구사항을 충족합니다. 다만 현재 구현에는 병합 전에 해결할 두 가지가 있습니다.
첫 번째는 코드 식별자 오류이고, 두 번째는 저장소 규칙 누락이므로 현재는 병합하지 않겠습니다. |
| private static final int BYTES_PER_ESTIMATED_TOKEN = 4; | ||
| private static final String ESTIMATOR_ID = "tokenpilot-utf8-byte-heuristic"; | ||
| private static final String ESTIMATOR_VERSION = "1"; | ||
| private static final String TOKENIZATION_BASIS_ID = "BYTE_LEVEL_BPE_UTF8"; |
There was a problem hiding this comment.
[P2] 추가 확인 결과 BYTE_LEVEL_BPE_UTF8은 이슈에서 허용한 호환성 기준으로 사용할 수 있습니다. 다만 현재 클래스는 실제 BPE merge를 수행하지 않고 UTF-8 byte 길이로 추정하므로, 이 이름만 보면 exact BPE 구현으로 오해할 수 있습니다. Javadoc이나 AGENTS.md에 이 값이 byte-level 안전성 가정이며 exact BPE 구현은 아니라는 점을 명시해 주세요. 계산 로직 자체의 병합 blocker는 아니고 문서 명확화 요청입니다.
| private static final int BYTES_PER_ESTIMATED_TOKEN = 4; | ||
| private static final String ESTIMATOR_ID = "tokenpilot-utf8-byte-heuristic"; | ||
| private static final String ESTIMATOR_VERSION = "1"; | ||
| private static final String TOKENIZATION_BASIS_ID = "BYTE_LEVEL_BPE_UTF8"; |
There was a problem hiding this comment.
추가 확인 결과 UTF-8 byte 기반 계산식과 HEURISTIC/TEXT_ONLY 결과는 #31 요구사항을 충족합니다. BYTE_LEVEL_BPE_UTF8은 이슈에서 허용한 호환성 기준으로 볼 수 있지만, 현재 구현이 실제 BPE merge를 수행하는 것은 아니므로 Javadoc이나 AGENTS.md에 ‘byte-level 안전성 가정이며 exact BPE 구현은 아님’을 명시해 주세요. 새 estimator 기능에 대한 AGENTS.md 갱신도 필요합니다. 두 항목은 문서 보완으로 처리할 수 있으므로 기능상 병합 blocker로 보지는 않겠습니다.
|
재검토 결과 #58의 UTF-8 byte 기반 estimator 구현과 테스트는 #31 요구사항을 충족합니다. BYTE_LEVEL_BPE_UTF8은 이슈에 정의된 호환성 기준으로 사용할 수 있으나 실제 BPE 구현으로 오해하지 않도록 Javadoc에 안전성 가정을 명시해 주세요. 새 기능에 맞춘 AGENTS.md 갱신은 문서 후속 작업으로 남겼습니다. 기능상 병합 blocker는 없다고 판단합니다. |
|
PR #56이 main에 squash 병합된 뒤 이 PR의 head가 이전 main을 기준으로 남아 있어 현재 GitHub에서 mergeable_state=dirty가 되었습니다. 이 PR은 #56의 선행 API를 포함하고 있으므로, 원래 head 저장소(Rigu1/token-ledger)의 브랜치를 최신 tokenpliot/tokenpilot/main 위로 rebase한 뒤 다시 푸시해야 병합할 수 있습니다. 현재는 충돌 해결 전이라 병합하지 않았습니다. AGENTS.md와 basis 설명 보완도 함께 반영해 주세요. |
|
UTF-8 estimator 수정 사항을 통합 PR #59에 반영해 main에 병합했습니다. 이 PR은 중복이므로 닫습니다. |
[Core] UTF-8 byte 기반 HeuristicTokenEstimator 구현
변경 사항
정확한 tokenizer asset 없이 문자열의 token 수를 추정하는
HeuristicTokenEstimator를 Core에 추가했습니다.TokenEstimator를 구현하는 UTF-8 byte 기반 estimator를 추가했습니다.ceil(utf8Bytes / 4)로 계산합니다.safeUpperBoundTokens를 원문의 UTF-8 byte 길이로 제공합니다.HEURISTIC,exact=false,TEXT_ONLY로 생성합니다.tokenpilot-utf8-byte-heuristic으로 고정했습니다.1로 지정했습니다.BYTE_LEVEL_BPE_UTF8로 보존합니다.LedgerComponents를 통해 생성합니다.배경
정확한 tokenizer와 encoding asset이 없는 환경에서도 호출 전에 대략적인 token 수와 보수적인 text-only 상한이 필요합니다.
단순 문자열 길이는 한글이나 surrogate pair 같은 다국어 입력의 실제 UTF-8 크기를 반영하지 못합니다. 또한 JVM의 기본 UTF-8 변환은 잘못된 UTF-16 입력을 replacement character로 대체할 수 있어, 원문과 다른 값을 조용히 계산할 수 있습니다.
이번 변경은 순수 Java API만 사용해 원문의 UTF-8 byte 길이를 계산하고, #30에서 정의한
TokenCountResult로 계산 기준과 범위를 함께 반환합니다.계산 방식
utf8Bytes: 원문을 정규화하지 않은 UTF-8 byte 수tokens:Math.ceilDiv(utf8Bytes, 4)safeUpperBoundTokens:utf8BytesHEURISTICTEXT_ONLYMath.ceilDiv를 사용해(utf8Bytes + 3) / 4의 덧셈 overflow 가능성을 피했습니다.입력 정책
NullPointerException으로 거부합니다.CharsetEncoder와CodingErrorAction.REPORT를 사용해 unpaired surrogate를 명시적으로 거부합니다.Scope
결과 scope는 항상
TEXT_ONLY입니다.다음 request 구성요소는 계산하지 않습니다.
따라서 계산 결과가 context window보다 작더라도 전체 요청의
fits=true근거로 사용할 수 없습니다.REQUEST결과를 생성하거나 기존 결과의 scope를 승격하는 경로도 제공하지 않습니다.범위 메모
이번 PR은 문자열 하나에 대한 UTF-8 휴리스틱 계산만 구현합니다.
TEXT_ONLY결과를 context admission 상태와 연결합니다.체크리스트
필수 테스트
HEURISTIC,exact=false,TEXT_ONLY다.safeUpperBoundTokens가 UTF-8 byte 길이와 같다.Acceptance Criteria
HEURISTIC/TEXT_ONLY임이 테스트와 Javadoc에 고정된다.Closes #31