출력 형식 프롬프팅
직접 간단한 출력 규칙을 설계해봅시다.
개요
Syntax는 프로그래밍 언어에서 주로 사용되는 용어로, 언어의 형식적 문법이라는 뜻을 가지고 있습니다.
구문의 형태를 나타내는 다른 키워드(format, form)에 비해 더욱 엄격한 의미를 가집니다.
지나치게 엄격하다는 점은 가끔씩 부작용으로 작용할 수도 있지만, 해당 글의 목표는
출력 규칙을 절대 벗어나지 않도록 하는 법을 익히는 것입니다.
이미지 출력
가장 기본적인 활용처입니다. 여러 개의 이미지 매크로가 등록되어 있을 때, 이를 출력시키는 방법입니다.
특수 구문을 출력시킬 때 필요한 두 가지는 출력 조건과 출력 문법입니다.
출력 조건은 어떤 상황에서 출력해야 하는지를 명시하는 부분입니다.
매우 일반적인 상황이므로, 상황이 변할 때마다 정도로 간략하게 명시해 두겠습니다.
💡 왜 때마다라는 워딩을 사용하는가?
상황이 변했을 경우라고 명시해 놓는다면, AI는 결정적으로 변한 단 하나의 순간,
혹은 아예 변하지 않았다고 해석할 수 있는 여지가 있습니다.
조금 더 빈번한 조건을 프롬프트로 줌으로써 한 채팅 안에 여러 번 이미지가 나오게 하는 프롬프트입니다.
(만약 이미지가 많이 나오는 게 싫다면 조절하셔도 좋습니다.)
출력 문법은 구체적으로 어떤 기호들을 어떻게 출력해야 하는지를 명시하는 부분입니다.
이미지 매크로를 분석해 본다면, 기본적으로 {{img::으로 시작하여 }}으로 끝남은 변하지 않습니다.
오직 중간의 이미지 번호 숫자만 변하므로, 아래와 같이 문법을 구성해볼 수 있습니다.
syntax:
{{img::이미지 번호}}
이제 정보가 불완전한 부분을 보완해주면 됩니다. 현재 해당 예시에서는 이미지 번호에 대한 설명이 없습니다.
등록된 각각의 이미지 번호에 대해 설명을 달아주면, 준비는 끝나게 됩니다.
예시를 구성한 프롬프트는 아래와 같습니다.
최신성 경향을 반영하여, 가장 아래쪽에 첨부하는 프롬프트입니다. XML 구문을 통해 "출력 규칙"을 분리하였습니다.
markdown
<output-syntax>
# 이미지 출력
- 상황이 변할 때마다 출력
- syntax: {{img::이미지 번호}}
## 이미지 번호 리스트
1: 무표정
2: 웃음
3: 슬픔
4: 화남
5: 당황
6: 부끄러움
7: 피곤
</output-syntax>상태창 출력
최신성 경향을 매우 적극적으로 활용하는 대표적인 방법입니다.
매 채팅마다 끝나기 전, 현재 상황을 요약적으로 정리하여 게임 상태창처럼 기록하는 기법입니다.
주로 마크다운의 코드블록(```) 문법을 활용하여 구현하는 것이 가장 잘 알려져 있습니다.
해당 설명에서도 이 방법을 사용해 보겠습니다.
사람이 보기에 상태창은 가장 아래에 있으므로 제일 아래에 출력해라 라고 하면 될까요?
아쉽게도 "제일 아래"라는 조건은 LLM에게 다소 추상적인 표현입니다.
일반적으로 뒤에 있는 텍스트는 스크롤을 내려야 하므로 아래에 있을 것이다, 라는 생각 과정이 필요합니다.
물론 LLM은 충분히 똑똑하기 때문에 이렇게 작성해도 문제는 없습니다.
다만 조금이나마 더욱 명확히 하기 위해, 여기서는 모든 대사가 끝난 후라는 출력 조건을 걸어보겠습니다.
한번 간단하게 현재 장소, 시간, 상황 요약이 담긴 상태창을 만들어보고 싶습니다.
대강 상태창 구조를 잡으면 아래와 같이 될 것 같습니다.
```
📍현재 위치
🕐현재 시간
📜현재 상황
```따로 불완전한 부분은 없어보입니다. 바로 적용이 가능해 보이므로, 아래와 같이 프롬프팅합니다.
markdown
<output-syntax>
# 상태창 출력
- 모든 대사가 끝난 후 출력
- 현재 위치와 시간은 매 턴마다 바뀐 정보 반영
- 현재 상황은 매 턴마다 상황을 요약해 기록
- syntax: ```
📍현재 위치
🕐현재 시간
📜현재 상황
```
</output-syntax>💡 추가적인 프롬프트가 들어가 있어요
각 항목에 대한 설명이 아예 존재하지 않는다면, 상태창 자체가 그대로 고정될 위험이 존재합니다.
상태창의 경우 항상 최신 정보를 반영하는 것이 중요하므로, 매 턴마다 등의 키워드로 업데이트 주기를 나타내 주어야 좋습니다.
원샷(One-Shot) 프롬프팅
syntax 기법 자체도 강력하지만, 가장 시너지를 내는 경우는 하나 이상의 예시가 있는 경우입니다.
예제가 없는 경우를 제로샷, 예제가 1개라면 원샷, 예제가 여러 개라면 퓨샷이라 일컫습니다.
대화를 진행한다면 자연스럽게 예시가 반영된 최신 대화들을 입력으로 넣어주니 퓨샷이 됩니다.
우리에게 필요한 건 처음 대화를 제로샷에서 원샷으로 조정하는 것입니다.
코멧에서는 이 처음 예시를 시스템 프롬프트 내부가 아닌, 시작 대화로 넣는 것을 적극 권장합니다.
코멧의 AI는 시작 상황이라는 프롬프트를 주고 시작 대화라는 출력을 자신이 했다고 인식하기 때문에, 시스템 프롬프트보다 더욱 강력합니다.
따라서 상태창을 사용한 경우, 대화 맨 끝에 실제로 특정 데이터가 들어간 상태창 예제를 넣어주는 것이 좋습니다.