语义核心提示模版语法

语义内核提示模板语言是一种使用纯文本定义和撰写 AI 函数的简单方法。 可以使用它创建自然语言提示、生成响应、提取信息、调用其他提示或执行可使用文本表达的任何其他任务。

该语言支持三个基本功能,允许你 1) 包括变量,2) 调用外部函数,3) 将参数传递给函数。

无需编写任何代码或导入任何外部库,只需使用大括号 {{...}} 在提示中嵌入表达式。 语义内核将分析模板并执行其背后的逻辑。 这样,即可轻松地将 AI 集成到应用中,只需最少的努力和最大的灵活性。

提示

如果需要更多功能,我们还支持:HandlebarsLiquid 模板引擎,这使你可以使用循环、条件和其他高级功能。

变量

若要在提示中包含变量值,请使用 {{$variableName}} 语法。 例如,如果你有一个名为 name 的变量,该变量保存用户名,则可以编写:

Hello {{$name}}, welcome to Semantic Kernel!

这将生成具有用户名的问候语。

将忽略空格,因此,如果发现它更具可读性,还可以编写:

Hello {{ $name }}, welcome to Semantic Kernel!

函数调用

若要调用外部函数并在提示中嵌入结果,请使用 {{namespace.functionName}} 语法。 例如,如果有一个名为 weather.getForecast 的函数返回给定位置的天气预报,则可以编写:

The weather today is {{weather.getForecast}}.

这将生成一个句子,其中包含存储在 input 变量中的默认位置的天气预报。 调用函数时,内核会自动设置 input 变量。 例如,上述代码等效于:

The weather today is {{weather.getForecast $input}}.

函数参数

若要调用外部函数并向其传递参数,请使用 {{namespace.functionName $varName}}{{namespace.functionName "value"}} 语法。 例如,如果要将其他输入传递给天气预报函数,可以编写:

The weather today in {{$city}} is {{weather.getForecast $city}}.
The weather today in Schio is {{weather.getForecast "Schio"}}.

这将生成两个关于不同地点天气预报的句子,使用存储在city变量中的城市及在提示模板中硬编码的“Schio”位置值。

关于特殊字符的注释

语义函数模板是文本文件,因此无需转义特殊字符(如换行符和制表符)。 但是,有两种情况需要特殊语法:

  1. 在提示模板中包含双大括号
  2. 将包含引号的硬编码值传递给函数

提示需要双大括号

双大括号具有特殊的用例,它们用于将变量、值和函数注入模板。

如果需要在提示中包含 {{}} 序列,这可能会触发特殊的呈现逻辑,最佳解决方案是使用用引号括起来的字符串值,例如 {{ "{{" }}{{ "}}" }}

例如:

{{ "{{" }} and {{ "}}" }} are special SK sequences.

将呈现为:

{{ and }} are special SK sequences.

包含引号和转义字符的值

可以使用 单引号双引号括起来。

为了避免需要特殊语法,在使用包含 单引号的值时,建议用 双引号将值括起来。 同样,使用包含 双引号的值时,将值用 单引号括起来

例如:

...text... {{ functionName "one 'quoted' word" }} ...text...
...text... {{ functionName 'one "quoted" word' }} ...text...

对于值包含单引号和双引号的情况,您将需要使用特殊 «\» 符号进行转义

在值周围使用双引号时,请使用 «\"» 在值中包含双引号符号:

... {{ "quotes' \"escaping\" example" }} ...

同样,使用单引号时,请使用 «\'» 在值中包含单引号:

... {{ 'quotes\' "escaping" example' }} ...

两者都呈现为:

... quotes' "escaping" example ...

请注意,为了一致性,序列 «\'»«\"» 始终呈现为 «'»«"»,即使在可能不需要转义的情况下也是如此。

例如:

... {{ 'no need to \"escape" ' }} ...

等效于:

... {{ 'no need to "escape" ' }} ...

两者都呈现为:

... no need to "escape" ...

如果您需要在引号前添加反斜杠,由于 «\» 是特殊字符,因此您也需要对其进行转义,并且使用特殊序列 «\\\'»«\\\"»

例如:

{{ 'two special chars \\\' here' }}

呈现为:

two special chars \' here

与单引号和双引号类似,这个符号 «\» 并不总是需要转义。 但是,为了一致性,即使没有必要,也可以进行转义。

例如:

... {{ 'c:\\documents\\ai' }} ...

等效于:

... {{ 'c:\documents\ai' }} ...

两者都被呈现为:

... c:\documents\ai ...

最后,反斜杠仅在用于 «'»«"»«\»前时具有特殊意义。

在所有其他情况下,反斜杠字符没有影响,并按原样呈现。 例如:

{{ "nothing special about these sequences: \0 \n \t \r \foo" }}

呈现为:

nothing special about these sequences: \0 \n \t \r \foo

后续步骤

语义内核除了支持自己的内置格式外,还支持其他常用的模板格式。 在下一部分中,我们将介绍其他格式、HandlebarsLiquid 模板。