본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 05. 20. 13:44

Constrained Text Generation Studio (CTGS)

요약

Constrained Text Generation Studio (CTGS)는 LLM이 특정 음절 수, 금지 문자, 아나그램 등 복잡한 제약 조건을 준수하며 텍스트를 생성할 수 있도록 돕는 AI 글쓰기 보조 도구입니다. 샘플링 단계에서 토큰을 필터링하거나 페널티를 부여하는 방식을 사용하여 미세 조정보다 엄격한 제약 준수와 우수한 퍼플렉시티를 보장합니다. 특히 어휘 무력화 문제를 해결하기 위해 점진적 완화, 연성 제약, 백트래킹 메커니즘을 도입했습니다.

핵심 포인트

  • 샘플링 단계의 필터링 및 페널티 부여를 통해 미세 조정 방식보다 높은 제약 조건 준수율과 퍼플렉시티 달성
  • 어휘 무력화(Vocabulary Crippling) 방지를 위한 점진적 완화(Progressive Relaxation) 기술 적용
  • 제약 강도 조절을 통해 모델의 일관성을 유지하는 연성 제약(Soft Constraints) 기능 제공
  • 생성 중 막다른 길에 도달했을 때 이전 단계로 돌아가는 백트래킹(Backtracking) 메커니즘 구현
  • HuggingFace의 인과적 언어 모델(Causal Language Model)과 호환되는 구조

**Constrained Text Generation Studio (CTGS)**는 취미로 언어학을 공부하는 사람, 시인, 창의적인 작가, 그리고 연구자들이 대규모 언어 모델 (Large Language Models, LLMs)의 제약 조건이 있는 텍스트 생성 (Constrained Text Generation) 능력을 사용하고 연구할 수 있도록 돕는 AI 글쓰기 보조 도구입니다.

CTGS를 사용하면 특정 문자의 사용을 금지하거나, 생성된 단어가 특정 음절 수를 갖도록 강제하거나, 또는 단어가 다른 단어의 부분 아나그램 (Partial Anagrams)이 되도록 강제하는 등 매우 다양한 제약 조건의 조합을 적용하여 텍스트를 생성하거나 선택할 수 있습니다. 이러한 제약 조건들의 일부 목록은 여기에서 확인할 수 있습니다.

각 생성 단계에서 언어 모델은 전체 어휘 (Vocabulary)에 대한 확률 분포로부터 샘플링을 수행합니다. CTGS는 샘플링 단계 이전에 선택된 제약 조건을 위반하는 토큰 (Tokens)을 필터링하거나 페널티를 부여합니다. 이는 미세 조정 (Fine-tuning) 방식에 비해 두 가지 장점을 가집니다:

  • 모델은 (하드 필터링 (Hard Filtering)을 사용할 경우) 부과된 제약 조건을 절대로 위반하지 않으며, 이는 미세 조정만으로는 보장할 수 없는 부분입니다. - 제약 조건이 있는 글쓰기 데이터셋에서, 이 기술은 미세 조정만 사용할 때보다 **엄격하게 우월한 퍼플렉시티 (Perplexity)**를 결과로 보여줍니다.

이전 버전의 CTGS는 근본적인 문제점을 겪었습니다. 제약 조건이 너무 엄격할 경우, top-k/top-p 후보 풀 (Candidate Pool)에서 모든 토큰을 필터링하여 모델이 아무 말도 할 수 없게 만드는 현상이 발생했습니다. 이러한 어휘 무력화 (Vocabulary Crippling) 문제는 다음 세 가지 메커니즘을 통해 해결되었습니다:

점진적 완화 (Progressive Relaxation): 현재의 top-k/top-p 수준에서 제약 조건이 모든 후보를 필터링하여 제외할 경우, CTGS는 후보 풀을 전체 어휘(vocabulary) 범위까지 자동으로 확장합니다 (k를 두 배로 늘리거나 p를 완화). 이는 가능한 토큰이 존재한다면 항상 토큰을 사용할 수 있도록 보장합니다. 연성 제약 (Soft Constraints): 엄격한 통과/실패(pass/fail) 방식의 필터링 대신, 제약 강도(Constraint Strength) 슬라이더를 통해 페널티 기반의 제약을 허용합니다. 강도가 1.0 미만일 경우, 제약을 위반하는 토큰은 완전히 금지되는 대신 확률이 감소합니다. 이는 모델의 일관성 (coherence)을 유지하면서 제약 조건 충족을 유도합니다. 백트래킹 (Backtracking): 다중 토큰 생성 (multi-token generation) 중에 모델이 막다른 길(유효한 토큰이 없음)에 도달하면, 이전 결정 지점으로 백트래킹하여 대안 토큰을 시도합니다. 이는 생성이 중단되는 것을 방지합니다.

CTGS는 데이터셋 및 Gadsby라고 불리는 HuggingFace Space와 함께, COLING 2022에서 공동 개최된 'The Second Workshop on When Creative AI Meets Conversational AI (CAI2)'에서 발표된 논문 "Most Language Models can be Poets too: An AI Writing Assistant and Constrained Text Generation Studio"를 통해 소개되었습니다.

