Constrained-Text-Generation-Studio
21种语言学约束过滤器 + 渐进式放松,让大语言模型秒变职业诗人,支持禁字母写作、押韵、音节等复杂约
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
21种语言学约束过滤器 + 渐进式放松,让大语言模型秒变职业诗人,支持禁字母写作、押韵、音节等复杂约
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你可能见过 AI 写新闻、写代码、甚至写小说,但你见过 AI 严格遵守"禁止字母 E"的约束来创作一整段文字吗?这听起来像是文字游戏,但实际上这背后涉及到 NLP 领域一个极其困难的问题——受约束文本生成(Constrained Text Generation)。
Constrained Text Generation Studio(简称 CTGS)正是为解决这一问题而生的桌面工具。它让任何人都能通过简单的图形界面,指挥大语言模型按照各种语言学约束来生成文本——从禁用什么字母、押什么韵,到音节数、韵律模式,全部可以自由配置。这个项目在 2022 年的 COLING 会议上发表,引发了学术界和工业界的双重关注。

图1:CTGS 主界面,支持多窗口可停靠布局,绿色问号图标提供实时帮助
CTGS 的诞生源于一个令人深思的实验。1939 年,作家 Ernest Vincent Wright 出版了一本名为 Gadsby 的小说,全书 5 万余词,没有一个字母 E。这本书是人类文学史上的一个奇观,也引发了 AI 研究者的强烈好奇:如果让大语言模型来完成同样的任务,它能做到吗?
2022 年,研究者 Adam Roush 在 COLING 2022 会议(与 CAI2 研讨会联合举办)上发表了这篇论文,系统性地探讨了 LLM 在受限文本生成方面的能力。论文标题「Most Language Models can be Poets too」直接点明了核心观点:大多数语言模型在适当的约束处理机制下,都能成为诗人。
CTGS 正是这篇论文的开源实现。它不仅包含一个功能完整的桌面应用,还附带了 Lipogram-e 数据集(专门用于测试禁字母约束的数据集),以及一个配套的 HuggingFace Space 在线演示(名为 Gadsby)。研究者和普通用户都可以方便地使用这套工具。
CTGS 的核心技术思路非常巧妙:不是在模型的权重层面施加约束,而是在 token 采样之前对候选词进行过滤或惩罚。具体来说,每次生成一个 token 时,模型会给整个词表中的每个词打一个概率分数,CTGS 在采样之前会检查每个候选 token 是否违反了用户设定的约束,不符合的 token 直接被过滤掉(硬约束)或降低概率(软约束)。
这种方法相比传统的微调方案有两个显著优势:
第一,约束保证严格。使用硬过滤时,模型永远不会生成违反约束的 token,这在微调方案中是很难保证的。
第二,困惑度更优。在受限写作数据集上,这种后处理过滤方法的困惑度(perplexity)严格优于单独使用微调的结果——这意味着模型在遵守约束的同时,文本仍然保持很高的自然度和流畅性。
早期版本的 CTGS 面临一个根本性问题:当约束过于严格时,过滤操作会把 top-k/top-p 候选池中的所有 token 都筛掉,导致模型无词可用——作者称之为「词汇瘫痪」(vocabulary crippling)。为解决这个问题,CTGS v2.0 引入了三项机制:
渐进式放松(Progressive Relaxation):当约束过滤掉所有当前 top-k/top-p 池中的 token 时,系统自动扩大候选池(逐次翻倍 k 值、放宽 p 值),直到扩展到完整词表。只要词表中存在任何满足约束的 token,生成就不会中断。
软约束(Soft Constraints):Constraint Strength 滑块允许用户在 0.0 到 1.0 之间调节。设为 1.0 时是完全的硬过滤;低于 1.0 时,违反约束的 token 会被降低概率而非完全禁用,从而在引导生成方向和保持模型连贯性之间取得平衡。
回溯(Backtracking):在多 token 生成过程中,如果遇到死胡同(没有有效 token 可选),系统会回溯到上一个决策点,尝试其他候选 token。这种机制防止生成过程卡死。
CTGS 的约束引擎支持 21 种不同的约束过滤器,分为四大类,可任意组合同时启用:
词汇约束(Lexical):禁止特定字母或字符串(Lipogram)、强制包含某些字母/字符串、限制字符出现在特定位置、控制字符串长度范围等。
语音约束(Phonetic):使用 Metaphone 算法做语音匹配、控制音节数量、匹配韵律模式(meter)、查找押韵词。
语义约束(Semantic):利用 FastText 词向量做语义相似度匹配、控制 Levenshtein 编辑距离。
结构约束(Structural):回文检测、完全同字母异序(Anagram)、部分同字母异序(Partial Anagram)、等频字母词(Isogram)、反向等频字母词。

