概述

Colang 是一种事件驱动的交互建模语言,由 Python 运行时解释执行。NeMo Guardrails 的初始版本,0.10.7 版本,使用 Colang 1.0。从 0.8 版本开始,NeMo Guardrails 引入了对 Colang 2.0 的支持,同时在 Colang 完成其 beta 阶段之前,仍将 Colang 1.0 作为默认版本。

NeMo Guardrails - Colang 版本依赖关系

NeMo Guardrails

Colang

0.1-0.7

1.0

0.8

2.0-alpha

0.9

2.0-beta

动机

大型语言模型 (LLM) 越来越多地应用于不同类型的对话和交互式系统中,例如基于聊天的助手、语音助手、多模态交互式头像、游戏中的非玩家角色和完全自主的代理。这些应用程序使用 LLM 不仅仅是为了生成文本响应。它们需要触发操作并遵循复杂的业务流程。

../_images/use_cases_llms.png

为实现此目的而广泛采用的方法包括:

  1. 生成代码并在沙箱环境中执行(例如,生成 Python 代码)。

  2. 使用特定模板生成响应,这样可以更轻松地解析机器人响应和应采取的操作(例如,思维链模式)。

  3. 对于支持函数调用的模型,可以使用函数调用和约束输出生成(例如,JSON 模式)。

检索增强生成 (RAG) 通过将应用程序级和用户特定的上下文集成到生成中,发挥着至关重要的作用。用于 LLM 的全面 guardrails 工具包应无缝适应所有这些交互模式。

Colang 1.0

当提到 Colang 时,既包含了该语言本身,也包含了它的运行时环境。最初的 Colang 1.0 语言和运行时存在一些限制。

语言限制

  • 主要支持基于文本的交互,并为用户和机器人消息提供了专门的结构。

  • 对自然语言指令的支持有限,例如提取用户提供的值或机器人消息指令。

  • 缺乏对并发执行多个操作或启动多个交互流程的支持。

  • 不允许对并行交互流进行建模,例如在交互式头像系统中同时进行的聊天和头像姿势调整。

  • 缺乏正式的语言描述。

运行时限制

  • 没有显式的状态对象来管理持续的交互。

  • 随着事件数量的增加,性能会下降。

Colang 2.0

Colang 2.0 代表了对语言和运行时的全面改进。主要增强功能包括:

Colang 2.0-alpha

  • 更强大的流程引擎,支持多个并行流程以及对事件流进行高级模式匹配。

  • 用于简化机器人开发的标准库。

  • 更小的一组核心抽象:流程、事件和操作。

  • 通过 main 流程的显式入口点以及流程的显式激活。

  • 异步操作执行。

  • 采用类似于 Python 的术语和语法,以降低新开发人员的学习曲线。

Colang 2.0-beta

  • 用于标准库的导入机制,以进一步简化开发。

  • 新的生成运算符 (...)。

  • 独立和流程参数表达式求值。

当前限制(将在 NeMo Guardrails v0.10.0 中修复)

  • Guardrails 库尚不能在 Colang 2.0 中使用。

  • 不支持生成选项,例如,记录激活的 rails 等。

交互模型

虽然 Colang 1.0 和 Colang 2.0 之间的语法和底层机制有很多变化,但值得强调的是,一个核心要素保持不变:交互模型

在 Colang 1.0 和 Colang 2.0 中,应用程序(或用户)与 LLM 之间的交互都是事件驱动的。事件的示例包括:用户说了什么、LLM 生成响应、触发操作、操作的结果、检索其他信息、触发 guardrail 等。换句话说,系统的演变被建模为一系列事件,guardrails 层负责识别和执行事件流中的模式。下图描述了事件流作用的简化版本(黄色背景的框代表事件)。

../_images/guardrails_events_stream.png

这种事件驱动的交互模型是使 Colang 成为强大建模语言的一部分,它可以描述任何类型的交互(基于文本、基于语音、多模态、代理、多代理等),并为其添加 guardrails。

如果您之前使用过 Colang 1.0,则应查看 变更内容 页面。如果还没有使用过,您可以从 Hello World 示例开始。