大型语言模型(LLM)能够灵活响应自然语言请求,但这种灵活性本身也可能带来操作风险。用户可能会询问被禁止的话题,检索文档中可能混入提示注入,模型可能会调用未经授权的工具,或者在响应中包含敏感信息。
NVIDIA NeMo Guardrails是一个开源工具包,它在应用程序和LLM之间设置了可编程的控制流,而不是将这些问题留给单一模型的特性。它不仅仅是一个简单的脏话过滤器,它对输入、对话、搜索结果、工具执行和最终输出应用不同的策略,并协调它们的顺序。
本文将深入探讨NeMo Guardrails是什么,五种Rail如何运作,为什么仅凭一般的系统提示不足以应对,以及应该赋予它多大的责任。官方仓库的最新开发分支可能变化迅速,因此在实际部署时,需要同时查阅发布版本和文档。

一句话理解NeMo Guardrails
NeMo Guardrails是一个在LLM前后添加多重安全检查的库,同时也是一个决定何时执行何种检查的LLM处理管道运行时。
应用程序不直接调用模型,而是调用LLMRails.generate()或Guardrails Server。NeMo Runtime根据配置和Colang流程检查输入,执行必要的检索和操作,调用LLM,然后再次检查输出。
Application
→ NeMo Guardrails Runtime
→ Input Rail
→ Dialog Rail
→ Retrieval Rail
→ Execution Rail
→ LLM
→ Output Rail
→ Application
这里重要的一点是,Rail不指代特定的模型。Rail是“在此阶段执行的策略和流程”,其内部可以结合规则、独立的安全模型、外部API、Python自定义动作或其他LLM。
为什么仅凭系统提示不足以应对
在系统提示中写入“不要输出个人信息”、“不要执行管理员功能”是必要的,但这并非强制性的访问控制。模型是概率性地生成语句的,可能会受到长对话、相互冲突的指令或检索文档中攻击性语句的影响。
使用NeMo Guardrails的原因是为了将策略分解为可执行的阶段,而不是将其隐藏在单个提示语句中。
- 在将请求发送到LLM之前,阻止明显的攻击和禁止话题。
- 在将RAG返回的原始文本块放入提示之前进行检查。
- 根据对话状态,只选择允许的下一步操作。
- 在工具调用前后验证参数和结果。
- 在模型响应传递给用户之前,检查敏感信息和策略违规。
这种结构不能保证完美的防御。相反,它使得分离故障点和记录策略执行历史变得更容易。
五种Rail
NVIDIA官方仓库描述了五种Rail:Input、Dialog、Retrieval、Execution和Output。
| Rail | 应用时机 | 主要作用 | 阻止结果 |
| — | — | — | — |
| Input Rail | 用户输入后立即 | 越狱·提示注入·敏感信息检查 | LLM调用前终止或输入转换 |
| Dialog Rail | 决定对话流程时 | 根据意图·状态·标准程序决定下一步操作 | 预定义响应或选择允许的流程 |
| Retrieval Rail | RAG检索后 | 检查检索块的污染·敏感信息·相关性 | 移除或遮蔽危险块 |
| Execution Rail | Tool·Custom Action前后 | 验证参数和执行结果 | 拒绝工具调用或精炼结果 |
| Output Rail | LLM生成后 | 有害内容·信息泄露·事实性检查 | 阻止、修改或重新生成响应 |
Input Rail
Input Rail是最外层的关卡。它在用户的原始文本进入模型上下文之前执行,因此可以阻止或遮蔽明显的攻击字符串、禁止话题和个人信息。但是,不应假设单个输入过滤器能够捕获所有规避表达。
Dialog Rail
Dialog Rail是区分NeMo与简单过滤器的核心。它将用户的发言解释为规范化的意图,并以流程的形式表达在当前对话状态下允许的响应或操作。例如,对于客户支持聊天机器人,它可能会限制对话顺序,以防止在身份验证之前进入账户更改步骤。
然而,实际的认证成功与否必须由应用程序或认证服务判断。Dialog Rail可以调整验证流程,但它本身不是授予最终用户权限的安全边界。
Retrieval Rail
Retrieval Rail位于RAG检索到的原始文本块和LLM提示之间。它可以删除或转换外部文档中隐藏的指令、不必要的个人信息或不相关的文本块。
它通常检查检索后返回的可读原始文本块,而不是在向量搜索之前检查嵌入本身。租户过滤器和文档访问权限应首先在搜索API或数据层强制执行,Retrieval Rail的作用是额外检查这些结果的内容安全性。
Execution Rail
Execution Rail封装了LLM调用的Custom Action或外部工具的输入和输出。例如,它可以阻止负数金额或超出允许范围的值进入转账工具,并在将内部API结果中包含的秘密值返回给模型之前将其移除。
工具是否实际可执行,需要下游API再次进行认证和授权。“模型选择了这个工具”这一事实并非权限证明。
Output Rail
Output Rail在模型响应传递给用户之前立即执行。它可以检查有害内容、禁止话题、个人信息、无根据的回答等,并选择阻止、修改或重新生成响应。对于流式响应,需要单独考虑检查时机、延迟以及已发送令牌不可撤销性。
Colang和配置文件做什么
NeMo Guardrails使用config.yml、Colang文件和Python Action来配置策略。config.yml声明要使用的模型和活动的Rail,.co文件表达对话和策略流程,actions.py实现外部服务调用等用户自定义行为。
models:
- type: main
engine: openai
model: your-model
rails:
input:
flows:
- check jailbreak
output:
flows:
- self check output
Colang是一种用于建模对话流程的语言。它允许将“如果用户表现出这种意图,则执行此流程”的结构在单独的文件中管理,而不是将所有策略分散在Python条件语句中。另一方面,随着复杂策略的增加,需要管理Colang和应用程序代码之间责任的重复。
Python库和服务器方式
最简单的用法是在应用程序进程中调用Python库。
from nemoguardrails import LLMRails, RailsConfig
config = RailsConfig.from_path("./config")
rails = LLMRails(config)
response = rails.generate(
messages=[{"role": "user", "content": "질문 내용"}]
)
print(response)
如果多个应用程序使用共同策略,可以将Guardrails Server作为单独的服务部署。官方仓库提供了/v1/chat/completions形式的HTTP API和容器执行方式。库方式部署简单且调用延迟较低,而服务器方式则有利于策略集中化和语言独立性,但需要考虑网络故障和瓶颈。
NeMo擅长什么,不应委托什么
| 适合NeMo的职责 | 应用程序·信任层的职责 |
| — | — |
| 输入·检索·输出内容检查 | 用户认证和会话验证 |
| 对话和LLM处理流程协调 | 租户确定和数据访问权限 |
| Custom Action调用前后检查 | 工具·API的最终授权 |
| 安全模型·规则·外部检查联动 | 金钱·删除·权限变更的最终批准 |
| Rail执行追踪 | 法律审计记录和业务账本 |
NeMo可以成为LLM管道的中心,但不应成为业务权限的最终裁决者。最实用的职责划分是:“应用程序是安全·业务控制的中心,NeMo是LLM处理管道的中心。”
引入前应了解的局限性
Guardrails存在误报和漏报。在多个Rail中重复进行基于LLM的检查会增加令牌成本和延迟。如果对输入和输出重复应用相同的策略,或者应用程序策略和Colang流程做出相互冲突的决定,操作员将难以追溯原因。
此外,官方仓库不保证内置的Guardrails完全适用于所有操作环境,并建议组织自行审查其要求和潜在的意外滥用。测试集应包括正常请求、规避表达、多语言、长上下文、搜索文档污染、工具错误和流式传输。
最新的仓库文档还说明了匿名使用统计遥测及其禁用方法。在封闭网络或严格的个人信息环境中,部署前应检查所用版本的遥测项目和外部推理端点的条款。
何时应使用NeMo Guardrails
如果满足以下条件,引入价值巨大:
- 一个服务需要一致地执行输入·RAG·工具·输出策略。
- 需要超越简单过滤器,建模对话状态和标准程序。
- 需要将多个安全模型和外部检查器连接到一个Rail流程中。
- 需要观察和评估策略执行位置和结果。
反之,如果只是一个小型内部工具,仅需对单个模型检查几个禁用词,那么自定义中间件可能更简单。NeMo的价值不在于过滤器的数量,而在于是否需要通过策略来协调整个LLM处理流程。
结论
NeMo Guardrails不是一个能创造安全模型的魔法盒子。它是一个运行时,将模型调用前后分散的检查结构化为Input、Dialog、Retrieval、Execution和Output Rail,并允许编程对话和工具执行的流程。
使用它的最大原因是,将“期望模型自行遵守的策略”转变为“实际执行和可观察的管道”。但是,不应将认证·授权、租户边界和最终业务批准等职责交给NeMo。当遵守这些边界时,NeMo将成为一个有用的层,共同提升LLM应用程序的安全性和可操作性。
发表回复