강의 목표

- 특정 프롬프트가 채팅 중에 /on 을 입력하면 자동으로 리퀘스트에 들어가고(on 상태), /off를 입력하면 더 이상 들어가지 않게 만들기



특장점

- 물리적 토글 버튼 없이 채팅 중 명령어를 통해 특정 명령어를 토글할 수 있음

- 캐릭터 귀속인 글로벌 노트, 채팅 귀속인 작가의 노트 대신 탈옥 프롬프트처럼 프롬프트 자체에 귀속된 토글 가능 프롬프트를 확장하는 개념

- 가령 nsfw 장면에서 /nsfw on 명령어를 입력하여 nsfw 특화 프롬프트를 토글하거나, 전투 장면에서 /battle on 명령어를 입력하여 전투 특화 프롬프트를 토글하는 등, 범용 RP를 위한 챈산 프롬 사용 시 아쉬웠던 부분을 보완 가능

- 특정 조건에만 프롬프트가 삽입되는 방식이므로 사용하지 않을 때는 토큰이 절약됨



미리 읽기

리스 중괄호 구문 기초 강의: 변수

리스 중괄호 구문 기초 강의: 연산자

봇에 따라 자동으로 페르소나를 변경해 보자




위 글을 다 읽고 변수 기능, 연산자, #if 구문에 대한 기본적인 이해를 마쳤다는 전제 하에 시작한다.

예제로는 인풋 번역 프롬프트 를 사용해 볼 것이다.


Outputs MUST start with the following header:

Input Translation: (If the user's input is written in Korean, translate it into natural English, taking into account intended meaning, nuance, structure and overall context. Can be omitted if the input is English.)
예제: 인풋 번역 프롬프트



1. 전체 메커니즘 설계


채팅창에 /on을 입력하면 프롬프트가 전송되고, /off를 입력하면 더 이상 전송되지 않게 만들고자 한다.

이것을 좀 더 단순화하면, 결국 '특정 조건 하에서만 프롬프트가 삽입되는 기능', 즉 조건부 출력이라는 것을 알 수 있고,

결론적으로 {{#if}} 구문을 사용해야 한다는 결론을 내릴 수 있다.


{{#if (특정 조건)}}

Outputs MUST start with the following header:

Input Translation: (If the user's input is written in Korean, translate it into natural English, taking into account intended meaning, nuance, structure and overall context. Can be omitted if the input is English.)

{{/if}}

조건부 프롬프트 삽입



2. 조건 설계


변수를 활용하여 조건을 만들어주어야 한다는 기본적인 아이디어에서 출발하자.

'translate'라는 변수를 만들어 주고, 해당 변수의 값이 'on'이라면 프롬프트를 삽입하게 만드는 게 가장 단순할 것이다.


즉,

translate=on 이면 삽입인 구조이므로,

{{equal}} 구문을 사용하여 변수 translate의 값이 on인지를 판별해주면 된다.


{{equal::{{getvar::translate}}::on}}
변수 일치 확인


이 구문은 만약 translate가 on이라면 1, off라면(즉 on이 아니면) 0을 출력할 것이다.

이제 이것을 1번과 합쳐 보자.


{{#if {{equal::{{getvar::translate}}::on}}}}

Outputs MUST start with the following header:

Input Translation: (If the user's input is written in Korean, translate it into natural English, taking into account intended meaning, nuance, structure and overall context. Can be omitted if the input is English.)

{{/if}}

특정 변수 값 일치시 프롬프트 삽입


translate가 on이라면 프롬프트가 삽입되고, translate가 off라면(on이 아니라면) 프롬프트가 삽입되지 않게 하는 구문을 완성했다.


3. 명령어 설정


이제 우리가 원할 때 translate의 값을 on 또는 off로 변경하도록 만들어 보자. 즉, {{setvar}} 기능을 활용해야 한다.


{{setvar::translate::on}}
translate 변수에 on 할당하기


물론 매번 채팅창에 {{setvar::translate::on}} 을 입력해도 되지만, 그건 너무 귀찮은 짓이다.

정규식을 통해 /on 을 입력하면 그것이 자동으로 {{setvar::translate::on}} 로 변환되도록 하면 어떨까?

물론, /off 명령어도 설정해서 원할 때 토글을 끌 수 있도록 해야 할 것이다.


Modification Type입력문 수정
IN/on/off
OUT{{setvar::translate::on}}{{setvar::translate::off}}
정규식으로 명령어 설정



4. 적용하기


1) 프롬프트 템플릿의 적당한 위치에 2. 에서 완성된 조건부 프롬프트를 삽입한다. 

나는 글로벌 노트에 넣었다.



2) 모듈을 만들어서 /on과 /off 명령어를 세팅해 준다.




5. 테스트

유즈를 데려와 테스트를 해 보자.


1) 명령어 없이 입력



리퀘스트 로그에 프롬프트가 없는 것을 확인할 수 있다.결과물에도 출력되지 않았다.



2) 명령어 사용해서 입력



리퀘스트 로그에 프롬프트가 잘 삽입되었다.
결과물에도 출력되었다.


참고로, 이 때 명령어는 {{setvar}}로 치환되었기 때문에 디스플레이 상에도, 로그에도 남지 않는다.


잘 작동하는 것을 확인할 수 있다. /off 실험은 생략한다.



6. 응용

변수 이름, 명령어, 프롬프트를 바꾸면 얼마든지 응용 가능하다. 설명은 생략한다.




Q. 그냥 트리거 스크립트 쓰면 되는 거 아닌가요?

A. 트리거 스트립트 쓰면 내가 원하는 위치에 프롬프트 넣는 게 불가능함. 이 방식은 좀 귀찮지만 봇카드/페르소나/로어북/프롬프트 특정 위치 어디에나 쓸 수 있다는 장점이 있음.