lm-format-enforcer

GitHub
2k 89 简单 1 次阅读 昨天MIT语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

lm-format-enforcer 是一款专为大语言模型设计的输出格式控制工具。它能在模型生成文本的每一步动态筛选允许的字符,确保最终输出严格符合预设的 JSON Schema、正则表达式等格式要求。

在大模型应用中,即使经过精心提示工程,模型仍常出现格式错误(如 JSON 缺括号、字段类型不对),导致后续程序解析失败。lm-format-enforcer 通过底层干预生成过程,从根本上解决了这一痛点,既保证了格式的绝对合规,又最大限度保留了模型的语言表达能力,无需牺牲智能性来换取稳定性。

该工具非常适合开发者、AI 研究人员及工程师使用,尤其是那些需要将大模型集成到自动化工作流、API 服务或数据分析管道中的技术团队。无论您使用的是 Hugging Face Transformers、vLLM、LangChain 还是 llama.cpp,都能轻松接入。

其独特亮点在于支持复杂的嵌套结构、可选字段及数组处理,并兼容批量生成与束搜索(beam search)场景。更贴心的是,它在强制格式的同时,允许模型自由控制空格与换行,使输出既机器可读又保持自然文本的灵活性。安装简单,一行命令即可开启更可靠的模型交互体验。

使用场景

某电商数据团队需要利用大模型从海量非结构化的用户评论中批量提取商品属性(如颜色、尺寸、评分),并将其自动存入数据库。

没有 lm-format-enforcer 时

  • 格式解析频繁失败:模型偶尔会输出多余的开场白或不合法的 JSON 符号(如末尾多逗号),导致后端代码解析报错,需编写复杂的正则清洗逻辑。
  • 字段类型不可控:模型常将“评分”生成为文字描述(如“五星”)而非整数,或遗漏必填字段,迫使开发人员增加额外的校验和重试机制。
  • 处理效率低下:为了保证格式正确,不得不设计繁琐的提示词(Prompt Engineering)并进行多次尝试,显著增加了推理延迟和 Token 消耗。
  • 批处理难以稳定:在并发处理大量评论时,个别格式错误的样本会导致整个批次任务中断,维护成本极高。

使用 lm-format-enforcer 后

  • 输出严格合规:通过预定义 JSON Schema,lm-format-enforcer 在生成每个 token 时实时过滤,确保输出 100% 符合标准 JSON 格式,无需任何后处理清洗。
  • 数据类型精准锁定:强制模型将“评分”仅生成为整数,并保证所有必填字段完整存在,直接对接数据库写入接口。
  • 推理流程简化:移除了复杂的提示词技巧和重试逻辑,单次调用即可得到可用结果,大幅降低了系统延迟和算力成本。
  • 大规模稳定运行:支持批量生成且互不干扰,即使在高并发场景下也能保证每条数据的格式一致性,彻底消除了因格式错误导致的任务中断。

lm-format-enforcer 通过在生成阶段实时约束 token 选择,将大模型从“不可控的文本生成器”转变为“高可靠的结构化数据引擎”。

运行环境要求

操作系统
  • 未说明
GPU
  • 非必需(库本身为纯 Python),但运行示例需 GPU
  • Colab 示例使用 T4
  • auto-gptq 安装示例指定 CUDA 11.8 (cu118)
内存

未说明

依赖
notes该库核心为纯 Python 实现,通过 pip 直接安装即可。GPU 需求取决于所选用的后端模型(如 Llama-2-GPTQ)及是否使用量化库(如 auto-gptq)。README 中的 Colab 示例展示了在 T4 GPU 上运行量化模型的配置,并指定了 CUDA 11.8 的 wheel 源。支持多种集成后端(vLLM, llama.cpp, TensorRT-LLM 等),具体硬件需求视所选后端而定。
python未说明
transformers
torch
huggingface_hub
optimum
pydantic
interegular
lm-format-enforcer hero image

快速开始

语言模型格式强制器

LMFE Logo

强制语言模型的输出格式(JSON Schema、正则表达式等)

在Colab中打开

代码覆盖率 测试

解决方案概览