CTGS는 4가지 주요 구성 요소로 이루어져 있습니다: 모델 (model), 제약 엔진 (constraint engine), 필터 (filters), 그리고 **텍스트 변환 (text transforms)**입니다.

CTGS는 HuggingFace에서 사용 가능한 모든 인과적 언어 모델 (causal language model)을 지원하며, 32-bit, 16-bit, 8-bit 정밀도 (precision) 로딩을 지원합니다.

제약 엔진은 제약 조건이 언어 모델과 상호작용하는 방식을 제어하는 세 가지 설정을 제공합니다:

제약 강도 (Constraint Strength) (0.0 - 1.0): 1.0일 때 제약 조건은 하드 필터 (hard filters, 토큰의 통과 또는 실패)로 작동합니다. 1.0 미만일 경우, 제약 조건을 통과하지 못한 토큰은 제거되는 대신 확률 페널티 (probability penalty)를 받습니다. 이는 어휘력 저하 (vocabulary crippling)를 방지하면서도 생성이 제약 조건 충족을 향하도록 유도합니다.

점진적 완화 (Progressive Relaxation): 활성화 시, 제약 필터링을 통과하는 토큰이 너무 적으면 top-k/top-p 후보 풀 (candidate pool)을 자동으로 확장합니다. 전체 어휘 (full vocabulary)로 돌아가기 전에 점진적으로 더 큰 풀을 시도합니다.

최대 백트래킹 (Max Backtracks): 다중 토큰 (multi-token) 생성 중에 막다른 길에 도달했을 때, 시스템이 대안 토큰을 시도하기 위해 백트래킹 (backtrack)하는 횟수입니다.

CTGS는 4개의 카테고리로 분류된 21개의 제약 필터를 보유하고 있습니다. 어떤 조합이든 동시에 적용할 수 있습니다:

어휘적 제약 (Lexical Constraints)

모든 문자 금지 (All Strings Banned) (리포그램 (Lipogram)) - 특정 문자 또는 문자열을 피함
일부 문자 금지 (Any Strings Banned) (약한 리포그램 (Weak Lipogram)) - 지정된 문자/문자열 중 적어도 하나를 피함
모든 문자 필수 (All Strings Required) (역 리포그램 (Reverse Lipogram)) - 특정 문자 또는 문자열이 반드시 나타나도록 강제함
일부 문자 필수 (Any Strings Required) (약한 역 리포그램 (Weak Reverse Lipogram)) - 지정된 문자열 중 적어도 하나가 나타나도록 강제함
특정 위치 문자 (String In Position) - 특정 위치에 특정 문자가 오도록 강제함
문자 시작 (String Starts With) - 토큰이 특정 접두사 (prefix)로 시작하도록 보장함
문자 종료 (String Ends With) - 토큰이 특정 접미사 (suffix)로 끝나도록 보장함
문자 길이 동일 (String Length Equal To) - 정확한 길이 제약
문자 길이 초과 (String Length Greater Than) - 최소 길이 제약
문자 길이 미만 (String Length Less Than) - 최대 길이 제약

음성적 제약 (Phonetic Constraints)

음성 일치 (Phonetic Matching) - Metaphone 알고리즘을 사용하여 토큰을 음성적으로 일치시킴
음절 수 (Syllable Count) - 특정 음절 수를 요구함
운율 (Meter) - 주어진 단어의 강세 패턴 (meter)을 일치시킴
각운 (Rhyme) - 주어진 단어와 각운이 맞는 토큰을 반환함

의미적 제약 (Semantic Constraints)

의미 일치 (Semantic Matching) - FastText 워드 벡터 (word vectors)를 사용하여 의미적으로 유사한 토큰을 찾음
문자 편집 거리 (String Edit Distance) - 레벤슈타인 거리 (Levenshtein distance) 임계값 내의 토큰을 찾음

구조적 제약 (Structural Constraints)

Palindrome (회문) - 토큰이 정방향과 역방향에서 동일하게 읽혀야 함
Anagram (애너그램) - 토큰이 주어진 문자열의 정확한 애너그램이어야 함
Partial Anagram (부분 애너그램) - 토큰이 주어진 문자열의 글자들로 구성될 수 있어야 함
Isogram (이소그램) - 어떤 문자도 N번 이상 나타날 수 없음
Reverse Isogram (역 이소그램) - 모든 문자가 최소 N번 이상 나타나야 함

텍스트 변환 (Text transforms)은 제약 조건 필터링(constraint filtering)이 적용되기 에 토큰에 적용됩니다. 이는 필터링을 통과하여 살아남는 어휘 (vocabulary)의 양을 늘려줍니다:

  • 대문자 (Uppercase) / 소문자 (Lowercase) / 첫 글자 대문자화 (Capitalize first letter)

  • 공백 제거 (Remove spaces) / 왼쪽 공백 제거 (Left strip) / 오른쪽 공백 제거 (Right strip) / 전체 공백 제거 (Full strip)

  • 알파뉴메릭만 (Alphanumeric only) / 알파벳만 (Alphabetic only) / 숫자만 (Digits only) / ASCII만 (ASCII only)

  • 빈 출력 필터링 (Filter blank outputs)

  • Python 3.10+

  • CUDA 지원 GPU 권장 (CPU에서도 작동하지만 더 느림)

