강의 목표
- 특정 프롬프트가 채팅 중에 /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: {{/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: {{/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. 트리거 스트립트 쓰면 내가 원하는 위치에 프롬프트 넣는 게 불가능함. 이 방식은 좀 귀찮지만 봇카드/페르소나/로어북/프롬프트 특정 위치 어디에나 쓸 수 있다는 장점이 있음.