终极AI输出格式控制:lm-format-enforcer完全指南
终极AI输出格式控制lm-format-enforcer完全指南【免费下载链接】lm-format-enforcerEnforce the output format (JSON Schema, Regex etc) of a language model项目地址: https://gitcode.com/gh_mirrors/lm/lm-format-enforcerlm-format-enforcer是一款强大的工具能够强制语言模型LM输出符合特定格式如JSON Schema、正则表达式等的内容同时最大限度减少对模型自由度的干扰。无论您是AI应用开发者还是研究人员这款工具都能帮助您获得可靠、结构化的模型输出。为什么需要AI输出格式控制语言模型虽然能够生成流畅的文本但在需要精确输出格式时往往表现不稳定。各种提示工程技术虽然能改善生成文本的鲁棒性但并不总能满足严格的格式要求。lm-format-enforcer通过在每个时间步过滤模型允许生成的标记确保输出格式得到遵守同时最大程度保留模型的表达能力。核心功能与优势lm-format-enforcer提供了多项强大功能使其在众多格式控制工具中脱颖而出广泛兼容性适用于任何Python语言模型和分词器已支持transformers、LangChain、LlamaIndex、llama.cpp、vLLM、Haystack、NVIDIA TensorRT-LLM和ExLlamaV2等主流框架。多格式支持支持JSON Schema、JSON模式无模式和正则表达式格式满足不同场景的需求。高级特性支持批处理生成和 beam 搜索每个输入或 beam 可以在每个时间步过滤不同的标记支持JSON模式中的必填和可选字段以及嵌套字段、数组和字典。灵活性允许语言模型控制JSON模式中的空格和字段顺序减少幻觉现象不修改transformers API的高层循环可在任何场景中使用。快速安装指南安装lm-format-enforcer非常简单只需使用pip命令pip install lm-format-enforcer基础使用教程下面是一个基本示例展示如何使用lm-format-enforcer强制模型输出符合特定JSON Schema的内容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 pipeline hf_pipeline pipeline(text-generation, modelTheBloke/Llama-2-7b-Chat-GPTQ, device_mapauto) prompt fHere is information about Michael Jordan in the following json schema: {AnswerFormat.schema_json()} :\n # 创建字符级解析器并构建transformers前缀函数 parser JsonSchemaParser(AnswerFormat.schema()) prefix_function build_transformers_prefix_allowed_tokens_fn(hf_pipeline.tokenizer, parser) # 使用前缀函数调用pipeline output_dict hf_pipeline(prompt, prefix_allowed_tokens_fnprefix_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}与其他库的比较lm-format-enforcer在多个关键方面优于其他类似库功能LM Format EnforcerGuidanceJsonformerOutlines正则表达式✅✅❌✅JSON Schema✅ (部分支持)✅✅批处理生成✅❌❌✅Beam Search✅❌❌✅集成现有pipeline✅❌❌✅可选JSON字段✅❌❌❌LLM控制JSON字段顺序和空格✅❌❌❌递归类JSON Schema✅❌✅❌视觉模型支持✅✅❌❌vLLM服务器集成lm-format-enforcer已集成到vLLM推理服务器中。vLLM包含一个OpenAI兼容服务器添加了使用lm-format-enforcer的功能无需编写自定义推理代码。使用vLLM OpenAI服务器时可以通过添加vLLM命令行参数来使用lm-format-enforcerpython -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( modelmistralai/Mistral-7B-Instruct-v0.2, messages[ {role: user, content: Classify this sentiment: LMFE is wonderful!} ], extra_body{ guided_regex: [Pp]ositive|[Nn]egative, guided_decoding_backend: lm-format-enforcer } )工作原理lm-format-enforcer通过将字符级解析器和分词器前缀树结合到智能标记过滤机制中来工作字符级解析器将字符串解析为任何类型的格式化程序可以看作是一种隐式树结构——在解析过程的任何时刻都有一组允许的下一个字符如果选择了其中任何一个就会有一组新的允许的下一个字符依此类推。CharacterLevelParser是根据这种隐式结构进行解析的接口。add_character()和get_allowed_characters()可以看作是树遍历方法。该接口有几种实现JsonSchemaParser - 根据json模式进行解析或纯json输出 - JsonSchemaParser(None)将允许任何json对象。StringParser - 强制使用精确字符串主要用于诊断RegexParser - 根据正则表达式进行解析。分词器前缀树给定某个语言模型使用的分词器我们可以构建该语言模型可以生成的所有标记的前缀树。这是通过生成所有可能的标记序列并将它们添加到树中来完成的。两者结合给定字符级解析器和分词器前缀树我们可以优雅而高效地过滤语言模型在下一个时间步允许生成的标记我们只遍历同时存在于字符级解析节点和分词器前缀树节点中的字符。这使我们能够找到所有标记包括复杂的子词标记如在JSON解析中至关重要的,。我们在两棵树上递归地执行此操作并返回所有允许的标记。当语言模型生成标记时我们根据新字符推进字符级解析器为过滤下一个时间步做好准备。配置选项lm-format-enforcer使用多种启发式方法来避免LLM生成结构输出时可能出现的边缘情况。有两种方法可以控制这些启发式方法选项1通过环境变量可以设置几个环境变量影响库的操作。当您不想修改代码时例如通过vLLM OpenAI服务器使用库时此方法非常有用。LMFE_MAX_CONSECUTIVE_WHITESPACES - 解析JsonSchemaObjects时允许的连续空格数。默认值12。LMFE_STRICT_JSON_FIELD_ORDER - JsonSchemaParser是否强制属性以与JsonSchema的required列表中出现的相同顺序出现注意这与Pydantic模型中的声明顺序一致。默认值False。LMFE_MAX_JSON_ARRAY_LENGTH - 如果模式未指定最大JSON数组长度是多少。帮助LLM避免无限循环。默认值20。LMFE_DEFAULT_ALPHABET - 默认使用什么字母表作为允许的字符选项2通过CharacterLevelParserConfig类当通过代码使用库时任何CharacterLevelParserJsonSchemaParser、RegexParser等构造函数都接收一个可选的CharacterLevelParserConfig对象。因此要配置单个解析器的启发式方法请实例化一个CharacterLevelParserConfig对象修改其值并将其传递给CharacterLevelParser的构造函数。诊断功能使用此库可确保输出符合格式但不能保证输出在语义上是正确的。强制语言模型符合特定输出可能会导致幻觉增加。通过提示工程指导模型仍然可能改善结果。为了帮助您了解格式强制导致的侵略性如果您在generate_enforced()的kwargs中传递output_scoresTrue和return_dict_in_generateTrue这些是transformers库中现有的可选参数您还将获得一个逐标记的数据框显示选择了哪个标记、其分数以及如果不应用格式强制本来会选择的标记。如果您看到格式强制器迫使语言模型选择权重非常低的标记这很可能是导致结果不佳的原因。尝试修改提示以引导语言模型不要迫使格式强制器如此侵略。如何开始使用要开始使用lm-format-enforcer首先克隆仓库git clone https://gitcode.com/gh_mirrors/lm/lm-format-enforcer然后参考项目中的示例和文档特别是samples目录中的Colab笔记本如colab_llama2_enforcer.ipynb了解如何在实际场景中应用lm-format-enforcer。无论您是构建需要可靠JSON输出的AI应用还是需要确保模型遵循特定格式约束lm-format-enforcer都能为您提供强大而灵活的解决方案让您的AI系统更加可靠和可控。【免费下载链接】lm-format-enforcerEnforce the output format (JSON Schema, Regex etc) of a language model项目地址: https://gitcode.com/gh_mirrors/lm/lm-format-enforcer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考