概述#
Colang 是一种*事件驱动的交互建模语言*,由 Python 运行时解释。 NeMo Guardrails的初始版本,0.1
到 0.7
版本使用 Colang 1.0。 从 0.8
版本开始,NeMo Guardrails 引入了对 Colang 2.0 的支持,同时保持 Colang 1.0 作为默认设置,直到 Colang 完成其 beta 阶段。
NeMo Guardrails |
Colang |
---|---|
0.1-0.7 |
1.0 |
0.8 |
2.0-alpha |
>= 0.9 |
2.0-beta |
动机#
大型语言模型 (LLM) 越来越多地用于不同类型的会话和交互式系统中,例如基于聊天的助手、语音助手、多模式交互式头像、游戏中非玩家角色以及完全自主的代理。 这些应用程序使用 LLM 来做更多的事情,而不仅仅是生成文本响应。 他们需要触发行动并遵循复杂的业务流程。

广泛采用的实现此目的的方法包括
生成代码并在沙盒环境中执行它(例如,生成 Python 代码)。
使用特定模板生成响应,这允许更容易地解析机器人响应以及应该采取的行动(例如,思维链模式)。
为支持它的模型调用函数和约束输出生成(例如,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 的日志等。
从 alpha 版本迁移到 beta 版本#
您可以使用以下命令将您的 Colang 2.0-alpha 机器人迁移到 2.0-beta
nemoguardrails convert "path/to/2.0-alpha/version/bots" --from-version "2.0-alpha"
此外,您可以添加 --validate
标志来检查迁移的文件是否引发任何 Colang 语法错误。
请参阅 从 alpha 版本到 beta 版本的重大更改 部分,以查看详细的更改。
交互模型#
虽然 Colang 1.0 和 Colang 2.0 之间的语法和底层机制有很多变化,但值得强调的是,一个核心要素保持不变:*交互模型*。
在 Colang 1.0 和 Colang 2.0 中,应用程序(或用户)和 LLM 之间的交互都是事件驱动的。 事件的示例包括:用户说了一些内容、LLM 生成响应、触发操作、操作结果、检索其他信息、触发 guardrail 等。 换句话说,系统的演变被建模为一系列事件,guardrails 层负责识别和执行流中的模式。 下图描述了事件流角色的简化版本(带有黄色背景的框表示事件)。

这种事件驱动的交互模型是 Colang 成为一种强大的建模语言的原因之一,它能够描述任何类型的交互(基于文本、基于语音、多模式、代理、多代理等)并向其添加 guardrails。
如果您以前使用过 Colang 1.0,您应该查看 发生了什么变化 页面。 如果没有,您可以从 Hello World 示例开始。