简介#

通用上下文#

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

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

An interactive system

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

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

设置和运行示例#

在本语言参考中,我们将借助不同的示例引导您了解 Colang 的所有方面,您可以使用 NeMo Guardrails 提供的聊天命令行界面 (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 将交互模式定义为事件序列,这些事件序列被分组为所谓的流程。与许多编程语言一样,主流程 (flow main) 定义了 Colang 脚本的入口点,并将首先启动/激活

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

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

> /InputEvent
Event: HelloWorld

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

让我们基于 UMIM 事件重做之前的示例,这些事件代表用户和 Bot 的话语

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

在运行此示例时,我们可以通过两种方式触发 Bot 话语 “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

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

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