简介#
注意
免责声明: Beta 版本正在积极开发中,可能会进行更改和改进,这可能会导致不稳定和意外行为。我们目前不建议在生产环境中部署此 Beta 版本。感谢您在此阶段的理解和贡献。您的支持和反馈对于我们朝着创建强大、可用于生产的 LLM 护栏工具包迈进至关重要。文档中提供的示例仅用于教育目的,以帮助您开始使用 NeMo Guardrails,并非旨在用于生产应用程序。
NeMo Guardrails 是一个开源工具包,用于轻松地向基于 LLM 的对话应用程序添加可编程护栏。护栏(或简称“rails”)是控制大型语言模型输出的特定方法,例如不谈论政治、以特定方式响应特定用户请求、遵循预定义的对话路径、使用特定的语言风格、提取结构化数据等等。
本文 介绍了 NeMo Guardrails,并包含对系统和当前评估的技术概述。
要求#
Python 3.9、3.10 或 3.11。
NeMo Guardrails 使用 annoy,这是一个带有 Python 绑定的 C++ 库。要安装 NeMo Guardrails,您需要安装 C++ 编译器和开发工具。请查看安装指南,获取特定于平台的说明。
安装#
使用 pip 安装
> pip install nemoguardrails
有关更详细的说明,请参阅安装指南。
概述#
NeMo Guardrails 使构建基于 LLM 的应用程序的开发人员能够轻松地在应用程序代码和 LLM 之间添加可编程护栏。

添加可编程护栏的主要优势包括
构建值得信赖、安全可靠的基于 LLM 的应用程序:您可以定义护栏来引导和保障对话;您可以选择定义基于 LLM 的应用程序在特定主题上的行为,并防止其参与讨论不需要的主题。
安全地连接模型、链和其他服务:您可以无缝且安全地将 LLM 连接到其他服务(又名工具)。
可控对话:您可以引导 LLM 遵循预定义的对话路径,从而使您可以按照对话设计最佳实践设计交互,并执行标准操作程序(例如,身份验证、支持)。
防止 LLM 漏洞#
NeMo Guardrails 提供了多种机制来保护基于 LLM 的聊天应用程序免受常见的 LLM 漏洞的攻击,例如越狱和提示注入。以下是本存储库中包含的示例 ABC Bot 的不同护栏配置提供的保护的示例概述。有关更多详细信息,请参阅 LLM 漏洞扫描 页面。

用例#
您可以在不同类型的用例中使用可编程护栏
问答:针对一组文档(又名检索增强生成):强制执行事实核查和输出审核。
特定领域助手(又名聊天机器人):确保助手保持在主题上并遵循设计的对话流程。
LLM 端点:为您的自定义 LLM 添加护栏,以实现更安全的客户互动。
LangChain 链:如果您在任何用例中使用 LangChain,则可以在链周围添加护栏层。
代理 (即将推出):为您的基于 LLM 的代理添加护栏。
用法#
要将可编程护栏添加到您的应用程序,您可以使用 Python API 或护栏服务器(有关更多详细信息,请参阅服务器指南)。使用 Python API 类似于直接使用 LLM。调用护栏层而不是 LLM 只需要对代码库进行最少的更改,并且它涉及两个简单的步骤
加载护栏配置并创建
LLMRails
实例。使用
generate
/generate_async
方法调用 LLM。
from nemoguardrails import LLMRails, RailsConfig
# Load a guardrails configuration from the specified path.
config = RailsConfig.from_path("PATH/TO/CONFIG")
rails = LLMRails(config)
completion = rails.generate(
messages=[{"role": "user", "content": "Hello world!"}]
)
示例输出
{"role": "assistant", "content": "Hi! How can I help you?"}
generate
方法的输入和输出格式类似于 OpenAI 的 Chat Completions API。
异步 API#
NeMo Guardrails 是一个异步优先的工具包,因为其核心机制是使用 Python 异步模型实现的。公共方法既有同步版本,也有异步版本。例如:LLMRails.generate
和 LLMRails.generate_async
。
支持的 LLM#
您可以将 NeMo Guardrails 与多个 LLM 一起使用,例如 OpenAI GPT-3.5、GPT-4、LLaMa-2、Falcon、Vicuna 或 Mosaic。有关更多详细信息,请查看配置指南中的支持的 LLM 模型部分。
护栏类型#
NeMo Guardrails 支持五种主要类型的护栏

