NeMo 护栏
免责声明:测试版正在积极开发中,可能会发生变化和改进,这可能导致不稳定和意外行为。我们目前不建议在生产环境中部署此测试版。我们感谢您在此阶段的理解和贡献。您的支持和反馈对我们创建一个强大的、可用于生产的 LLM 护栏工具包至关重要。文档中提供的示例仅用于教育目的,帮助您入门 NeMo Guardrails,不适用于生产应用。
✨✨✨
📌 NeMo Guardrails 官方文档已迁移至 docs.nvidia.com/nemo-guardrails。
✨✨✨
NeMo Guardrails 是一个开源工具包,用于轻松为基于 LLM 的对话应用添加可编程护栏。护栏(简称"rails")是控制大型语言模型输出的特定方式,例如不谈论政治、以特定方式回应用户请求、遵循预定义的对话路径、使用特定的语言风格、提取结构化数据等。
这篇论文介绍了 NeMo Guardrails,并包含系统的技术概述和当前评估。
要求
Python 3.8、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
# 从指定路径加载护栏配置
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:
flows:
- check jailbreak
- mask sensitive data on input
# 生成机器人消息后触发输出护栏。
output:
flows:
- self check facts
- self check hallucination
- activefence moderation
- gotitai rag truthcheck
config:
# 配置应在用户输入中遮蔽的实体类型。
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,这是一种专门为设计灵活yet可控的对话流程而创建的建模语言。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将在NeMo Guardrails 0.11.0版本中结束Beta阶段,并取代1.0成为默认选项。
关于Colang 1.0语法的简要介绍,请参见Colang 1.0语言语法指南。
要开始使用Colang 2.0,请参见Colang 2.0文档。
护栏库
NeMo Guardrails附带一组内置护栏。
注意:内置护栏仅用于帮助您快速上手NeMo Guardrails。对于生产用例,需要进一步开发和测试护栏。
目前,护栏库包括:
- 越狱检测
- 自检输入审核
- 自检输出审核
- 自检事实核查
- 幻觉检测
- 基于AlignScore的事实核查
- 基于LlamaGuard的内容审核
- 使用Patronus Lynx的RAG幻觉检测
- 基于Presidio的敏感数据检测
- 使用ActiveFence的输入审核
- 使用Got It AI的TruthChecker API进行RAG幻觉检测
- 基于AutoAlign的护栏
CLI
NeMo Guardrails还附带内置的命令行界面。
$ nemoguardrails --help
用法: nemoguardrails [选项] 命令 [参数]...
actions-server 启动NeMo Guardrails操作服务器。
chat 开始交互式聊天会话。
evaluate 运行评估任务。
server 启动NeMo Guardrails服务器。
Guardrails服务器
你可以使用NeMo Guardrails命令行界面启动guardrails服务器。该服务器可以从指定文件夹加载一个或多个配置,并提供HTTP API以使用它们。
$ nemoguardrails server [--config 配置路径] [--port 端口]
例如,要获取"sample"配置的聊天补全,你可以使用"/v1/chat/completions"端点:
POST /v1/chat/completions
{
"config_id": "sample",
"messages": [{
"role":"user",
"content":"你好!你能为我做什么?"
}]
}
示例输出:
{"role": "assistant", "content": "你好!我能帮你什么忙吗?"}
Docker
要启动guardrails服务器,你也可以使用Docker容器。NeMo Guardrails提供了一个Dockerfile,你可以用它来构建"nemoguardrails"镜像。更多信息,请参阅使用Docker部分。
与LangChain集成
NeMo Guardrails可以无缝集成到LangChain中。你可以轻松地将guardrails配置包装在LangChain链(或任何"Runnable")周围。你也可以从guardrails配置中调用LangChain链。更多详情,请查看LangChain集成文档
评估
评估基于LLM的对话应用的安全性是一项复杂的任务,仍然是一个开放的研究问题。为了支持适当的评估,NeMo Guardrails提供以下内容:
- 一个评估工具,即"nemoguardrails evaluate",支持主题导轨、事实检查、审核(越狱和输出审核)和幻觉。
- 一个实验性的红队界面。
- 示例LLM漏洞扫描报告,例如ABC Bot - LLM漏洞扫描结果
这与其他方法有何不同?
有许多方法可以为基于LLM的对话应用添加guardrails。例如:显式审核端点(如OpenAI、ActiveFence)、批评链(如宪法链)、解析输出(如guardrails.ai)、单独的guardrails(如LLM-Guard)、RAG应用的幻觉检测(如Got It AI、Patronus Lynx)。
NeMo Guardrails旨在提供一个灵活的工具包,可以将所有这些互补方法整合到一个连贯的LLM guardrails层中。例如,该工具包提供了与ActiveFence、AlignScore和LangChain链的开箱即用集成。
据我们所知,NeMo Guardrails是唯一一个还提供用户和LLM之间对话建模解决方案的guardrails工具包。这一方面能够精确地引导对话。另一方面,它可以精细控制何时使用某些guardrails,例如,仅对某些类型的问题使用事实检查。
了解更多
邀请社区贡献!
存储库中的示例导轨是极好的起点。我们热情邀请社区为使可信、安全和可靠的LLM的力量accessible to everyone做出贡献。有关设置开发环境和如何为NeMo Guardrails做出贡献的指导,请参阅贡献指南。
许可证
此工具包根据Apache许可证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",
}