语言模型能够生成文本,但在需要精确输出格式时,它们并不总是按指示执行。虽然已经提出了多种提示工程技巧来提高生成文本的鲁棒性,但这些方法并不总是足够有效。本项目通过在每个时间步过滤语言模型允许生成的标记,从而确保输出格式得到遵守,同时将对语言模型的限制降至最低。

安装

pip install lm-format-enforcer

基础教程

# 如果在配备T4 GPU的Google Colab上运行,需安装以下依赖。
!pip install transformers torch lm-format-enforcer huggingface_hub optimum
!pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/ 

from pydantic import BaseModel
from lmformatenforcer import JsonSchemaParser
from lmformatenforcer.integrations.transformers import build_transformers_prefix_allowed_tokens_fn
from transformers import pipeline

class AnswerFormat(BaseModel):
    first_name: str
    last_name: str
    year_of_birth: int
    num_seasons_in_nba: int

# 创建一个transformers管道
hf_pipeline = pipeline('text-generation', model='TheBloke/Llama-2-7b-Chat-GPTQ', device_map='auto')
prompt = f'以下是关于迈克尔·乔丹的信息,采用以下JSON模式:{AnswerFormat.schema_json()} :\n'

# 创建一个字符级解析器,并基于它构建transformers前缀允许标记函数
parser = JsonSchemaParser(AnswerFormat.schema())
prefix_function = build_transformers_prefix_allowed_tokens_fn(hf_pipeline.tokenizer, parser)

# 使用前缀函数调用管道
output_dict = hf_pipeline(prompt, prefix_allowed_tokens_fn=prefix_function)

# 提取结果
result = output_dict[0]['generated_text'][len(prompt):]
print(result)
# {'first_name': 'Michael', 'last_name': 'Jordan', 'year_of_birth': 1963, 'num_seasons_in_nba': 15}

功能与优势

  • 适用于任何Python语言模型和分词器。目前已支持transformersLangChainLlamaIndexllama.cppvLLMHaystackNVIDIA TensorRT-LLM以及ExLlamaV2
  • 支持批量生成和束搜索——每个输入或束在每个时间步都可以有不同的标记被过滤。
  • 支持JSON Schema、JSON Mode(无模式)和正则表达式格式。
  • 支持JSON模式中的必填字段和可选字段。
  • 支持JSON模式中的嵌套字段、数组和字典。
  • 允许语言模型自由控制JSON模式中的空格和字段顺序,从而减少幻觉现象。
  • 不修改transformers API的高层循环,因此可在任何场景下使用。

与其他库的比较

功能 语言模型格式强制器 Guidance Jsonformer Outlines
正则表达式
JSON Schema 🟡(可通过部分转换实现)
批量生成
束搜索
集成到现有管道
可选JSON字段
LLM控制JSON字段顺序和空格
包含递归类的JSON Schema
视觉模型支持

发现错误?或者该库已更新新功能?请提交问题!

详细示例

我们创建了一个Google Colab笔记本,其中包含如何使用此库强制llama2输出格式的完整示例,还包括对中间结果的解释。该笔记本可以在Colab的免费GPU运行环境中运行。

在Colab中打开

你也可以在GitHub上查看该笔记本

有关与Hugging Face Transformers集成的不同方式,请参阅单元测试

vLLM 服务器集成

LM Format Enforcer 已集成到 vLLM 推理服务器中。vLLM 包含一个与 OpenAI 兼容的服务器,该服务器具备额外的功能,允许在无需编写自定义推理代码的情况下使用 LM Format Enforcer。

您可以通过添加 vLLM 命令行参数 来在 vLLM 的 OpenAI 服务器中使用 LM Format Enforcer:

python -m vllm.entrypoints.openai.api_server \
  --model mistralai/Mistral-7B-Instruct-v0.2 \
  --guided-decoding-backend lm-format-enforcer

或者,您也可以在每次请求时通过将 guided_decoding_backend 参数与引导解码参数一起添加到请求中来实现:

completion = client.chat.completions.create(
  model="mistralai/Mistral-7B-Instruct-v0.2",
  messages=[
    {"role": "user", "content": "请分类以下情感:LMFE 非常棒!"}
  ],
  extra_body={
    "guided_regex": "[Pp]ositive|[Nn]egative",
    "guided_decoding_backend": "lm-format-enforcer"
  }
)