图2:CTGS 的约束选择界面,四大类别(Lexical/Phonetic/Semantic/Structural)可同时组合使用
CTGS 的代码架构非常清晰,核心组件只有四个:模型层(Model)、约束引擎(Constraint Engine)、过滤器(Filters)和文本转换器(Text Transforms)。
GUI 框架:采用 DearPyGUI,这是 Python 生态中少有的高性能桌面 GUI 框架,支持现代停靠布局(docking)和多窗口系统。CTGS 的主界面由多个可拖拽、可停靠的窗口组成,包括主文本窗口、约束配置窗口、模型设置窗口和词汇分析窗口。
模型层:基于 HuggingFace Transformers,支持加载任何因果语言模型(causal LM)。支持 32 位、16 位和 8 位精度加载,配合 bitsandbytes 可实现 8-bit 量化推理,大幅降低 VRAM 需求。首次运行时会自动从 HuggingFace Hub 下载默认模型(EleutherAI/pythia-1b,约 1B 参数)和 FastText 词向量模型。
约束引擎:核心实现在 passes_all_constraints() 函数中,使用 Python dataclass ConstraintState 管理所有约束状态。对每个候选 token,引擎会依次检查所有启用的约束条件,一旦有任何约束不满足就立即返回 False(early-return 优化)。
文本转换器:在约束过滤之前,对 token 文本进行标准化处理(大小写转换、去空格、ASCII 过滤等),可以显著增加通过约束的 token 数量——因为许多约束对规范化后的文本进行检查,而非原始文本。
分析模块:AnalysisState dataclass 记录每次生成的结果(通过 token、失败 token、按约束分类统计),无需额外模型调用即可呈现可视化的约束满足情况,帮助用户理解模型的决策过程。

图3:CTGS 的主文本编辑窗口,支持 F1 预测候选词(右键菜单)和 F2 直接插入
CTGS 要求 Python 3.10+,推荐使用 NVIDIA GPU(8GB+ VRAM)。CPU 模式可用但推理速度较慢。作者推荐使用 uv 包管理器(比 pip 更快更可靠),但也支持 pip 安装。
git clone https://github.com/Hellisotherpeople/Constrained-Text-Generation-Studio.git
cd Constrained-Text-Generation-Studio
# 推荐方式
uv sync
uv run python Constrained-Text-Generation-Studio.py
# pip 方式
pip install -r requirements.txt
python Constrained-Text-Generation-Studio.py
首次启动时,程序会自动从 HuggingFace Hub 下载 pythia-1b 模型和 FastText 词向量,根据网络状况可能需要数分钟。
CTGS 支持任意 HuggingFace 因果语言模型,作者推荐从以下模型开始,逐步升级:
| 模型 | 特点 | VRAM 需求 |
|---|---|---|
| distilgpt2 | 快速,小巧,适合快速迭代测试 | ~1GB |
| EleutherAI/pythia-160m | 小巧但能力较强 | ~1GB |
| EleutherAI/pythia-1b | 默认模型,质量和速度平衡 | ~3GB |
| EleutherAI/pythia-2.8b | 更高质量 | ~6GB |
| meta-llama/Llama-2-7b-hf | 高质量 | ~14GB,需 HF token |
作者总结了以下使用建议,可显著提升体验:
先开文本转换:启用「Full strip」(全量去除空格和特殊字符)和「Filter blanks」(过滤空白输出)作为预处理步骤,可以大幅增加通过约束的 token 候选数量。这是提升成功率最简单的手段。
先用软约束:初期将 Constraint Strength 设为 0.5-0.8,引导模型方向但不切断所有不合格 token,等约束配置满意后再提高到 1.0 启用硬过滤。
保持渐进式放松开启:默认启用的 Progressive Relaxation 能在约束过于严格时自动兜底,避免无词可用的尴尬情况。
CTGS 作为一款 2022 年的研究原型工具,在产品化方面仍有不少局限:
无 Web 接口:纯桌面 GUI(DearPyGUI),不支持远程访问。对于服务器部署场景,用户需要通过 VNC 或 SSH + X11 Forwarding 方式访问,较为繁琐。这也是其 quick_deploy=unsupported 的核心原因。
无容器化支持:没有 Dockerfile 或 docker-compose.yml,无法通过容器一键部署。这对于希望在云服务器上运行的用户是一个显著障碍。
GPU 强依赖:虽然 CPU 可用,但大模型推理在 CPU 上极慢,实际使用几乎必须 GPU。对于没有 NVIDIA 显卡的用户而言门槛较高。
不支持流式输出:每次生成需要等待完整推理,无法实时看到 token 逐个生成的过程。
CTGS 的价值不仅在于工具本身,更在于它揭示了一个重要事实:大语言模型本身在约束遵循方面的能力远比人们预期的要好。过去很多研究者认为,要让 LLM 遵守复杂语言约束必须进行昂贵的微调,但 CTGS 的实验表明,通过简单的后处理过滤,就能在保持高质量输出的同时严格遵守约束。

图4:CTGS 的词库分析视图,展示哪些候选词满足当前所有约束条件,颜色区分通过/失败
这一发现对以下场景具有直接应用价值:
诗歌与歌词创作:韵律、音节、押韵约束可以被精确施加,AI 辅助诗歌写作从此有了可靠的技术手段。
密码学与文字游戏:各类字母游戏(如禁字母写作、回文、字母方阵)都可以借助 CTGS 来验证 AI 的生成能力。
教育与语言学研究:研究不同语言模型在约束下的表现差异,探索语言的多样性和规律性。
专业文档生成:在需要强制包含或排除特定术语的合规文档生成场景中,约束机制可以保证输出的准确性。
Constrained Text Generation Studio 是一款将学术研究与工程实践完美结合的开源工具。它以直观的桌面 GUI 让复杂的约束文本生成技术变得人人可及,21 种约束过滤器覆盖了语言学约束的主要维度,渐进式放松和软约束机制则解决了约束过严导致的生成卡死问题。
虽然缺少 Web 接口和容器化支持限制了其在服务器场景的部署,但它在本地桌面环境下为创意写作者、语言学研究者和 NLP 研究人员提供了一个强大且灵活的实验平台。如果你对 AI 诗歌创作、约束语言生成或 LLM 可控性有兴趣,CTGS 绝对值得一试。
项目信息