인스트럭트 포맷
인스트럭트 포맷은 깨끗한 메시지 배열이 프롬프트 문자열로 렌더링되는 방식을 정의합니다. 파일 시스템이나 코드 실행에 접근할 수 없는 샌드박스 처리된 Handlebars 템플릿을 사용합니다.
포맷 관리자
기본 제공 포맷 관리자가 인스트럭트 포맷을 소유합니다. 포맷은 격리된
환경에서 렌더링되는 Handlebars 템플릿입니다. 템플릿은 content, role,
name만 받고, 문서화된 헬퍼만 사용할 수 있습니다. 템플릿은 Node.js
접근, 파일 시스템 접근, 임의 코드 실행 수단이 없습니다.
포맷은 다음을 기술합니다.
- system, user, assistant, tool 템플릿;
- BOS 및 EOS 토큰;
- 메시지 구분자;
- 특수 토큰.
기본 제공 포맷
NeoTavern에는 다음 포맷이 포함됩니다.
- ChatML —
<|im_start|>/<|im_end|>역할 블록. - Llama 3 — 역할 태그가 있는
<|begin_of_text|>. - Alpaca — 지시문과 응답 블록.
- Mistral —
[INST]/[/INST]블록. - Command-R —
<|START_OF_TURN_TOKEN|>블록. - 사용자 지정 포맷 — 활성 포맷으로 선택할 수 있는 사용자 정의 템플릿.
렌더링까지 깨끗한 메시지 배열
렌더링 단계까지 파이프라인은 역할(system, user, assistant,
tool)이 있는 구조화된 메시지 배열만 다룹니다. 매크로가 해석되고,
로어북과 메모리가 삽입되며, 컨텍스트 시프팅이 초과분을 제거하고,
플러그인 인터셉터가 이 배열을 수정합니다. 렌더링은 렌더링 단계에서
정확히 한 번 발생하므로 어댑터가 프롬프트를 두 번 다시
포맷하지 않습니다.
최종 출력
렌더링 단계는 두 가지 형태 중 하나를 만듭니다.
- 문자열 — 렌더링된 프롬프트. 텍스트 완성 프로바이더로 보내지고 진단에 사용됩니다.
- 구조화된 JSON —
GenerationMessage[]배열. 역할 태그가 있는 메시지를 받는 채팅 프로바이더로 보내집니다.
모드는 serializeAsText로 선택됩니다. 텍스트 어댑터(text-completion,
novelai, ai-horde, koboldai)는 항상 렌더링된 인스트럭트 프롬프트를
단일 user 메시지로 받고, 채팅 어댑터(openai-compatible,
anthropic)는 구조화된 배열을 받습니다.
매크로
{{user}}, {{char}}, 사용자 지정 변수는 최종 렌더링 전에
해석됩니다. 매크로는 템플릿 엔진 내부에서 확장되지 않으므로 템플릿
파일은 순수 마크업으로 유지됩니다.
사용자 지정 포맷 및 프리셋
활성 사용자 지정 포맷은 AppSettings.instructFormat에 저장됩니다.
설정되어 있으면 깨끗한 메시지 배열이 단일 문자열로 렌더링되고 포맷의
중지 문자열이 요청의 중지 시퀀스가 됩니다. null이면 네이티브 구조화
직렬화가 사용됩니다.
포맷은 버전이 있는 JSON 프리셋으로 가져오고 내보냅니다.
importInstructFormat()은 프리셋이 활성화되기 전에 검증합니다;exportInstructFormat()은 JSON에 안전하고 구분된 값을 만듭니다;- 프리셋은 버전을 지니므로 오래된 내보내기는 가져올 때 마이그레이션할 수 있습니다.