输入护栏:应用于来自用户的输入;输入护栏可以拒绝输入,停止任何额外的处理,或更改输入(例如,屏蔽潜在的敏感数据、改述)。
对话护栏:影响如何提示 LLM;对话护栏对规范形式的消息进行操作(详细信息请参阅Colang 指南),并确定是否应执行操作,是否应调用 LLM 来生成下一步或响应,是否应使用预定义的响应等。
检索护栏:应用于 RAG(检索增强生成)场景中检索到的块;检索护栏可以拒绝一个块,防止其用于提示 LLM,或更改相关的块(例如,屏蔽潜在的敏感数据)。
执行护栏:应用于需要由 LLM 调用的自定义操作(又名工具)的输入/输出。
输出护栏:应用于 LLM 生成的输出;输出护栏可以拒绝输出,防止将其返回给用户,或更改它(例如,删除敏感数据)。
护栏配置#
护栏配置定义了要使用的 LLM 和 一个或多个护栏。护栏配置可以包括任意数量的输入/对话/输出/检索/执行护栏。没有任何配置护栏的配置实际上会将请求转发到 LLM。
护栏配置文件夹的标准结构如下所示
.
├── config
│ ├── actions.py
│ ├── config.py
│ ├── config.yml
│ ├── rails.co
│ ├── ...
config.yml
包含所有常规配置选项,例如 LLM 模型、活动护栏和自定义配置数据”。config.py
文件包含任何自定义初始化代码,actions.py
包含任何自定义 Python 动作。有关完整的概述,请参阅配置指南。
以下是一个 config.yml
示例
# config.yml
models:
- type: main
engine: openai
model: gpt-3.5-turbo-instruct
rails:
# Input rails are invoked when new input from the user is received.
input:
flows:
- check jailbreak
- mask sensitive data on input
# Output rails are triggered after a bot message has been generated.
output:
flows:
- self check facts
- self check hallucination
- activefence moderation
config:
# Configure the types of entities that should be masked on user input.
sensitive_data_detection:
input:
entities:
- PERSON
- EMAIL_ADDRESS
护栏配置中包含的 .co
文件包含 Colang 定义(有关 Colang 的快速概述,请参阅下一节),这些定义定义了各种类型的护栏。以下是一个 greeting.co
文件示例,该文件定义了用于问候用户的对话护栏。
define user express greeting
"Hello!"
"Good afternoon!"
define flow
user express greeting
bot express greeting
bot offer to help
define bot express greeting
"Hello there!"
define bot offer to help
"How can I help you today?"
以下是 Colang 定义的另一个示例,用于针对侮辱的对话护栏
define user express insult
"You are stupid"
define flow
user express insult
bot express calmly willingness to help
Colang#
为了配置和实施各种类型的护栏,此工具包引入了 Colang,这是一种专门为设计灵活但可控的对话流程而创建的建模语言。Colang 具有类似 Python 的语法,旨在简单直观,尤其对于开发人员而言。
注意
目前支持 Colang 的两个版本,1.0 和 2.0,Colang 1.0 是默认版本。NeMo Guardrails 的 0.1.0 到 0.7.1 版本专门使用了 Colang 1.0。0.8.0 版本引入了 Colang 2.0-alpha,0.9.0 版本引入了 Colang 2.0-beta。我们预计 Colang 2.0 将退出 Beta 版,并在 NeMo Guardrails 0.12.0 版本中取代 1.0 成为默认选项。
有关 Colang 1.0 语法的简要介绍,请参阅Colang 1.0 语言语法指南。
要开始使用 Colang 2.0,请参阅Colang 2.0 文档。
护栏库#
NeMo Guardrails 附带一套内置护栏。
注意
内置护栏仅旨在使您能够快速开始使用 NeMo Guardrails。对于生产用例,需要对护栏进行进一步的开发和测试。
目前,NeMo Guardrails 库包括以下护栏
CLI#
NeMo Guardrails 还附带一个内置 CLI。
$ nemoguardrails --help
Usage: nemoguardrails [OPTIONS] COMMAND [ARGS]...
actions-server Start a NeMo Guardrails actions server.
chat Start an interactive chat session.
evaluate Run an evaluation task.
server Start a NeMo Guardrails server.
护栏服务器#
您可以使用 NeMo Guardrails CLI 启动护栏服务器。服务器可以从指定的文件夹加载一个或多个配置,并公开 HTTP API 以供使用。
nemoguardrails server [--config PATH/TO/CONFIGS] [--port PORT]
例如,要获取 sample
配置的聊天完成,您可以使用 /v1/chat/completions
端点
POST /v1/chat/completions
{
"config_id": "sample",
"messages": [{
"role":"user",
"content":"Hello! What can you do for me?"
}]
}
示例输出
{"role": "assistant", "content": "Hi! How can I help you?"}
Docker#
要启动护栏服务器,您还可以使用 Docker 容器。NeMo Guardrails 提供了一个 Dockerfile,您可以使用它来构建 nemoguardrails
镜像。有关更多信息,请参阅使用 Docker 部分。
与 LangChain 集成#
NeMo Guardrails 与 LangChain 无缝集成。您可以轻松地将护栏配置包装在 LangChain 链(或任何 Runnable
)周围。您还可以从护栏配置中调用 LangChain 链。有关更多详细信息,请查看LangChain 集成文档
评估#
评估基于 LLM 的对话应用程序的安全性是一项复杂的任务,并且仍然是一个开放的研究问题。为了支持适当的评估,NeMo Guardrails 提供了以下内容
一个评估工具,即
nemoguardrails evaluate
,支持主题护栏、事实核查、审核(越狱和输出审核)和幻觉。一个实验性的红队演练界面。
LLM 漏洞扫描报告示例,例如,ABC Bot - LLM 漏洞扫描结果
有何不同?#
有很多方法可以将护栏添加到基于 LLM 的对话应用程序中。例如:显式审核端点(例如,OpenAI、ActiveFence)、评论链(例如,宪法链)、解析输出(例如,guardrails.ai)、单独的护栏(例如,LLM-Guard)、用于 RAG 应用程序的幻觉检测(例如,Got It AI、Patronus Lynx)。
NeMo Guardrails 旨在提供一个灵活的工具包,可以将所有这些互补方法集成到一个有凝聚力的 LLM 护栏层中。例如,该工具包提供了与 ActiveFence、AlignScore 和 LangChain 链的开箱即用集成。
据我们所知,NeMo Guardrails 是唯一一个还提供对用户和 LLM 之间的对话进行建模的解决方案的护栏工具包。这使得一方面能够以精确的方式引导对话。另一方面,它可以对何时应使用某些护栏进行细粒度控制,例如,仅对某些类型的问题使用事实核查。
了解更多#
邀请社区贡献#
存储库中存在的示例护栏是极好的起点。我们热情地邀请社区为使值得信赖、安全可靠的 LLM 的力量惠及每个人做出贡献。有关设置开发环境以及如何为 NeMo Guardrails 做出贡献的指南,请参阅贡献指南。
许可证#
此工具包根据 Apache License, Version 2.0 获得许可。
如何引用#
如果您使用这项工作,请引用介绍它的 EMNLP 2023 论文。
@inproceedings{rebedea-etal-2023-nemo,
title = "{N}e{M}o Guardrails: A Toolkit for Controllable and Safe {LLM} Applications with Programmable Rails",
author = "Rebedea, Traian and
Dinu, Razvan and
Sreedhar, Makesh Narsimhan and
Parisien, Christopher and
Cohen, Jonathan",
editor = "Feng, Yansong and
Lefever, Els",
booktitle = "Proceedings of the 2023 Conference on Empirical Methods in Natural Language Processing: System Demonstrations",
month = dec,
year = "2023",
address = "Singapore",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.emnlp-demo.40",
doi = "10.18653/v1/2023.emnlp-demo.40",
pages = "431--445",
}