Colang 指南#
本文档是 Colang 1.0 的简要介绍。
Colang 是一种建模语言,可以为会话系统设计 guardrails。
警告
Colang 可用于执行复杂的活动,例如调用 python 脚本并对底层语言模型执行多次调用。您应该避免从不受信任的来源加载 Colang 文件,而无需仔细检查。
为什么要使用一种新语言#
为会话系统创建 guardrails 需要某种形式的理解,即用户和机器人之间的对话是如何展开的。现有的对话管理技术,例如流程图、状态机、基于帧的系统等,不太适合对高度灵活的对话流进行建模,就像我们期望与基于 LLM 的系统(如 ChatGPT)交互时那样。
但是,由于学习一门新语言并非易事,因此 Colang 被设计为自然语言和 python 的混合体。如果您熟悉 python,那么即使没有任何解释,在看到一些示例后,您也应该有信心使用 Colang。
概念#
以下是该语言背后的主要概念
基于 LLM 的应用程序:一种使用 LLM 驱动的软件应用程序
Bot:基于 LLM 的应用程序的同义词。
Utterance:来自用户或机器人的原始文本。
Intent:用户/机器人 utterance 的规范形式(即结构化表示)。
Event:已经发生并且与对话相关的事情,例如用户静默、用户单击了某些内容、用户做出了手势等。
Action:机器人可以调用的自定义代码;通常用于连接到第三方 API。
Context:与对话相关的任何数据(即键值字典)。
Flow:一系列消息和事件,可能带有附加的分支逻辑。
Rails:控制会话系统(又名机器人)行为的特定方式,例如不谈论政治、以特定方式响应某些用户请求、遵循预定义的对话路径、使用特定的语言风格、提取数据等。
语法#
Colang 具有“pythonic”语法,因为大多数构造都类似于其 python 等效项,并且缩进用作语法元素。
注意
与 python 不同,Colang 中建议的缩进是两个空格,而不是四个空格。
核心语法元素#
核心语法元素是:块、语句、表达式、关键字和变量。有三种主要的块类型:用户消息块 (define user ...
)、流程块 (define flow ...
) 和 机器人消息块 (define bot ...
)。
用户消息#
用户消息定义块定义应与各种用户 utterance 关联的规范形式消息,例如
define user express greeting
"hello"
"hi"
define user request help
"I need help with something."
"I need your help."
机器人消息#
机器人消息定义块定义应与各种机器人消息规范形式关联的 utterance
define bot express greeting
"Hello there!"
"Hi!"
define bot ask welfare
"How are you feeling today?"
如果每个机器人消息指定多个 utterance,则表示应随机选择其中一个。
带有变量的机器人消息#
Utterance 定义还可以包括对变量的引用(参见下面的变量部分)。
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
。所有变量都是全局的,并且可以在所有流程中访问。
每个对话都与一个全局上下文相关联,该上下文包含一组变量及其各自的值(键值对)。上下文变量的值可以直接设置,也可以作为 action 执行的返回值。
define flow
...
$name = "John"
$allowed = execute check_if_allowed
上下文变量是动态类型的,它们可以是:布尔值、整数、浮点数和字符串。变量也可以包含复杂类型,例如列表和字典,但它们不能直接初始化为此类型的值,即该值将来自 action 的返回值。
表达式#
表达式可用于设置上下文变量的值。
支持的表达式类型
算术运算
使用
[...]
的数组索引len(...)
用于数组和字符串使用“.”的属性访问器,用于 dict 对象
操作#
操作是可以从流程中调用的自定义函数。可以使用以下语法在流程中调用操作执行
define flow ...
...
$result = execute some_action(some_param_1=some_value_1, ...)
所有操作参数都必须像 Python 中的关键字参数一样传递。
操作不是在 Colang 中定义的。它们由宿主应用程序在运行时提供给 guardrails 配置。
结论#
这是对 Colang 1.0 的简要介绍。有关更多详细信息,请查看示例文件夹文档。