Service2025.03.22
GitHub - workdd/LLM_Foreign_Block: LLM 모델의 외국어 토큰 생성을 막는 코드 구현
요약
이 레포지토리는 LLM 추론 시 Logit 값을 조정하여 중국어, 일본어, 러시아어와 같은 특정 외국어 토큰의 생성을 차단하는 방법을 구현합니다.
️이 구현 방식은 모델 토크나이저로 변환된 토큰 중 정의된 유니코드 범위에 해당하는 외국어 토큰의 생성 확률을 -inf로 설정하며, 이는 Transformers 및 vLLM 프레임워크에 적용될 수 있습니다.
해당 LogitProcessor는 최초 토큰 생성 시 TTFT를 지연시킬 수 있으므로, 실제 사용 시에는 성능 저하를 방지하기 위한 warm-up 과정이 권장됩니다.
상세 내용
이 레포지토리는 LLM(대규모 언어 모델) 추론 시 특정 외국어 토큰의 생성을 효과적으로 차단하는 방법을 구현하고 있습니다. 특히, 모델의 Logit 값을 조정하여 중국어, 일본어, 러시아어와 같은 특정 언어의 생성을 제한하는 것이 목표입니다. 토큰화 (Tokenization): 모델의 토크나이저를 사용하여 입력 텍스트를 토큰으로 변환합니다. LLM은 이 토큰들을 기반으로 다음 토큰을 예측합니다.
외국어 토큰 식별 (Foreign Token Identification):
* 미리 정의된 유니코드(Unicode) 범위를 활용하여 중국어, 일본어, 러시아어에 해당하는 문자들을 식별합니다. 예를 들어, 중국어는 CJK 통합 한자(CJK Unified Ideographs,
* 모델의 전체 어휘(vocabulary)에서 각 토큰이 이 유니코드 범위 내의 문자에 해당하는지 확인하여 외국어 토큰 목록을 미리 식별합니다. 로짓 처리 (Logit Processing):
* LLM이 다음 토큰에 대한 로짓(logits, 즉 정규화되지 않은 예측 점수)을 생성하면, 이 로짓 벡터에 개입합니다.
* 사전에 식별된 모든 외국어 토큰에 해당하는 로짓 값들을 로 설정합니다. 수학적으로, 로짓 값이 일 때 Softmax 함수를 통해 확률 로 변환되므로, 로 설정하면 해당 토큰의 확률 는 이 됩니다.
* 이 과정을 통해 LLM은 외국어 토큰을 생성할 확률이 이 되므로, 해당 토큰을 선택할 수 없게 됩니다. 결과 생성 (Result Generation): 로짓이 조정된 후, LLM은 차단된 토큰을 제외한 나머지 토큰들 중에서 다음 토큰을 샘플링하여 텍스트를 생성합니다.
핵심 구현 방식 (Core Methodology)
이 차단 메커니즘은 LogitProcessor를 활용하며, 다음 단계를 통해 작동합니다.
0x4E00 ~ 0x9FFF 등), 일본어는 히라가나(0x3040 ~ 0x309F) 및 가타카나(0x30A0 ~ 0x30FF), 러시아어는 키릴 문자(0x0400 ~ 0x04FF) 범위 등을 사용합니다.* 모델의 전체 어휘(vocabulary)에서 각 토큰이 이 유니코드 범위 내의 문자에 해당하는지 확인하여 외국어 토큰 목록을 미리 식별합니다.
* 사전에 식별된 모든 외국어 토큰에 해당하는 로짓 값들을 로 설정합니다. 수학적으로, 로짓 값이 일 때 Softmax 함수를 통해 확률 로 변환되므로, 로 설정하면 해당 토큰의 확률 는 이 됩니다.
* 이 과정을 통해 LLM은 외국어 토큰을 생성할 확률이 이 되므로, 해당 토큰을 선택할 수 없게 됩니다.
파일 구조 및 역할
* blocker_torch.py: PyTorch Tensor 기반으로 외국어 토큰을 식별하고 로짓을 차단하는 핵심 로직을 구현합니다. 정의된 유니코드 범위에 따라 토큰 ID를 필터링합니다.
* transformers_logit_processed.py: Hugging Face transformers 라이브러리의 LogitsProcessor 인터페이스를 사용하여 위에 설명된 외국어 토큰 차단 로직을 LLM 추론 과정에 통합하는 방법을 보여줍니다.
* vllm_logit_processed.py: vLLM 라이브러리 환경에서 LogitsProcessor를 적용하여 외국어 토큰을 차단하는 추론 코드를 제공합니다.
성능 영향
LogitProcessor를 통한 로짓 처리 로직은 LLM 모델의 첫 번째 generate 호출 시, 특히 첫 토큰 생성(TTFT: Time To First Token) 시간에 영향을 미칩니다. Qwen2.5-7B-Instruct 모델 기준으로, 첫 generate 시 TTFT는 약 1534.34ms로 느려지지만, 이후의 generate 호출에서는 약 101.48ms로 빠르게 회복됩니다. 이는 첫 호출 시 토큰 어휘와 유니코드 매핑 작업 등이 수행되기 때문이며, 실제 사용 시에는 한 번의 워밍업(warm-up) 과정이 필요함을 시사합니다.
GitHub
Shared by Anonymous