介绍#

一般背景#

Colang 是一种基于事件的建模语言,旨在实现人与机器人之间高度灵活的对话交互。由于学习一门新语言并非易事,Colang 被设计为自然语言与 Python 的混合体。如果您熟悉 Python,那么即使没有解释,在看过一些示例后,您也应该能自信地使用 Colang。在其底层,Colang 脚本由一个 Python 运行时解释执行,该运行时目前是 NeMo Guardrails 的一部分。

为了控制事件驱动的交互系统,从简单的文本或语音聊天机器人到复杂的交互式虚拟形象或机器人,Colang 解释器通常位于交互系统的核心,介于系统的输入和输出组件之间

An interactive system

交互系统的示意图,可视化了组件之间的高层数据流。传感器服务器 (Sensor Servers) 负责从用户输入数据中提取相关事件并将其转发给交互管理器。动作服务器 (Action Servers) 负责处理来自交互管理器 (Interaction Manager) 的事件以生成输出数据。请注意,事件通常具有较小的负载,而数据流可以携带更多数据。#

其核心是,Colang 解释器仅处理事件,根据 Colang 脚本中定义的生成规则检测和生成事件序列。借助大型语言模型 (LLM) 和检索增强生成 (RAG) 服务,这变得非常强大,能够处理用户与系统之间复杂的实时交互。统一多模态交互管理规范 (UMIM) 更详细地定义了如何使用动作以更结构化的方式组织这些事件,并为交互管理器与交互系统组件之间的基于事件的通信提出了新的标准。

设置与运行示例#

在本语言参考中,我们将通过不同的示例指导您了解 Colang 的各个方面,您可以使用 NeMo Guardrails 提供的聊天命令行界面 (CLI) 立即自行尝试,该 CLI 是一个简单的交互系统示例。

首先安装 NeMo Guardrails

> pip install nemoguardrails

然后使用 CLI 启动 Colang 示例

> nemoguardrails chat --config=<path_to_example_file_directory>

所有示例都可以在 NeMo Guardrails 仓库的 nemoguardrails/examples/v2_x/language_reference/ 路径下找到。请注意,所有 Colang 文件 (*.co) 和配置文件 (*.yaml*.yml) 都将加载并解析指定目录中的文件。这就是为什么每个示例都有自己的目录。

在以下示例中,输入和输出通过是否存在提示符 (>) 来区分:要重复该示例,当提示符出现时,您必须在提示符之后键入所有内容;不以提示符开头的行是解释器的输出。

Hello World 示例#

核心上,Colang 将交互模式定义为事件序列,这些事件序列被分组到所谓的流程 (flows) 中。就像许多编程语言一样,主流程 (flow main) 定义了 Colang 脚本的入口点,并且会首先启动/激活

introduction/hello_world/main.co#
flow main
    match InputEvent
    send HelloWorld

在此第一个示例流程中定义的事件模式会等待名为 InputEvent 的事件,然后生成名为 HelloWorld 的事件。在聊天界面中运行此示例,效果如下

> /InputEvent
Event: HelloWorld

一旦您输入正确的事件 InputEvent,您将看到生成的事件 HelloWorld。您键入的任何其他事件(使用 / 指示自定义事件输入)都将被忽略。主流程在模式完成后将自动重新启动。

让我们基于表示用户和机器人话语的 UMIM 事件重新制作前面的示例

introduction/hello_world_umim/main.co#
flow main
    match UtteranceUserActionFinished()
    send StartUtteranceBotAction(script="Hello World!")

运行此示例时,我们可以通过两种方式触发机器人话语“Hello World!”:一种是像之前那样输入原始事件 /UtteranceUserActionFinished(),另一种是直接输入不带前导 / 字符的任何内容,这将被直接解释为用户话语动作事件 UtteranceUserActionFinished(final_transcript="Hi")

> Hi

Hello World!

第一个交互模式#

现在让我们构建一个更长的交互模式

introduction/interaction_sequence/main.co#
flow main
    match UtteranceUserActionFinished(final_transcript="Hi")
    send StartUtteranceBotAction(script="Hi there! How are you?")
    match UtteranceUserActionFinished(final_transcript="Good and you?")
    send StartUtteranceBotAction(script="Great! Thanks")
    send StartGestureBotAction(gesture="Thumbs up")

运行此示例将产生一个多轮交互

> Hi

Hi there! How are you?

> Good and you?

Great! Thanks

Gesture: Thumbs up

请注意,对于每个匹配语句,我们不仅可以指定我们期望的事件类型,还可以指定该事件的期望参数。只有当用户话语与指定的参数值完全相同时,事件匹配语句才会被视为成功并继续执行。

掌握了这些基本知识,您现在将学习更多关于事件生成与匹配的方式。