시리즈 AI 채팅 변수 관련 팁글


봇마다 페르소나를 따로 설정해서 노는 걸 좋아하는 챗붕이들의 오랜 염원인 챗별 페르소나/캐릭터별 페르소나...

그러나 아쉽게도 아직까지 해당 기능은 리스에 업데이트되지 않고 있다


이 글에서는 Curly Braced Syntaxes를 활용해 봇에 따라 페르소나 디스크립션을 갈아끼우는 방법을 소개할 예정이지만,

일단 명백한 한계 몇 가지가 있다는 사실을 먼저 밝혀 둠.

가장 큰 단점은 당연히 '디스크립션'만 갈아끼우는 거기 때문에 페르소나 카드는 바뀌지 않는다는 점.

하지만 나처럼 같은 페르소나 이미지를 돌려쓰는 경향이 있고 그래서 자주 헷갈린다면 채택해볼 만하다.



#if문 이해하기

일단 기본적인 아이디어는 중괄호 구문의 #if 를 사용하는 것이다. 이 기능을 간략하게 설명하자면,


{{#if 변수든뭐든뭔가조건값이 1이면(즉, 참이면)}}

지정된 문구를 출력한다

{{/if}}


따라서 다음과 같은 방식으로 작동한다.


if구문
결과값

{{#if 챗붕이의 여자친구 수}}

좋겠다 챗붕이!

{{/if}}

(챗붕이의 여자친구 수는 0이므로 아무것도 출력되지 않음)

{{#if 챗붕이에게는 여자친구가 없다}}

가엾은 챗붕이!

{{/if}

가엾은 챗붕이!
('챗붕이에게는 여자친구가 없다'는 참이므로 1이 반환됨. 따라서 지정된 문구가 출력됨.)


이 if문은 값이 거짓일 경우에는 아무것도 출력되지 않는다. 따라서 이런 게 가능해진다.

if문을 중첩해서 쌓아 보자.


{{#if 봇 이름이 밀리나}}

(밀리나용 디스크립션)

{{/if}}

{{#if 봇 이름이 유즈}}

(유즈용 디스크립션)

{{/if}}

{{#if 봇 이름이 카이다}}

(카이다용 디스크립션)

{{/if}}


봇 이름이 밀리나일 경우 밀리나용 디스크립션만 출력하고, 봇 이름이 카이다일 경우 카이다용 디스크립션만 출력한다.

이게 바로 봇에 따라 자동으로 페르소나를 변경하는 꼼수의 골자다.


equal문 이해하기

자, 그러면 우리는 이제 '봇 이름이 밀리나인지 아닌지'를 판별해서 if문에 넣어줘야 한다.

이 때 사용하는 것이 equal 구문이다.


생김새
기능
{{equal::값1::값2}}
값1과 값2가 같으면 참이므로 1 반환.
값1과 값2가 일치하지 않으면 거짓이므로 0 반환.


다음 구문이 어떤 의미를 가지고 있는지 해석할 수 있겠는가?


{{equal::{{char}}::밀리나}}


그렇다. {{char}}이 밀리나면 1을, {{char}}이 밀리나가 아니면 0을 반환하는 구문이다.



#if와 equal 합치기

이제 두 구문을 합체해 보자.


{{#if {{equal::{{char}}::밀리나}}}}

(밀리나용 디스크립션)

{{/if}}


이제 우리는 이 구문의 의미를 완전히 이해할 수 있다.

만약에 {{char}}과 밀리나가 일치한다면 (밀리나용 디스크립션)을 출력하라는 뜻이다.



실제로 적용해 보기

실험용으로 깡페르소나를 만들어 보자. 페르소나 프롬프트 칸에는 위에서 만든 구문을 넣되, 개행 방지를 위해 모양을 살짝 바꿔 준다.

어려울 건 없고, 한 if문이 끝난 뒤 다른 if문을 넣을 때 개행을 없애준 것 뿐이다.


{{#if {{equal::{{char}}::밀리나}}}}

이름: 밀리나 친구

나이: 18세

직업: 고등학생

{{/if}}{{#if {{equal::{{char}}::유즈}}}}

이름: 유즈 주인님

나이: 22세

직업: 부잣집 아들

{{/if}}{{#if {{equal::{{char}}::카이다}}}}

이름: 카이다 이웃

나이: 24세

직업: 편의점 주인

{{/if}}


테스트용 '유즈' 봇에 '안녕!'을 입력하고 리퀘스트 로그를 보자.

구문이 잘 작동한다면 유즈용 디스크립션이 삽입되었을 것이다.


입력창
결과물


성공적으로 유즈용 디스크립션만 삽입된 걸 볼 수 있다.

이제 위의 예시에서 봇 이름과 디스크립션을 알아서 수정해서 쓰면 된다. 물론 if문을 더 중첩하는 것도 가능하다.



응용하기

1. 디스크립션 일부만 변경하기

위에서 소개한 것은 페르소나 디스크립션을 통째로 갈아끼우는 방법이었다.

하지만 당연히 디스크립션의 일부만 갈아끼우는 것도 가능하다.

같은 봇에서 다양한 버전의 페르소나를 사용할 때, 기본 정보는 일치하지만 세계관에 따라 배경에 변주를 주고 싶을 때 등 다양한 상황에서 활용할 수 있다.


김철수-현대 배경
김철수-판타지 배경
이름: 김철수
나이: 30세
생김새: 검은 머리, 검은 눈, 평균보다 큰 키, 평범한 체형
성격: 성실하고 정직함. 늘 피곤해 함.
직업: 대학원생
능력: 뛰어난 행정 처리 및 엑셀 능력.

이름: 김철수
나이: 30세
생김새: 검은 머리, 검은 눈, 평균보다 큰 키, 평범한 체형
성격: 성실하고 정직함. 늘 피곤해 함.
직업: 파티의 길잡이
능력: 별을 보고 방향을 읽을 줄 앎. 수맥을 찾을 수 있음.


이런 경우에는,


이름: 김철수
나이: 30세
생김새: 검은 머리, 검은 눈, 평균보다 큰 키, 평범한 체형
성격: 성실하고 정직함. 늘 피곤해 함.
직업: {{#if {{equal::{{char}}::현대 봇}}대학원생{{/if}}{{#if {{equal::{{char}}::판타지 봇}}파티의 길잡이{{/if}} 
능력: {{#if {{equal::{{char}}::현대 봇}}뛰어난 행정 처리 및 엑셀 능력.{{/if}}{{#if {{equal::{{char}}::판타지 봇}}별을 보고 방향을 읽을 줄 앎. 수맥을 찾을 수 있음.{{/if}} 


이렇게 쓸 수 있다는 뜻이다.


2. 봇 디스크립션 변경하기

당연히 구문들은 봇 디스크립션에서도 작동하기 때문에, 역으로 페르소나에 따라 봇 디스크립션의 ## Relationship with {{user}} 같은 항목들을 적당히 변경해 줄 수 있다.

가령 김철수(밀리나의 동급생. 밀리나에게 혐오받고 있음.), 박영희(밀리나의 선생님. 밀리나가 짝사랑 중.)라는 두 페르소나가 있을 때, 페르소나 선택에 따라 밀리나의 봇 디스크립션을 다르게 만들 수 있다. 이 경우에는 당연히 {{equal::{{user}}::페르소나이름}}을 사용해 주면 된다.


## 밀리나 디스크립션
이름: 밀리나 피셔
나이: 16
외모: 어쩌구저쩌구...
...
<user>와의 관계: {{#if {{equal::{{user}}::김철수}}밀리나는 {{user}}를 극혐합니다. 그녀는 그가 그에게 말을 거는 것만으로도 불쾌해집니다.{{/if}}{{#if {{equal::{{user}}::박영희}}밀리나는 {{user}}를 존경하고 짝사랑하고 있습니다. 그녀는 {{user}}의 수업을 열심히 듣고 점심 시간에는 그녀를 찾아다닙니다.{{/if}}


이런 식으로.


이상!