Semantic Kernel 프롬프트 템플릿 문법

Semantic Kernel 프롬프트 템플릿 문법

출처: 공식문서

Semantic Kernel의 프롬프트 템플릿 언어는 평범한 텍스트로 AI 함수를 정의하고 조합할 수 있게 해주는 간단한 방법이에요. 자연어 프롬프트를 만들고, 응답을 생성하고, 정보를 추출하고, 다른 프롬프트를 호출하거나, 텍스트로 표현할 수 있는 어떤 작업이든 처리할 수 있어요.

이 언어는 세 가지 기본 기능을 지원해요. 첫째 변수를 포함하고, 둘째 외부 함수를 호출하고, 셋째 함수에 파라미터를 전달하는 기능이에요.

코드를 작성하거나 외부 라이브러리를 가져올 필요 없이, 중괄호 {{...}}로 프롬프트 안에 표현식을 넣으면 돼요. Semantic Kernel이 템플릿을 파싱해서 그 뒤에 있는 로직을 실행해 줘요. 덕분에 최소한의 노력으로 최대한의 유연성을 누리면서 AI를 앱에 쉽게 통합할 수 있어요.

[!TIP] 더 많은 기능이 필요하다면 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" 위치 값을 써요.

특수 문자에 관한 참고 사항

Semantic 함수 템플릿은 텍스트 파일이기 때문에 줄바꿈이나 탭 같은 특수 문자를 이스케이프할 필요가 없어요. 다만 특수 문법이 필요한 경우가 두 가지 있어요.

  1. 프롬프트 템플릿에 이중 중괄호를 포함할 때
  2. 함수에 따옴표가 포함된 하드코딩 값을 전달할 때

이중 중괄호가 필요한 프롬프트

이중 중괄호는 변수, 값, 함수를 템플릿에 주입하는 특별한 용도로 쓰여요.

프롬프트에 {{}} 시퀀스를 직접 넣어야 할 때는, 특수 렌더링 로직을 유발할 수 있으므로 따옴표로 감싼 문자열 값을 쓰는 게 가장 좋아요. 예를 들어 {{ "{{" }}{{ "}}" }}처럼요.

예를 들어:

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

이것은 아래처럼 렌더링돼요.

{{ and }} are special SK sequences.

따옴표가 포함된 값과 이스케이프

값은 작은따옴표큰따옴표로 감쌀 수 있어요.

_작은따옴표_가 포함된 값을 다룰 때는 특수 문법을 피하기 위해 그 값을 _큰따옴표_로 감싸는 걸 권장해요. 마찬가지로 _큰따옴표_가 포함된 값은 _작은따옴표_로 감싸요.

예를 들어:

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

값에 작은따옴표와 큰따옴표가 모두 포함된 경우에는 이스케이프(escaping)가 필요해요. 특수 기호 «\» 를 사용해요.

값을 큰따옴표로 감쌀 때 값 안에 큰따옴표 기호를 넣으려면 «\"» 를 사용해요:

... {{ "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

더 알아보기 (Learn more)

Semantic Kernel은 자체 내장 형식 외에도 다른 인기 있는 템플릿 형식을 지원해요. 다음 섹션에서 추가 형식인 HandlebarsLiquid 템플릿을 다뤄요.