ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Guardrails 中 RAIL 的 Output 元素:从结构声明到质量校验与纠错动作的完整指南

Guardrails 中 RAIL 的 Output 元素:从结构声明到质量校验与纠错动作的完整指南 AI 安全治理模型安全AI 应用【免费下载链接】guardrailsAdding guardrails to large language models.项目地址https://gitcode.com/gh_mirrors/gu/guardrails点击查看免费下载output元素是 RAILReliable AI markup Language规范的核心它精确描述了大语言模型LLM应返回的最终输出的结构、字段类型、质量标准和失败时的纠正策略。本文基于 Guardrails 仓库中的 docs/how_to_guides/output.md 展开结合 guardrails/schema/rail_schema.py、guardrails/types/rail.py、guardrails/types/on_fail.py 等源码实现系统讲解如何用output声明任意复杂的输出结构、挂载质量校验器、指定on-fail-*纠正动作并理解输出模式如何编译进提示词prompt以及strict模式的行为。读完本文你将能够独立编写一套可运行的结构化输出 RAIL 规范并理解其底层的解析与执行原理。output元素是什么RAIL规范中的output.../output元素用于对 LLM 的期望输出做出精确说明它负责规定四件事期望输出的结构例如 JSON每个字段的类型每个字段被视为“有效”的质量标准例如生成文本应无偏见、生成代码应无 bug质量标准未满足时要采取的纠正动作例如向 LLM 重新提问、过滤违规值、程序化修复等。一个典型例子如下。JSON 形式的 RAIL 规范rail version0.1 output string nametext descriptionThe generated text formattwo-words on-fail-two-wordsreask/ float namescore descriptionThe score of the generated text formatmin-val: 0 on-fail-min-valfix/ object namemetadata descriptionThe metadata associated with the generated text string namekey_1 descriptiondescription of key_1 / ... /object /output /rail对应的期望输出 JSON{ text: string output, score: 0.0, metadata: { key_1: string, ... } }如果只希望 LLM 返回一个简单的字符串则可以直接在output上指定typestringrail version0.1 output typestring descriptionThe generated text formattwo-words on-fail-two-wordsreask / /rail对应输出string output从源码看guardrails/schema/rail_schema.py 中的parse_element在解析output时会读取其type属性并默认为objectelif element.tag output: schema_type: str element.attrib.get(type, RailTypes.OBJECT)随后 rail_string_to_schema 会校验输出类型只能是string、object或list三者之一并把解析结果映射为OutputTypes.STRING/OutputTypes.DICT/OutputTypes.LIST。如果 RAIL 中缺失output元素则会直接抛出ValueError(RAIL must contain a output element!)。指定输出结构你可以通过组合RAIL元素构建任意复杂的输出结构。扁平 JSON 输出在output下并列放置多个标量元素即可rail version0.1 output string namesome_key ..../ integer namesome_other_key ..../ /output /rail{ some_key: string, some_other_key: 0 }带对象的 JSON 输出object元素用于声明 JSON 对象即键值对的集合。关于object有几点需要记住object的子元素代表 JSON 对象中的键。子元素可以是任意 RAIL 元素包括另一个list或object元素键的值由 LLM 根据子元素提供的信息生成。一个object元素可以拥有多个子元素每个子元素都可以是任意 RAIL 元素包括嵌套的list或object。格式化器formatter可以作用于object的子元素。例如若子元素是string可以通过format或validators属性为其中的字符串指定质量标准。rail version0.1 output object namesome_object string namesome_str_key descriptionWhat should the value for this key represent? validatorsguardrails/uppercase; guardrails/two_words / integer namesome_other_key descriptionWhat should this integer represent? validatorsguardrails/valid_range:0 / /object /output /rail{ some_object: { some_str_key: SOME STRING, some_other_key: 0 } }上例中SOME STRING是some_str_key键的值它是 LLM 根据string namesome_str_key ... /元素的name、description和质量标准生成的。注意object元素并不必须有子元素。如果不提供子元素LLM 会根据object元素的name、description和format属性自动生成键和值。提供子元素的价值在于你可以精确控制 LLM 应生成的键和值。带列表的 JSON 输出list元素用于声明一个值列表。要点如下目前list元素只能包含一个子元素即列表只能包含单一类型的数据。例如列表只能全是字符串、或只能全是整数不能同时混有字符串和整数。这个子元素可以是任意 RAIL 元素包括另一个list或object。list的子元素不需要name属性因为列表中的项没有名字。格式化器可以作用于list的子元素。例如子元素是string时可以用format属性为列表中的字符串指定质量标准。rail version0.1 output list namesome_list formatmin-len: 2 string validatorsguardrails/uppercase; guardrails/two_words / /list /output /rail{ some_list: [ STRING 1, STRING 2 ] }注意list元素也不必须有子元素。若未提供子元素LLM 会根据list元素的name、description和format属性自动生成列表值提供子元素则可以更好地控制 LLM 生成的值。源码中对list的约束更加严格parse_element 在解析list时如果子元素数量超过 1 个会直接抛出ValueError(list / RAIL elements must have precisely 1 child element!)0 个子元素时items为空 schemaJSONSchema()恰好 1 个时递归解析该子元素并作为items。字符串输出在output ... /元素上指定typestring即可生成简单字符串所有string元素支持的 formatter 都可以用来声明生成字符串的质量标准rail version0.1 output typestring formattwo-words on-fail-two-wordsreask / /rail输出string outputRAIL 元素RAIL规范的核心是元素的使用。每个元素的标签tag代表一种数据类型例如string ... /的标签代表字符串integer ... /代表整数object .../object代表对象等等。注意RAIL 元素的标签与它所代表的数据的“类型”相同。例如string .../会生成字符串integer .../会生成整数依此类推。支持的类型Guardrails 支持大量数据类型包括string、integer、float、bool、list、object、url、email等。完整列表见 RAIL Data Types。从 guardrails/types/rail.py 的RailTypes枚举可以看到内建标签全集string、integer、float、bool、date、time、date-time、percentage、enum、list、object、choice、case。其中date/time/date-time/percentage在 parse_element 中会被映射为SimpleTypes.STRING并保留对应的内部格式如date-format、time-format、datetime-formatenum元素则通过values属性逗号分隔生成 JSON Schema 的enum列表。标量类型 vs 非标量类型Guardrails 支持两类数据类型标量scalar和非标量non-scalar。标量类型非标量类型标量类型是 void 元素不能包含任何子元素。非标量类型可以是非 void 的可以有闭合标签和子元素。语法string ... /语法list ...string //list示例string、integer、float、bool、url、email等示例list和object是 Guardrails 仅有的两个非标量类型。补充choice与case也以非 void 形式存在它们用于声明带判别器的联合类型discriminated union。在 parse_element 中choice /必须指定discriminator属性case /必须指定name属性否则分别抛出对应的ValueError。支持的属性每个元素可以通过属性来补充关于数据的信息name属性指定字段的名称它将成为输出 JSON 中的键。例如rail version0.1 output string namesome_key / /output /rail{ some_key: ... }description属性指定字段的描述。它类似于提供给 LLM 的提示词可以包含更多上下文以帮助 LLM 生成正确的输出。required属性即将推出指定字段是否必需。若字段必需LLM 会被要求重新生成该字段直到正确若字段非必需生成错误时 LLM 将不会被要求重新生成该字段。从源码看required语义实际上已经生效parse_element 在处理object子元素时会读取child.get(required, true) true并据此填充 JSON Schema 的required列表子元素缺失name属性时匿名子元素会输出 warning 并跳过该子元素。validators属性指定字段应遵守的质量标准。多个质量标准用分号;分隔例如guardrails/uppercase; guardrails/two_words。on-fail-{quality-criteria}属性指定质量标准未满足时的纠正动作。例如on-fail-two-wordsreask表示如果字段不是两个词就要求 LLM 重新生成该字段。完整示例rail version0.1 output string namesome_key descriptionDetailed description of what the value of the key should be requiredtrue validatorsguardrails/uppercase; guardrails/two_words on-fail-guardrails_two_wordsreask on-fail-guardrails_uppercasenoop / /output /rail{ some_key: SOME STRING }注意这里的on-fail-后缀使用 validator 的 rail alias把/替换为_例如on-fail-guardrails_two_words对应guardrails/two_words。这正是 rail_schema.py 的 get_validators 中的做法它会把on-fail-*属性解析为OnFailAction再通过validator.rail_alias.replace(/, _)与具体 validator 匹配未显式指定时默认回退到NOOP。指定质量标准format属性以及等价的validators属性用来为期望输出中的每个字段指定质量标准多个标准之间用分号;分隔。例如rail version0.1 output string nametext descriptionThe generated text validatorsguardrails/uppercase; guardrails/two_words on-fail-guardrails_two_wordsreask / /output /rail上面的示例规定text字段应当是一个两个词的字符串且文本应返回大写形式。质量标准背后的原理在底层format或validators属性会被解析成一个质量标准列表。每个质量标准由一个Validator类支撑负责检查生成输出是否满足该质量标准。例如two-words质量标准由TwoWords类支撑它检查生成输出是否为两个词。随后每个质量标准都会被拿去核对生成输出如果质量标准未满足就会执行on-fail-{quality-criteria}属性指定的纠正动作。补充parse_on_fail_handlers 会遍历元素的所有属性凡是以on-fail-开头的属性都会被解析进on_fail_handlers字典键为去掉前缀后的质量标准名值为OnFailAction枚举。而get_validators则通过 guardrails/utils/validator_utils.py 的get_validator依据guardrails/xxx的注册路径实例化 validator。这一“XML 属性 → Validator 类实例 → 绑定 on_fail 动作”的链路就是 Validator base 类 中on_fail_descriptor字段被赋值的来源。支持的质量标准每个质量标准都只适用于特定的数据类型。例如two-words质量标准只对字符串有意义positive质量标准只对整数和浮点数有意义。查看支持的质量标准完整列表见 Validation 页面。指定纠正动作on-fail-{quality-criteria}属性允许指定质量标准未满足时应采取的纠正动作可选值如下动作行为reask要求 LLM 重新生成一个满足质量标准的输出。用于重问reask的提示词包含关于哪些质量标准失败的信息这些信息由 validator 自动生成。fix以编程方式修复生成输出以使其满足质量标准。例如对于two-wordsformatter程序化fix就是直接取生成字符串的前 2 个词。filter过滤掉不正确的值。它只过滤失败的字段并返回生成输出的其余部分。refrain拒绝返回输出。如果 formatter 的纠正动作是refrain那么失败时返回None而不是 JSON。noop不做任何事。失败仍会被记录到日志中但不采取任何纠正动作。exception校验失败时抛出异常。fix_reask首先对生成输出做确定性修复然后用修复后的输出重新运行校验如果仍然失败则进行 reask。这些动作在 guardrails/types/on_fail.py 的OnFailAction枚举中均有对应成员REASK、FIX、FILTER、REFRAIN、NOOP、EXCEPTION、FIX_REASK、CUSTOM。其中CUSTOM表示失败时调用自定义函数它接收无效值以及在该值上运行的所有 validator 产生的FailResult。仓库中还为这些动作准备了对应的实现模块guardrails/actions/ 下的reask.py、filter.py、refrain.py并有对应的单元测试 tests/unit_tests/actions/、test_filter.py、test_refrain.py。将编译后的 output 元素加入提示词为了让 LLM 生成正确的输出output模式schema需要被编译并加入提示词。这一过程由 Guardrails 库自动完成。output元素可以编译成不同格式用于提示词。目前仅支持透传passthrough编译为XML未来将支持TypeScript等更多编译格式。透传XML编译默认情况下output元素会被编译成XML并加入提示词。编译成XML的过程包括移除所有on-fail-{quality-criteria}属性并把output元素加入提示词。一个编译后的output元素示例rail version0.1 output string nametext descriptionThe generated text validatorsguardrails/uppercase; guardrails/two_words / /output /rail编译后加入提示词的 XMLoutput string nametext descriptionThe generated text / /output可以看到validators与on-fail-*这些仅用于本地校验的属性都被剥离只保留 LLM 生成时需要知道的类型与描述信息。提示词中围绕该模式的引导文案由 guardrails/constants.xml 中的 prompt primitives 提供例如${gr.xml_prefix_prompt}等价于 “Given below is XML that describes the information to extract from this document and the tags to extract it into.”${gr.xml_suffix_prompt}则要求 LLM “Return a valid JSON object that respects this XML format ...”。TypeScript 编译即将推出Coming soon!。不支持的标签与属性默认情况下Guardrails 不会因为你添加了不支持的标签、属性或质量标准而抛出错误。它会将不支持的标签当作字符串处理并且不对该字段执行任何质量检查。由于 LLM 通常会为不支持的标签生成字符串这一行为在实践中很有用。不支持的标签和属性仍会被包含在追加到提示词的输出模式定义中。可以通过设置output元素的strict属性为true来改变这一行为。若strict为true添加不支持的标签、属性或质量标准时 Guardrails 会抛出错误。rail version0.1 output stricttrue unsupported-type ... / /output /rail这会抛出错误❌ Error: Unsupported type: unsupported-type这一“默认宽容、可切换严格”的设计在源码中体现为 parse_element 的 else 分支未识别的标签被当作SimpleTypes.STRING处理保留description与format从而既不会中断解析也不会对该字段做额外质量检查。在 Guard 中实际使用 Output 规范编写好 RAIL 规范后可以通过Guard模块包装 LLM API 调用来获得被校验与纠正的输出。参考 rail.md 中的用法以及 guardrails/guard.py 的Guard.for_rail实现import guardrails as gd # 从一个 .rail 文件创建 Guard 对象 guard gd.Guard.for_rail(path/to/rail/spec.xml) # 用 Guard 包装 LLM API 调用 _, validated_output, *rest guard( openai.Completion.create, **prompt_args, *args, **kwargs, )Guard.for_rail(rail_file)通过rail_file_to_schema解析 RAIL 文件底层即调用rail_string_to_schema见 guardrails/schema/rail_schema.py把output编译成 JSON Schema 并提取 validator 映射表。包装 LLM API 调用后返回的不再是原始文本而是按照 RAIL 规范校验并纠正过的 JSON 对象。若希望直接传入 RAIL 字符串也可使用Guard.for_rail_string(rail_string)见 guardrails/guard.py。相关解析与生成逻辑的测试见 tests/unit_tests/test_rail.py其中覆盖了标量字符串、对象内标量、对象内列表等典型output结构。总结output元素是 RAIL 规范中“保证guarantees”的载体通过元素标签声明类型、通过name/description描述字段、通过validators/format声明质量标准、通过on-fail-*声明失败时的纠正策略。理解它的四层语义——结构、类型、质量、纠错——就能用一份 RAIL 文件同时完成 LLM 输出的结构化约束与自动化校验修复。配合strict严格模式、标量/非标量类型的选择string/object/list及其嵌套组合以及 XML 透传编译进提示词的行为你便可以在此基础上构建出符合生产要求的 Guardrails 应用。赞分享AI 安全治理模型安全AI 应用【免费下载链接】guardrailsAdding guardrails to large language models.项目地址https://gitcode.com/gh_mirrors/gu/guardrails点击查看免费下载相关推荐Guardrails 的 RAIL 规范详解用 XML 定义 LLM 输出结构、质量准则与纠正动作Guardrails 的 RAIL 规范详解用 XML 定义 LLM 输出结构、质量准则与纠正动作 RAIL R eliable AI markup L aAI 安全治理模型安全AI 应用SWE-agent 报 Docker daemon socket permission denied 怎么排查SWE agent 报 Docker daemon socket permission denied 怎么排查 用 SWE agent 跑任务时如果它底层依AI 安全治理模型安全AI 应用AOSaos-ceCapsule.toml 完整编写指南结构、能力声明、IPC ACL 与校验闭环AOSaos ceCapsule.toml 完整编写指南结构、能力声明、IPC ACL 与校验闭环 本文以 aos ce 仓库中 capsule forg上一篇openeuler/scf-security与OpenSSL深度集成打造军工级加密通信通道的终极指南下一篇UniProton安全通信Mbed TLS组件在嵌入式设备中的应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表