此外,JSON 模式和选项解码也支持通过 guided_jsonguided_choice 额外参数 实现。

它是如何工作的?

该库通过将字符级解析器和分词器前缀树结合,形成一种智能的标记过滤机制。

某个时间步中字符级解析器和分词器前缀树示例

字符级解析器

将字符串解析为任何格式都可以被视为一种隐式的树结构——在解析过程中的任何时刻,都有一组允许的下一个字符;一旦选择了其中任何一个字符,就会产生一组新的允许的下一个字符,以此类推。

CharacterLevelParser 是一个用于按照这种隐式结构进行解析的接口。add_character()get_allowed_characters() 可以看作是树的遍历方法。

该接口有多种实现:

  • JsonSchemaParser —— 根据 JSON 模式进行解析(或纯 JSON 输出——JsonSchemaParser(None) 将允许任何 JSON 对象)。
  • StringParser —— 强制生成精确的字符串(主要用于诊断)。
  • RegexParser —— 根据正则表达式进行解析。需要注意的是,它不能使用 Python 内置的正则表达式引擎,而是使用手动实现的版本(通过 interegular 库),因此无法完全覆盖所有的正则表达式标准。

分词器前缀树

给定某种语言模型所使用的分词器,我们可以构建该语言模型能够生成的所有标记的前缀树。具体做法是生成所有可能的标记序列,并将其添加到树中。 详情参见 TokenizerPrefixTree

两者的结合

有了字符级解析器和分词器前缀树,我们就可以优雅且高效地过滤出语言模型在下一个时间步中被允许生成的标记: 我们只遍历同时存在于字符级解析节点和分词器前缀树节点中的字符。这样就能找到所有的标记(包括复杂的子词标记,例如 ",",这在 JSON 解析中至关重要)。我们在两棵树上递归执行此操作,并返回所有允许的标记。当语言模型生成一个标记时,我们会根据新字符推进字符级解析器,以便为下一个时间步的过滤做好准备。

这种方法有何不同?为什么它更好?

这并不是第一个用于强制语言模型输出格式的库。然而,其他类似的库(如 Guidance、JsonFormer 和 Outlines)会强制要求严格的输出格式。这意味着语言模型无法控制空格、字段的可选性以及字段的顺序(以 JSON 为例)。虽然这对人类来说似乎无关紧要,但这意味着语言模型可能不会生成它“想要”的 JSON 格式,从而导致其内部状态处于次优值,进而降低后续时间步的输出质量。

这就迫使语言模型的使用者必须了解他们所使用的语言模型的具体细节(例如,JSON 是否在预训练之前就已经被压缩过?),并修改相关库以生成精确的格式。

而我们则通过扫描潜在的下一个标记,并允许任何能够被解析为所需输出格式的标记序列来避免这一问题。这意味着语言模型可以自主控制这些方面,以最自然的方式输出与其风格相符的标记序列,而无需开发者深入了解底层细节。

诊断 - 我是否总能获得良好的结果?

使用该库可以确保输出符合指定格式,但并不能保证语义上的正确性。强制语言模型遵循特定的输出格式可能会导致幻觉现象增多。通过提示工程引导模型仍然更有可能改善结果。

为了帮助您理解格式强制带来的激进性,如果您在调用 generate_enforced() 时,在 kwargs 中传递 output_scores=Truereturn_dict_in_generate=True(这些都是 transformers 库中已有的可选参数),您还将得到一个逐 token 的数据框,显示每个被选择的 token、其得分,以及如果不应用格式强制的话原本会被选择的 token 是什么。如果发现格式强制器迫使语言模型选择了权重非常低的 token,这很可能是导致结果不佳的原因之一。您可以尝试修改提示,以引导语言模型避免让格式强制器过于激进。

以下是一个使用正则表达式格式 Michael Jordan was Born in (\d)+. 的示例:

idx generated_token generated_token_idx generated_score leading_token leading_token_idx leading_score
0 29871 1.000000 29871 1.000000
1 Michael 24083 0.000027 ▁Sure 18585 0.959473
2 ▁Jordan 18284 1.000000 ▁Jordan 18284 1.000000
3 ▁was 471 1.000000 ▁was 471 1.000000
4 ▁Born 19298 0.000008 ▁born 6345 1.000000
5 ▁in 297 0.994629 ▁in 297 0.994629
6 29871 0.982422 29871 0.982422
7 1 29896 1.000000 1 29896 1.000000
8 9 29929 1.000000 9 29929 1.000000
9 6 29953 1.000000 6 29953 1.000000
10 3 29941 1.000000 3 29941 1.000000
11 . 29889 0.999512 . 29889 0.999512
12 </s> 2 0.981445 </s> 2 0.981445

从表中可以看出,模型“想要”用 Sure 开头,但格式强制器却迫使其使用了 Michael——在第 1 个 token 处出现了较大的差距。此后,几乎所有的领先得分都落在允许的 token 集合内,这意味着模型可能并未因 token 强制而产生幻觉。唯一的例外是第 4 个时间步——“Born”被强制出现,而 LLM 原本希望选择的是“born”。这对提示工程师来说是一个提示:可以将提示中的 “Born” 改为小写的 “born”。

配置选项

LM Format Enforcer 使用多种启发式方法来避免语言模型生成结构化输出时可能出现的边缘情况。 有两种方式可以控制这些启发式方法:

选项 1:通过环境变量

有几个环境变量可以设置,它们会影响库的行为。这种方法在不希望修改代码时很有用,例如通过 vLLM OpenAI 服务器使用该库时。

  • LMFE_MAX_CONSECUTIVE_WHITESPACES - 解析 JsonSchema 对象时允许的最大连续空格数。默认值:12。
  • LMFE_STRICT_JSON_FIELD_ORDER - JsonSchemaParser 是否应强制属性按照 JsonSchema 的 required 列表中的顺序出现?(注意:这与 Pydantic 模型中的声明顺序一致)。默认值:False。
  • LMFE_MAX_JSON_ARRAY_LENGTH - 如果模式未指定,则 JSON 数组的最大长度是多少。有助于防止 LLM 进入无限循环。默认值:20。
  • LMFE_DEFAULT_ALPHABET - 默认使用的允许字符集是什么?请参阅 consts.py 了解默认值。可以覆盖并扩展以包含特定语言的字符。如果您希望这些字符作为 JsonSchemaParser 中的 JSON 键或枚举值出现,则需要此设置。

选项 2:通过 CharacterLevelParserConfig 类

当通过代码使用该库时,任何 CharacterLevelParser(如 JsonSchemaParserRegexParser 等)的构造函数都会接收一个可选的 CharacterLevelParserConfig 对象。

因此,要配置单个解析器的启发式方法,只需实例化一个 CharacterLevelParserConfig 对象,修改其值,并将其传递给 CharacterLevelParser 的构造函数。

已知问题和限制

  • LM Format Enforcer 需要 Python API 来处理语言模型的输出 logits。这意味着在 API 尚未扩展之前,它无法与 OpenAI ChatGPT 及类似基于 API 的解决方案一起使用。
  • 正则表达式语法并非 100% 支持。有关详细信息,请参阅 interegular
  • LM Format Enforcer 的正则表达式解析器只能生成存在于分词器词汇表中的字符。这一点可能会在后续版本中得到解决,详情请参见 GitHub 上的议题

贡献者及贡献方式

有关贡献者列表,请参阅 CONTRIBUTORS.md

版本历史

v0.11.22025/08/09
v0.11.12025/08/08
v0.10.122025/08/04
v0.10.112025/02/26
v0.10.102025/02/15
v0.10.92024/10/16
v0.10.82024/10/16
v0.10.72024/09/07
v0.10.62024/08/05
v0.10.52024/07/27
v0.10.42024/07/15
v0.10.32024/06/20
v0.10.22024/05/17
v0.10.12024/05/04
v0.9.102024/05/03
v0.9.92024/04/24
v0.9.82024/04/20
v0.9.72024/04/20
v0.9.62024/04/19
v0.9.32024/03/13

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架