深入探索NVIDIA NeMo Guardrails:它是什么,为何LLM服务需要它

大型语言模型(LLM)能够灵活响应自然语言请求,但这种灵活性本身也可能带来操作风险。用户可能会询问被禁止的话题,检索文档中可能混入提示注入,模型可能会调用未经授权的工具,或者在响应中包含敏感信息。

NVIDIA NeMo Guardrails是一个开源工具包,它在应用程序和LLM之间设置了可编程的控制流,而不是将这些问题留给单一模型的特性。它不仅仅是一个简单的脏话过滤器,它对输入、对话、搜索结果、工具执行和最终输出应用不同的策略,并协调它们的顺序。

本文将深入探讨NeMo Guardrails是什么,五种Rail如何运作,为什么仅凭一般的系统提示不足以应对,以及应该赋予它多大的责任。官方仓库的最新开发分支可能变化迅速,因此在实际部署时,需要同时查阅发布版本和文档。

LLM Guardrail Runtime 集中协调输入、对话、检索、执行和输出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应用程序的安全性和可操作性。

官方参考资料


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注