git clone https://github.com/Hellisotherpeople/Constrained-Text-Generation-Studio.git
cd Constrained-Text-Generation-Studio
uv sync
...
git clone https://github.com/Hellisotherpeople/Constrained-Text-Generation-Studio.git
cd Constrained-Text-Generation-Studio
pip install -r requirements.txt
...

첫 실행 시 HuggingFace에서 기본 모델 (EleutherAI/pythia-1b)과 FastText 임베딩 (embeddings)을 다운로드합니다. 이는 인터넷 연결 상태에 따라 몇 분 정도 걸릴 수 있습니다.

모델 로딩을 기다립니다 - 모델 설정 (Model Settings) 창에서 로딩 상태를 확인하세요. 상태 텍스트를 통해 모델이 준비되었음을 확인할 수 있습니다. -
텍스트를 입력하거나 붙여넣습니다 - 메인 텍스트 박스에 입력하세요. -
F1 키를 누릅니다 (또는 "Predict New Tokens" 클릭) - 제약 조건을 인식한 제안 (suggestions)을 생성합니다. 텍스트 박스에서 마우스 오른쪽 버튼을 클릭하여 확인할 수 있습니다. -
F2 키를 누릅니다 (또는 "Generate Tokens" 클릭) - 토큰을 직접 자동으로 삽입합니다.

동작
F1새로운 토큰 후보 예측 (우클릭 메뉴에 표시)
F2텍스트에 단일 토큰을 직접 삽입
  • Filters (필터) 창을 열고 탭(Lexical (어휘적), Phonetic (음성적), Semantic (의미적), 또는 Structural (구조적))을 선택합니다. - 제약 조건(constraint)의 체크박스를 선택하여 옵션을 확장합니다.
  • 제약 조건 파라미터를 구성하고 **Apply (적용)**를 클릭합니다. - 여러 제약 조건을 동시에 결합할 수 있습니다.
  • **Reset All Filters (모든 필터 초기화)**를 사용하여 활성화된 모든 제약 조건을 지웁니다.

텍스트 변환(Text Transforms)으로 시작하기: 필터링 전 토큰을 정규화하기 위해 "Full strip (전체 제거)" 및 "Filter blanks (공백 필터링)"를 활성화하십시오. 이는 제약 조건을 통과하는 어휘(vocabulary)를 극적으로 증가시킵니다. Soft Constraints (소프트 제약 조건)를 먼저 사용하기: 초기에는 Constraint Strength (제약 강도)를 0.5-0.8로 설정하십시오. 이는 너무 많은 토큰을 제거하지 않으면서 모델을 제약 조건 쪽으로 유도합니다. 제약 설정이 만족스러워지면 1.0으로 높이십시오. Progressive Relaxation (점진적 완화): 제약 조건이 엄격할 때 막다른 길(dead ends)에 빠지는 것을 방지하기 위해 이 기능을 활성화(기본값) 상태로 유지하십시오. 작은 모델이 더 빠르게 반응합니다: 빠른 반복(iteration)을 위해 distilgpt2 또는 EleutherAI/pythia-160m를 시도한 다음, 품질을 위해 더 큰 모델로 전환하십시오.

Model Settings (모델 설정) 창에 HuggingFace의 인과적 언어 모델(causal language model) 이름을 입력하고 "Load Model (모델 로드)"를 클릭하십시오. 인기 있는 옵션은 다음과 같습니다:

distilgpt2 - 빠르고 작음 (테스트용으로 좋음)
EleutherAI/pythia-160m - 작지만 성능이 있음
EleutherAI/pythia-1b - 기본값, 균형이 좋음
EleutherAI/pythia-2.8b - 더 높은 품질 (더 많은 RAM/VRAM 필요)
meta-llama/Llama-2-7b-hf - 고품질 (GPU + HF 액세스 토큰 필요)

메모리 사용량을 줄이기 위해 더 큰 모델에는 16-bit 또는 8-bit 정밀도(precision)를 사용하십시오.

CTGS는 다음으로 구축되었습니다:

DearPyGUI - 도킹(docking)을 지원하는 데스크톱 GUI 프레임워크
HuggingFace Transformers - 언어 모델 로드 및 추론 (inference)
FastText - 의미적 매칭을 위한 단어 벡터 (word vectors)
pronouncing - 각운(rhyme), 운율(meter), 음절(syllable) 제약을 위한 CMU Pronouncing Dictionary
pyphonetics - 음성적 매칭을 위한 Metaphone 알고리즘
python-Levenshtein - 편집 거리 (edit distance) 계산

이 애플리케이션은 도킹 (docking) 기능이 활성화된 타일링 윈도우 레이아웃 (tiling window layout)을 사용합니다. 즉, 사용자의 선호에 따라 창을 재배치하거나 도킹할 수 있습니다. 인터페이스 곳곳에 있는 녹색 (?) 아이콘 위에 마우스를 올리면 문맥에 맞는 도움말 (contextual help)을 확인할 수 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0