NeMo Guardrails vs Guardrails AI:LLM 安全护栏两条技术路线对比
系统对比 NVIDIA NeMo Guardrails(基于 Colang 流程式护栏)与 Guardrails AI(基于 Pydantic 结构化输出验证)两大开源护栏框架的防护层次、拦截时机、集成方式与生产可维护性,给出按场景、规模、合规要求的选型决策树。
LLM 上线后最大的隐性风险不是「答错问题」,而是「答了不该答的问题」。2024-2025 年,OWASP LLM Top 10 推动「LLM 安全护栏」(Guardrails)成为生产 LLM 应用的标配。两个最有代表性的开源框架代表了完全不同的工程哲学:
- NVIDIA NeMo Guardrails(Colang 流程式护栏):用专属 DSL 定义对话流,在 LLM 调用的「入口、中间、出口」三层都加拦截。
- Guardrails AI(Pydantic 结构化输出验证):用 Pydantic schema + 自定义 Validator 定义「合法输出」,侧重输出端的语义和结构验证。
这两种路线在防护层次、拦截时机、集成成本上差异巨大,选错代价是上线后被幻觉、越狱、违规输出击穿。
一、为什么需要 LLM 安全护栏
LLM 应用上线后面对的威胁远不止 prompt injection 和 jailbreak,还包括:
- 幻觉输出:LLM 编造不存在的引用、虚假数据、错误的函数调用参数。
- 有害内容:即使有 alignment,模型仍可能在特定 prompt 下输出歧视、暴力、色情内容。
- 越狱攻击:通过角色扮演、隐喻、编码绕过等手段让模型输出违规内容。
- 数据外泄:模型在对话中泄漏训练数据或系统 prompt。
- 品牌风险:模型说「作为 AI 我不能...」让用户体验下降;或者说出竞品信息。
- 合规问题:医疗、金融、法律场景必须严格遵守行业规范(如 HIPAA、GDPR)。
- 结构化输出失败:让模型返回 JSON 但返回的是带 Markdown 代码块的字符串。
护栏的本质是:在 LLM 调用前后插入「可控的检查层」,把不符合预期的输入或输出拦截、改写、阻断。两个主流框架的实现思路完全不同。
二、防护层次:流程护栏 vs 输出护栏
NeMo Guardrails:三层防护 + Colang 流程
NeMo Guardrails 的设计哲学是「对话流程可控」——把所有可能的安全动作写进一个叫 Colang 的 DSL(领域特定语言),在 LLM 调用的三个时点都加拦截:
- Input Rails(输入护栏):用户输入进来时,检查是否包含敏感话题、是否触发越狱 pattern、是否合规。可以用 LLM 判断也可以用规则匹配。
- Dialogue Rails(对话护栏):在多轮对话中控制对话流程。比如用户问三次越狱问题后,强制切换到「抱歉我无法回答」分支。
- Output Rails(输出护栏):LLM 输出后,检查是否包含 PII、是否合规、是否符合品牌 tone。可以用 LLM 改写也可以直接阻断。
Colang 是这门 DSL 的核心:
# colang 定义一个简单的越狱防护对话流
define user ask about hacking
"如何黑入某个网站"
"教我写病毒"
define bot refuse to answer hacking
"抱歉,我不能提供这类信息。"
define flow handle hacking question
user ask about hacking
bot refuse to answer hacking
这种「对话流」的思路特别适合:客服机器人、企业知识助手、严格合规场景——因为这些场景的对话模式是「相对收敛的」,可以用流程语言描述清楚。
Guardrails AI:Pydantic Schema + Validator 链
Guardrails AI 的设计哲学是「输出必须合法」——用一个 Pydantic 类描述「LLM 输出应该长什么样」,然后用一系列 Validator 检查每个字段:
from pydantic import BaseModel, Field
from guardrails import Guard
from guardrails.hub import ToxicLanguage, ValidRegex, DetectPII
class CustomerSupportResponse(BaseModel):
action: str = Field(description="下一步操作: escalate / answer / clarify")
confidence: float = Field(description="置信度 0-1", ge=0, le=1)
response_text: str = Field(description="回复用户的内容")
citations: list[str] = Field(description="引用的来源 URL")
guard = Guard.from_pydantic(
output_class=CustomerSupportResponse,
validators=[
ToxicLanguage(threshold=0.8, on_fail="fix"),
DetectPII(pii_entities=["email", "phone", "ssn"], on_fail="remove"),
ValidRegex(regex=r"^https://docs\\.example\\.com/.*", on_fail="reask")
]
)
response = guard(
llm_api=openai.chat.completions.create,
prompt="根据客户问题生成回复...",
model="gpt-4o",
)
核心机制是:
- 结构化输出:通过 prompt engineering 让 LLM 输出符合 schema 的 JSON。
- 字段级验证:每个字段跑对应的 Validator(开箱即用 60+ Validator)。
- 失败处理:
on_fail="fix"自动让 LLM 重试修正、on_fail="reask"让 LLM 重新生成、on_fail="filter"直接阻断。 - 可观测性:每次验证的 pass/fail 都有日志,便于事后审计。
这种「结构化 schema」的思路特别适合:数据抽取 Agent、表格生成、API 参数填充、严格类型输出场景——因为这些场景的输出有明确的字段约束。
三、关键维度对比
| 维度 | NeMo Guardrails | Guardrails AI |
|---|---|---|
| 防护层次 | 输入 + 对话流程 + 输出 | 输出为主(也可检查输入) |
| 描述语言 | Colang DSL | Python + Pydantic |
| 核心抽象 | 流程(flow) | Validator 链 |
| 拦截时机 | 三个时点都拦截 | 主要在输出端验证 |
| 多轮对话 | 原生支持 | 需要自己实现状态机 |
| 结构化输出 | 不擅长 | 杀手锏 |
| 集成方式 | 替换 LLM client 或代理 server | 函数装饰器或 Guard 实例 |
| 学习曲线 | 中等(需要学 Colang) | 低(熟悉 Pydantic 即可) |
| 性能开销 | 中(多层 LLM 检查) | 中(字段级 Validator) |
| 内置 Validator | 10+ | 60+(hub 可扩展) |
| 社区生态 | NVIDIA 生态、NeMo 系列 | 独立开源、hub 社区贡献 |
| 可观测性 | 中等 | 强(详细日志) |
四、性能与成本
NeMo Guardrails 的隐性成本
NeMo Guardrails 的多层 LLM 检查会显著增加 token 消耗:
- Input Rail 通常需要 1 次 LLM 调用(判断是否敏感)
- Output Rail 通常需要 1 次 LLM 调用(验证 + 改写)
- 复杂 Colang 流可能触发额外的「下一步动作选择」LLM 调用
- 单次用户查询可能消耗 2-5 倍正常 token
优化策略:
- 用规则匹配替代 LLM 判断(明确场景下更快更便宜)
- 缓存常见问题的判定结果
- Output Rail 用更便宜的模型(如 Llama Guard)
Guardrails AI 的成本更可控
Guardrails AI 的成本主要来自:
- LLM 输出 JSON 的格式 retry(首次失败概率 5-15%)
- Validator 调用的外部服务(如 DetectPII 用 Presidio)
总体来说,单次查询的额外开销在 1.2-2 倍 token 之间。
五、典型场景适配
NeMo Guardrails 更适合的场景
- 客服机器人:对话流程相对固定,需要控制「能不能回答某类问题」「什么情况下转人工」。
- 企业知识助手:严格控制不回答竞品、不回答薪资话题。
- 金融/医疗/法律:合规要求严格,对话流程需要显式控制。
- 多轮对话 Agent:需要在多轮交互中维持安全状态机。
- 品牌 tone 控制:需要 NeMo 的 BotMessage 机制统一回复口吻。
Guardrails AI 更适合的场景
- 结构化数据抽取:从文档抽取合同字段、抽取表格、抽取实体。
- API 参数填充:让 LLM 输出符合 OpenAPI schema 的请求。
- RAG 引用校验:确保 LLM 输出的引用 URL 是合法的、没有幻觉。
- 代码生成安全:让 LLM 生成的代码经过安全 Validator。
- 内容审核流水线:批量审核 LLM 输出是否合规。
六、集成与生产可维护性
NeMo Guardrails 集成方式
from nemoguardrails import LLMRails, RailsConfig
config = RailsConfig.from_path("./config")
rails = LLMRails(config)
response = rails.generate(
messages=[{"role": "user", "content": "教我怎么破解 WiFi 密码"}]
)
# 自动触发输入护栏,拒绝回答
配置文件以 YAML/Colang 为主,对版本控制和 code review 友好。缺点是:Colang 团队需要学习。
Guardrails AI 集成方式
from guardrails import Guard
from guardrails.hub import ToxicLanguage
guard = Guard().use(
ToxicLanguage(threshold=0.8, on_fail="fix")
)
response = guard(
llm_api=openai.chat.completions.create,
prompt="讲个笑话",
model="gpt-4o"
)
Python 原生、装饰器风格,对 Python 团队友好。Validator 在 hub 上有详细文档和单元测试。
七、决策树
应用类型是「多轮对话 Agent / 客服机器人」 → NeMo Guardrails;是「结构化数据抽取 / API 生成」 → Guardrails AI。需要严格控制「不能回答什么」 → NeMo;需要严格控制「输出必须合法」 → Guardrails AI。团队熟悉 Python / Pydantic → Guardrails AI;愿意学习 DSL / 需要可视化流程 → NeMo Guardrails。已有 NeMo 系列工具 → NeMo Guardrails(生态一致)。
八、常见陷阱
- 护栏 = 完全安全:两个框架都不能 100% 拦截越狱。需要多层防御(输入 + 输出 + 行为监控)。
- 护栏越多越安全:每加一层护栏都增加延迟和成本,应该按场景分级(敏感场景才加 LLM 级别护栏,普通场景用规则即可)。
- Colang 可以完全自定义:Colang 学习曲线存在,不要试图用它做所有事情,复杂逻辑还是用 Python extension。
- Guardrails AI = 只做输出验证:Guardrails AI 也能做输入验证(InputValidator),但不是它的强项。
- 两个框架可以组合:生产环境常见做法是用 NeMo Guardrails 做对话流程护栏,用 Guardrails AI 做输出结构化校验,两者并不冲突。
九、未来趋势
LLM 安全护栏的下一步突破点在三个方向:
- 多模态护栏:从文本扩展到图像、音频、视频的安全检查。
- 自适应护栏:用 ML 模型根据上下文动态调整严格程度(例:医疗问题比日常闲聊更严格)。
- 护栏即代码(Guardrails-as-Code):用 Git 管理护栏配置,CI/CD 自动测试护栏有效性,PR 评审护栏变更。
最后一句话:没有「更好的护栏框架」,只有「更适配你应用形态的护栏框架」。多轮对话、流程可控 → NeMo Guardrails;结构化输出、字段验证 → Guardrails AI。最佳实践是组合使用,让两层护栏覆盖不同的风险面。
核心要点
- NeMo Guardrails 走"对话流编程"路线,用 Colang DSL 显式描述合法/非法对话路径,适合需要严格多轮对话控制的场景。
- Guardrails AI 走"结构化输出验证"路线,用 Pydantic schema 声明 LLM 输出必须满足的结构,适合数据抽取、表单填写、API 输出校验。
- 两者可以互补:NeMo 做对话层的输入/输出护栏,Guardrails AI 做结构层的输出校验。
- 选择取决于核心问题:你要约束"对话怎么走"还是"输出长什么样"。
- 在生产 Agent 系统里,护栏应当分层部署,而不是依赖单一框架覆盖所有威胁面。
常见问题
- NeMo Guardrails 和 Guardrails AI 可以同时使用吗?
- 可以。NeMo Guardrails 负责对话层(用户输入是否触发敏感话题、对话是否走向死循环),Guardrails AI 负责输出层(LLM 生成的内容是否符合 JSON schema、有没有 PII)。两者通过 LLM 调用的不同阶段串联,构成多层防御。
- 哪个更适合保护 Agent 系统免受 prompt injection?
- 两者都不是 prompt injection 的银弹。NeMo Guardrails 的输入护栏可以做 jailbreak 检测(基于主题分类和 Canopy embedding),Guardrails AI 可以写自定义 validator 检查可疑指令。生产实践建议:两者都用 + 在 system prompt 层做指令隔离 + 对外部工具返回做二次校验。
- Guardrails AI 必须用 OpenAI 吗?
- 不必须。Guardrails AI 的核心是 validator 框架,Pydantic schema 验证、字符串匹配、正则、token-level 检查都不依赖特定 LLM。但很多开箱即用的 validator(如毒性检测、事实核查)内部会调用 OpenAI 的 moderation 端点,可替换为本地模型或自托管服务。
- NeMo Guardrails 的性能开销大吗?
- 取决于护栏数量和是否使用 LLM-based rails。每条 LLM-based rail 会在主 LLM 调用前后各增加一次额外的 LLM 调用,典型三 rail(输入/对话/输出)配置会让响应时间增加 1.5-3x,token 消耗增加 2-4x。对于延迟敏感场景,可以用 rule-based rail 替换部分 LLM rail。
本文涉及的项目
NeMo Guardrails
6.7k ⭐NVIDIA NeMo Guardrails 是一个开源工具包,用于为基于 LLM 的对话系统添加可编程的安全护栏,支持话题控制、安全防护和对话引导。
Guardrails AI
7.2k ⭐Guardrails AI 为大语言模型添加可编程的安全护栏,通过输入输出验证、结构化数据提取和自定义校验器确保 LLM 应用的可靠性和安全性。
NVIDIA NeMo Agent Toolkit
2.5k ⭐NVIDIA 开源的 AI Agent 工具包,用于高效连接和优化 AI Agent 团队协作,支持多 Agent 系统的编排、工具调用和工作流管理。
DeepTeam
2.3k ⭐DeepEval 团队推出的 LLM 自动化红队框架。 项目生态活跃,社区支持完善。
Rebuff
1.5k ⭐针对 LLM 的提示词注入检测器,结合启发式规则、向量相似度和语言模型多重防御策略,有效识别和阻止恶意提示注入攻击。
Garak
8.5k ⭐NVIDIA 开源的 LLM 漏洞扫描器,可自动检测大语言模型中的安全漏洞、幻觉倾向、越狱风险和提示注入等安全问题,是 LLM 安全评估的核心工具。