Colang 指南
本文档是对 Colang 1.0 的简要介绍。
Colang 是一种建模语言,用于设计对话系统的护栏。
警告: Colang 可用于执行复杂活动,例如调用 python 脚本和多次调用底层语言模型。您应避免在未仔细检查的情况下从不受信任的来源加载 Colang 文件。
为何需要一种新语言
为对话系统创建护栏需要某种程度上理解用户和机器人之间的对话是如何展开的。现有的对话管理技术(如流程图、状态机、基于框架的系统等)不太适合对高度灵活的对话流进行建模,例如我们期望与基于 LLM 的系统(如 ChatGPT)交互时的对话流。
然而,由于学习一门新语言并非易事,Colang 被设计为自然语言和 python 的混合体。如果您熟悉 python,那么在看过一些示例后,即使没有任何解释,您也应该有信心使用 Colang。
概念
以下是该语言背后的主要概念
基于 LLM 的应用:使用 LLM 驱动的软件应用
机器人:基于 LLM 的应用 的同义词。
话语:来自用户或机器人的原始文本。
意图:用户/机器人话语的规范形式(即结构化表示)。
事件:已经发生且与对话相关的事情,例如用户沉默、用户点击了某些内容、用户做出了手势等。
动作:机器人可以调用的自定义代码;通常用于连接到第三方 API。
上下文:与对话相关的任何数据(即键值字典)。
流程:消息和事件的序列,可能带有额外的分支逻辑。
Rails:控制对话系统(又名机器人)行为的特定方式,例如不谈论政治、以特定方式响应某些用户请求、遵循预定义的对话路径、使用特定的语言风格、提取数据等。
语法
Colang 具有“pythonic”语法,因为大多数构造都类似于它们的 python 等价物,并且缩进被用作语法元素。
注意:与 python 不同,Colang 中建议的缩进是 两个空格,而不是四个。
核心语法元素
核心语法元素包括:块、语句、表达式、关键字和变量。主要有三种类型的块:用户消息块 (define user ...
)、流程块 (define flow ...
) 和 机器人消息块 (define bot ...
)。
用户消息
用户消息定义块定义应与各种用户话语关联的规范形式消息,例如
define user express greeting
"hello"
"hi"
define user request help
"I need help with something."
"I need your help."
机器人消息
机器人消息定义块定义应与各种机器人消息规范形式关联的话语
define bot express greeting
"Hello there!"
"Hi!"
define bot ask welfare
"How are you feeling today?"
如果每个机器人消息指定了多个话语,则意味着应随机选择其中一个。
带有变量的机器人消息
话语定义还可以包括对变量的引用(请参阅下面的 变量 部分)。
define bot express greeting
"Hello there, $name!"
或者,您也可以使用 Jinja 语法
define bot express greeting
"Hello there, {{ name }}!"
注意:对于更高级的用例,您还可以使用其他 Jinja 功能,例如 {% if ... %} ... {% endif %}
。
流程
流程表示您希望对话如何展开。它包括用户消息、机器人消息以及可能的其他事件的序列。
define flow hello
user express greeting
bot express greeting
bot ask welfare
此外,流程可以包含可以使用 if
和 when
建模的附加逻辑。
例如,要根据用户是否是第一次与机器人交谈来更改问候消息,我们可以执行以下操作(我们可以使用 if
来建模)
define flow hello
user express greeting
if $first_time_user
bot express greeting
bot ask welfare
else
bot expess welcome back
$first_time_user
上下文变量必须由宿主应用程序设置。
作为另一个示例,在询问用户感觉如何(bot ask welfare
)之后,我们可以根据用户响应有不同的路径(我们可以使用 when
来建模)
define flow hello
user express greeting
bot express greeting
bot ask welfare
when user express happiness
bot express happiness
else when user express sadness
bot express empathy
if/else
语句可用于评估涉及上下文变量的表达式,并相应地更改流程。when/else
语句可用于根据下一个用户消息/事件来分支流程。
子流程
子流程是一种特殊类型的流程。虽然流程旨在自动应用于当前对话(当存在匹配时),但子流程旨在由其他流程/子流程显式调用。可以使用 do
关键字和子流程的名称来调用子流程
define subflow check user authentication
if not $user_auth
bot inform authentication required
bot ask name
...
define flow greeting
"""We first authenticate the user, before continuing."""
user express greeting
do check user authentication
bot express greeting
子流程应用于可重用的对话逻辑片段,例如,身份验证、表单填写。
变量
对上下文变量的引用始终以 $
符号开头,例如 $name
。所有变量都是全局的,并且可以在所有流程中访问。
每个对话都与一个全局上下文相关联,该上下文包含一组变量及其各自的值(键值对)。上下文变量的值可以直接设置,也可以作为动作执行的返回值来设置。
define flow
...
$name = "John"
$allowed = execute check_if_allowed
上下文变量是动态类型的,它们可以是:布尔值、整数、浮点数和字符串。变量也可以保存复杂类型,例如列表和字典,但它们不能直接初始化为此类型的值,即该值将来自动作的返回值。
表达式
表达式可用于设置上下文变量的值。
支持的表达式类型
算术运算
使用
[...]
的数组索引用于数组和字符串的
len(...)
对字典对象使用“.”的属性访问器
动作
动作是可从流程调用的自定义函数。可以使用以下语法在流程中调用动作执行
define flow ...
...
$result = execute some_action(some_param_1=some_value_1, ...)
所有动作参数都必须像 python 中的关键字参数一样传递。
动作未在 Colang 中定义。它们在运行时由宿主应用程序提供给护栏配置。
结论
这是对 Colang 1.0 的简要介绍。有关更多详细信息,请查看 Examples 文件夹 文档。