Colang 指南#

本文档是对 Colang 1.0 的简要介绍。

Colang 是一种建模语言,支持会话系统护栏的设计。

警告

Colang 可用于执行复杂的活动,例如调用 python 脚本以及对底层语言模型执行多次调用。您应避免从不受信任的来源加载 Colang 文件,而未经过仔细检查。

为什么需要一种新语言#

为会话系统创建护栏需要某种形式的理解,即用户和机器人之间的对话如何展开。现有的对话管理技术,如流程图、状态机、基于框架的系统等,不太适合建模高度灵活的会话流,例如我们期望与基于 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

此外,流还可以包含可以使用 ifwhen 建模的附加逻辑。

例如,为了根据用户是否是第一次与机器人交谈来更改问候消息,我们可以执行以下操作(我们可以使用 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(...)

  • 使用“.”进行 dict 对象属性访问器

动作#

动作是可从流中调用的自定义函数。可以使用以下语法在流中调用动作执行

define flow ...
  ...
  $result = execute some_action(some_param_1=some_value_1, ...)

所有动作参数都必须像 python 中的关键字参数一样传递。

动作未在 Colang 中定义。它们在运行时由宿主应用程序提供给护栏配置。

结论#

这是对 Colang 1.0 的简要介绍。有关更多详细信息,请查看 Examples 文件夹 文档。