从 Colang 1 迁移到 Colang 2

NeMo Guardrails CLI 提供了一个工具 (nemoguardrails convert ...),用于将 guardrail 配置从 Colang 1.0 格式转换为 Colang 2.x。它对文件的内容执行多项语法转换,例如转换某些关键字和更改某些标识符的大小写。

警告

转换工具未涵盖某些边缘情况。您应始终在转换后手动审查 guardrail 配置。

工作原理

该工具遍历 path 参数指定的目录,并将转换应用于每个以 .co 结尾的文件。转换包括

  • define flow 转换为 flow

  • define subflow 转换为 flow

  • define bot 转换为 flow bot

  • define user 转换为 flow user

  • execute 转换为 await

  • 转换 await 之后的 snake_case 标识符为 CamelCase,并在其后附加关键字 Action,同时保留使用的任何参数。

  • else when 转换为 or when

  • stop 转换为 abort

  • bot 之后的带引号的字符串转换为 bot sayor bot say

  • user 之后的带引号的字符串转换为 user saidor user said

  • 转换匿名流程。

  • 为根流程(需要激活的流程)使用 active 装饰器。

  • global 关键字添加到全局变量。

  • ... 转换为 Colang 2 中相应的语法。

生成运算符

Colang 1.0 和 2.0 之间,生成操作的语法略有变化。 以下 Colang 1.0 代码段

# some instruction in natural language
$var_name = ...

它被翻译为

$name = ... "some instruction in natural language"

通用匹配

在 Colang 1.0 中,可以使用 user ...bot ... 进行通用匹配。 这些在 Colang 2.0 中具有不同的等效项。 ... 不再用于匹配,仅用于生成。

转换期间应用以下更改

  • user ... 被翻译为 user said something

  • bot ... 被翻译为 bot said something

Rail 配置

Colang 1.0 配置可以在 rails 字段中定义某些 rail。

  • 如果在 config.yml 中定义了 rail,则会生成一个 _rails.co 文件,其中包含定义的 rail。

示例流程转换

例如,以下流程

define flow
  user express greeting
  bot express greeting

被转换为

@active
flow express_greeting
  user express greeting
  bot express greeting

注意

按照惯例,用户流程使用过去时,而机器人流程使用现在时。但是,迁移工具不强制执行此约定。

该工具跟踪处理的行数和每个文件中所做的更改数。它还会计算更改的文件总数。

警告

该工具修改原始文件。建议使用版本控制来跟踪工具所做的更改。它还可以让您查看原始文件和修改后文件之间的差异。

用法

要使用转换工具,请使用以下命令

nemoguardrails convert /path/to/directory

convert 命令有几个选项

  • --verbose--no-verbose:是否应详细迁移并输出详细日志。默认为 no-verbose

  • --validate--no-validate:迁移是否应使用 Colang Parser 验证输出。默认为 no-validate

  • --use-active-decorator--no-use-active-decorator:迁移是否应使用 active 装饰器。默认为 use-active-decorator

假设和限制

  • 该工具假定输入文件格式正确。如果文件格式不正确,则该工具可能无法按预期工作。

  • 该工具使用正则表达式来查找和替换文本中的某些模式。如果输入文件包含与这些模式匹配但不应替换的文本,则该工具可能会产生不正确的结果。

  • 该工具重命名原始文件,并将转换后的内容写入具有原始名称的新文件。使用版本控制来跟踪工具所做的更改。

  • 该工具不处理文件读取和写入操作期间可能发生的错误。如果发生错误,该工具会记录错误并继续处理下一个文件。

  • 流程定义中不支持使用 -+ 等字符以及 orand 等标记,迁移工具不处理此转换。

  • 更好的做法是在流程开始时定义全局变量。但是,迁移工具不强制执行此操作。