프롬프트 매크로
매크로는 Marinara가 프롬프트를 만들 때 내 이름이나 오늘 날짜 같은 실제 값으로 바꿔 넣는 짧은 {{tag}} 표기입니다. 이 가이드에서는 기본 제공 매크로 전부와 매크로를 입력할 수 있는 위치, 피해야 할 실수를 설명합니다.
매크로가 동작하는 곳
Marinara는 AI에 보낼 텍스트를 만들 때 각 {{tag}}를 현재 값으로 바꿉니다. 매크로를 켜는 스위치는 없습니다. 매크로를 지원하는 입력란이라면 언제나 값을 치환합니다. 기본 제공 매크로의 이름은 대소문자를 구분하지 않으므로 {{user}}와 {{USER}} 둘 다 동작합니다. 매크로 값 안에 다른 매크로가 들어 있어도 Marinara가 그 매크로까지 치환합니다.
다음 위치에서 매크로를 입력할 수 있습니다.
- Character Editor(캐릭터 편집기)의 캐릭터 필드: Description, Personality, Backstory, Appearance, Scenario, Example Dialogue, System Prompt, Post-History Instructions, 그리고 Depth Prompt(깊이 주입 프롬프트).
- Persona Editor(페르소나 편집기)의 페르소나 필드(카드 필드가 같습니다).
- 로어북 항목의 Description 및 Content 필드.
- Preset Editor(프리셋 편집기)의 프롬프트 프리셋 섹션.
- 정규식 스크립트의 Find, Replace, Trim 필드.
- 에이전트 프롬프트 템플릿.
- 채팅 입력란. 메시지에
{{roll:1d20}}을 입력하면 메시지를 보내기 전에 값이 치환됩니다.
매크로는 Marinara 안에서 처리되므로 따로 준비할 것도, API 키도 필요 없습니다. 다만 기능 2가지는 앱의 다른 부분에 의존합니다.
- 프리셋 변수(
{{NAME}}포괄 표기)는 이를 정의한 프롬프트 프리셋이 있어야 합니다. 프리셋 변수를 참고하세요. - 에이전트 매크로
{{agent::TYPE}}는 해당 에이전트가 실행되어 출력을 만들어 낸 뒤에야 텍스트를 보여 줍니다.
정체성, 캐릭터, 페르소나 매크로
이 매크로들은 말하는 쪽과 대답하는 캐릭터의 이름 및 카드 필드를 끌어옵니다. user는 나 자신(또는 활성 페르소나)이고, character는 대답하는 봇입니다.
| 매크로 | 치환 결과 |
{{user}} / {{userName}} | 현재 표시 이름(또는 페르소나 이름). 페르소나를 설정하지 않았으면 기본값은 User입니다. |
{{userNamePhonetic}} | 페르소나의 Phonetic 이름. 비어 있으면 {{user}}입니다. |
{{char}} / {{charName}} | 현재 캐릭터의 이름. 기본값은 Character입니다. |
{{21-character-card-ID}} | 다른 캐릭터의 이름입니다. 자리 표시자 텍스트를 해당 카드의 정확한 21자 ID로 바꾸면 카드를 컨텍스트에 포함합니다. |
{{persona-21-character-card-ID}} | 다른 페르소나의 이름입니다. persona- 뒤의 자리 표시자 텍스트를 해당 카드의 정확한 21자 ID로 바꾸면 카드를 컨텍스트에 포함합니다. |
{{charNamePhonetic}} | 캐릭터의 Phonetic 이름. 비어 있으면 {{char}}입니다. |
{{characters}} | 비활성화한 캐릭터를 포함해 채팅에 있는 모든 캐릭터를 쉼표로 이어 붙입니다. 이 매크로는 이름만 추가하며, 비활성화한 캐릭터 카드를 프롬프트에 추가하지 않습니다. |
{{group}} | 그룹 채팅에서 지금 응답 중인 캐릭터를 뺀 나머지 활성 캐릭터 전부. 페르소나는 이 캐릭터 명단에 포함되지 않습니다. |
{{persona}} | 페르소나의 Description, Personality, Backstory, Appearance, Scenario를 줄바꿈으로 이어 붙입니다. |
{{personaDescription}} | 페르소나의 Description 필드. |
{{personaPersonality}} | 페르소나의 Personality 필드. |
{{personaBackstory}} | 페르소나의 Backstory 필드. |
{{personaAppearance}} | 페르소나의 Appearance 필드. |
{{personaScenario}} | 페르소나의 Scenario 필드. |
다음 캐릭터 필드 매크로는 현재 캐릭터의 카드를 읽습니다.
| 매크로 | 캐릭터 카드 필드 |
{{description}} | Description |
{{personality}} | Personality |
{{backstory}} | Backstory |
{{appearance}} | Appearance |
{{scenario}} | Scenario |
{{example}} | Example Dialogue |
{{charSysInfo}} | System Prompt |
{{charPostHistory}} | Post-History Instructions |
캐릭터가 한 명인 채팅에서는 그 캐릭터를 기준으로 치환됩니다. 그룹 채팅에서는 기본적으로 첫 번째 캐릭터를 기준으로 치환됩니다. 캐릭터마다 같은 텍스트를 반복하려면 대괄호 그룹 블록 안에 넣으세요. 그룹 블록은 조건부 프롬프트에서 설명합니다.
{{group}}은 개별 그룹 생성 중에도 지금 응답하는 캐릭터를 따라갑니다. 예를 들어 Powers That Be, Maukie, Pantalone가 있는 Roleplay 그룹에서 Pantalone가 응답 중이라면 {{group}}은 Powers That Be, Maukie로 치환됩니다. 이름이 {{user}}와 우연히 같더라도 캐릭터 카드는 이 명단에 그대로 남습니다.
Phonetic 이름 필드는 2가지 역할을 합니다. 음성 합성이 이름을 어떻게 발음할지 정하고, {{charNamePhonetic}}과 {{userNamePhonetic}}에도 값을 공급합니다. 이 필드는 Character Editor와 Persona Editor 양쪽에 있습니다.
현재 채팅에 없는 캐릭터를 참조하려면 카드 ID를 복사해 {{V1StGXR8_Z5jdHi6B-myT}}처럼 중괄호 두 개 안에 직접 넣으세요. <나 > 문자는 넣지 마세요. Marinara는 매크로를 캐릭터 이름으로 바꿉니다. 프롬프트 프리셋을 쓰는 Roleplay 채팅에서는 참조한 카드의 Description, Personality, Appearance, Backstory, Scenario, Example Dialogue도 시스템 프롬프트에 추가하며, 그 밖의 채팅에서는 매크로가 이름으로만 바뀝니다. 채팅 메시지와 프롬프트 필드에서 동작하고, 프리셋을 쓰는 Roleplay 채팅에서는 활성화된 로어북 항목에서도 동작합니다. 참조한 카드의 첫 인사말은 제외됩니다. 그 카드에 연결된 활성 로어북에는 평소의 키워드, constant, 필터, 확률, 토큰 예산 규칙이 그대로 적용됩니다. 이미 채팅에 있는 캐릭터라면 매크로는 그대로 캐릭터 이름으로 바뀌고, 카드는 한 번 더 추가되지 않습니다.
활성 페르소나가 아닌 다른 페르소나를 참조하려면 {{persona-P1StGXR8_Z5jdHi6B-myT}}처럼 복사한 ID 앞에 persona-를 붙이세요. Marinara는 매크로를 페르소나 이름으로 바꾸고, 그 카드의 Description, Personality, Appearance, Backstory, Scenario를 같은 ID Macro Cards 컨텍스트에 추가합니다. 그 페르소나에 연결된 활성 로어북은 평소의 활성화 규칙을 따릅니다.
Conversation 모드 매크로
이 4가지 매크로는 Conversation Mode에서만 동작합니다. 다른 모드에서는 같은 카드나 프리셋 텍스트를 여러 모드에서 공유하더라도 항상 빈 값으로 치환됩니다.
| 매크로 | 치환 결과 |
{{convo_display}} | 캐릭터의 Convo Display Name(대화(콘보) 표시 이름). 비어 있으면 카드 이름입니다. |
{{char_about}} | 캐릭터의 현재 About Me(채팅별 재정의가 있으면 그 값, 없으면 카드 기본값). |
{{persona_about}} | 페르소나의 현재 About Me. |
{{convo_behavior}} | 캐릭터의 Convo Behavior(대화(콘보) 동작) 텍스트. 단, 삽입 설정이 이 매크로 위치에 넣도록 되어 있을 때만 나옵니다. |
이 필드들은 Character Editor와 Persona Editor의 Convo 탭에서 편집합니다. 전체 설정 방법은 Conversation Mode 프로필(Display Name, About Me, Behavior)를 참고하세요.
Conversation 배치 매크로
Conversation Mode는 여러 블록을 프롬프트에 자동으로 넣어 줍니다. 이 매크로들을 쓰면 프리셋에서 그 블록을 원하는 위치로 옮길 수 있습니다. 매크로를 사용하면 Marinara는 해당 블록을 매크로 자리에 렌더링하고 자동 삽입은 건너뜁니다. 그래서 내용이 중복되지 않습니다. 각 매크로에는 별칭이 하나 이상 있고, 모든 별칭은 동작이 같습니다.
| 매크로(및 별칭) | 삽입되는 내용 |
{{context}}, {{status}} | 대화 컨텍스트 / 상태 블록. |
{{commands}}, {{commandList}} | 사용 가능한 명령어 안내. |
{{reactRules}}, {{emojiReact}} | 사용자 지정 이모지 반응 규칙. |
{{replyRules}} | 사용자 지정 이모지 및 스티커 답장 규칙. |
{{memories}}, {{memoryRecall}} | 기억 회상 블록. |
{{lorebook}}, {{lore}} | 로어북 주입. |
이 매크로들은 Conversation Mode에서만 적용됩니다. 캐릭터가 한 명인 대화에서 {{char_about}} / {{persona_about}}(위 참고)로 참가자 소개를 직접 배치할 때도 방식은 같습니다. Marinara는 자동 참가자 "about me" 블록을 건너뛰므로 소개가 두 번 들어가지 않습니다. 그룹 대화에서는 자동 참가자 블록이 그대로 유지됩니다. 단수형 매크로는 참가자 한 명만 담당하므로 나머지 참가자의 소개를 가려서는 안 되기 때문입니다.
컨텍스트 매크로
다음 매크로들은 현재 채팅과 현재 요청의 정보를 나타냅니다.
| 매크로 | 치환 결과 |
{{input}} | 프롬프트에서 사용할 수 있는 가장 최근 user 메시지. |
{{model}} | 모델을 선택한 경우 현재 모델 이름. |
{{reasoning}} | 이 답변을 생성할 때 쓰는 추론 수준입니다. low, medium, high, xhigh, max 중 하나이거나, 모델에게 생각하라고 요청하지 않을 때는 off입니다. |
{{chatId}} | 현재 채팅의 ID. |
{{lastGenerationType}} | 이 답변을 생성하는 이유를 나타내는 라벨. |
{{idle_duration}} | 마지막 채팅 활동 이후 지난 시간. 8 minutes, 1 hour 5 minutes 같은 텍스트입니다. |
{{gameStoryboardKeyframeCount}} | Game Mode의 현재 Keyframes per Turn(턴당 키프레임 수) 목표값. 1에서 6까지이며 기본값은 3입니다. |
{{agent::TYPE}} | 지정한 종류의 에이전트가 저장한 출력. |
{{reasoning}}은 프리셋, 계정, 채팅 설정을 겹쳐 적용한 뒤 모델이 받는 수준을 나타냅니다. Maximum(최대)은 모델이 받아들이는 가장 높은 수준으로 표시되므로 max, xhigh, high 중 하나로 읽힐 수 있습니다. off는 거짓으로 읽히므로 {{#if reasoning}}은 모델이 생각하는 동안에만 블록을 남깁니다. 프리셋이나 채팅에 이미 reasoning이라는 이름의 자체 변수가 있다면, 그 변수가 이름을 유지합니다.
{{lastGenerationType}}의 값은 단순한 라벨입니다. 앱에서 볼 수 있는 값의 예로는 normal, continue, regenerate, impersonate, guided, autonomous, turn_game, preview, game_setup, lorebook_scan, retry_agents가 있습니다. 이 목록은 늘어날 수 있으므로 고정된 집합이 아니라 예시로 봐 주세요.
{{gameStoryboardKeyframeCount}}는 기본 제공 Storyboard Game Prompt를 포함한 Game Mode의 GM 프롬프트에 전달됩니다. 이 값은 서술의 목표치일 뿐, 정확히 그만큼의 문단을 요구하는 것은 아닙니다. 해당 턴에 시각적으로 구분되는 순간이 충분하지 않으면 스토리보드 플래너는 그보다 적은 컷을 반환합니다.
{{agent::TYPE}} 매크로는 에이전트가 저장한 출력을 넣습니다. 에이전트는 장면 트래커 같은 항목을 뒤에서 채워 주는 보조 기능입니다. 가장 쉬운 추가 방법은 Preset Editor를 쓰는 것입니다. Add Section(섹션 추가)을 클릭하고 Agent Sections(에이전트 섹션) 그룹을 연 다음 에이전트를 고르세요. 그러면 Marinara가 알맞은 {{agent::TYPE}} 표기가 이미 들어 있는 섹션을 만들어 줍니다. 이 매크로는 가장 마지막에 치환되므로, 에이전트가 만든 텍스트가 프롬프트에 매크로를 더 끼워 넣을 수는 없습니다.
로어북 Outlet 매크로
{{outlet::name}}은 Position(위치)이 Outlet이고 Outlet name이 name과 정확히 일치하는 로어북 항목의 내용을 넣습니다. Outlet 이름은 대소문자를 구분합니다. 예를 들어 {{outlet::character_rules}}는 Character_Rules라는 이름의 Outlet과 일치하지 않습니다.
Outlet 항목도 평소와 같은 로어북 활성화 방식을 따릅니다. 키워드, Constant 모드, 확률, 필터, 타이밍, 항목 개수 제한, 토큰 예산이 이번 생성에서 그 항목을 활성화할지 결정합니다. Outlet 이름이 같은 활성 항목들은 Order(순서) 순서대로 줄바꿈으로 구분해 이어 붙입니다. 이 내용은 매크로 자리에만 들어가며, 일반 로어북 위치에 다시 추가되지는 않습니다.
Outlet 매크로는 Conversation, Roleplay, Game 모드의 프롬프트 섹션에서 쓸 수 있습니다. 프리셋의 로어북 표시자보다 앞에 두어도 동작하고, Outlet 항목만 쓴다면 프리셋에 로어북 표시자가 없어도 됩니다. 알 수 없거나 활성화되지 않은 Outlet은 빈 값으로 치환됩니다. Outlet 항목은 다른 Outlet 매크로를 펼치지 못하므로 중첩된 Outlet은 재귀하지 않습니다.
로어북 크기 매크로
{{lorebooksize::ID}}는 지정한 ID의 로어북에 있는 전체 항목 수로 치환됩니다. ID를 로어북의 ID로 바꾸세요. ID는 Lorebooks(로어북) 패널에서 복사할 수 있습니다. 예를 들어 ID가 V1StGXR8_Z5jdHi6B-myT이고 항목이 151개인 로어북이라면 {{lorebooksize::V1StGXR8_Z5jdHi6B-myT}}는 151로 치환됩니다.
알 수 없는 로어북 ID는 0으로 치환됩니다. 켜져 있든, 꺼져 있든, 폴더 안에 있든 관계없이 모든 항목을 셉니다.
프롬프트 섹션, 캐릭터 카드 필드, 로어북 항목 내용 등 매크로를 치환하는 모든 곳에서 이 매크로를 쓸 수 있습니다.
로어북 Include 매크로
{{include::ENTRY}}는 로어북 항목의 텍스트를 매크로를 쓴 자리에 넣습니다. 하우스 룰처럼 여러 곳에서 함께 쓰는 텍스트는 항목 하나에 넣어 두고 다른 항목, 프롬프트 섹션, 카드에서 재사용하세요. 그러면 한 곳만 고치면 됩니다. ENTRY를 항목의 ID나 이름으로 바꾸세요. 이름은 대소문자를 구분하지 않습니다.
- 로어북 항목 안에서는 그 항목이 들어 있는 로어북에서 이름을 찾습니다.
- 그 밖의 곳에서는 이 채팅이 쓰는 로어북에서 이름을 찾습니다. 채팅에 추가한 로어북, 채팅의 캐릭터와 페르소나에 연결된 로어북, 전역 로어북이 여기에 해당합니다.
- ID로는 어느 로어북에 있는 항목이든 찾을 수 있습니다.
{{include::BOOK::ENTRY}}는 ID나 이름으로 지정한 로어북에서 항목을 가져옵니다. 그 로어북은 채팅에 추가되어 있을 필요가 없고, 꺼져 있어도 됩니다.
{{include::Rules of the arena}}
{{include::Shared lore::Rules of the arena}}포함되는 항목은 활성화될 필요가 없고 꺼져 있어도 되므로, 다른 곳에 포함하는 용도로만 쓰는 항목을 따로 둘 수 있습니다. 포함된 텍스트 안의 매크로도 평소처럼 동작하고, 그 텍스트가 다른 항목을 다시 포함할 수도 있습니다. 자기 자신을 포함하는 항목처럼 include 매크로가 이미 펼쳐지는 중인 항목을 다시 가리키면, 그 매크로는 끝없이 반복되지 않고 빈 값으로 치환됩니다. 찾지 못한 항목이나 로어북도 빈 값으로 치환됩니다.
이름과 ID는 일반 텍스트로 쓰세요. {{include::{{char}}}}처럼 그 안에 넣은 매크로는 치환되지 않습니다.
시간 매크로
현실 세계의 시간 매크로는 한 번의 치환에서 같은 시각 하나를 읽으므로 서로 값이 어긋나지 않습니다. 시간대는 브라우저에서 가져옵니다.
| 매크로 | 치환 결과 |
{{date}} | 오늘 날짜. YYYY-MM-DD 형식입니다. |
{{time}} | 현재 시각. 24시간제 HH:MM 형식입니다. |
{{datetime}} / {{isotime}} | 시간대 오프셋이 포함된 전체 타임스탬프. 두 이름은 같은 뜻입니다. |
{{weekday}} | Monday 같은 요일 이름. |
{{timezone}} | Europe/Warsaw 같은 시간대 이름. |
{{date.world_state}} | World State가 추적하는 현재 세계 내 날짜입니다. 원래 형식을 유지합니다. |
{{time.world_state}} | World State가 추적하는 현재 세계 내 시각입니다. 원래 형식을 유지합니다. |
{{weekday.world_state}} | 이름이 Weekday 또는 Day of Week인 사용자 지정 세계 필드, 추적 중인 날짜에 적힌 요일, 또는 유효한 YYYY-MM-DD 형식의 추적 날짜에서 구한 요일입니다. |
.world_state 매크로는 프롬프트와 에이전트 템플릿에서 동작합니다. 현재 이야기 턴에 표시된 세계의 날짜와 시각을 읽습니다. 스와이프를 바꾸면 어느 턴의 값을 사용할지도 바뀝니다. 재생성할 때는 대체 응답이 시작하는 이야기 상태를 사용합니다. 값이 없으면 빈 값이 되며, 오늘의 현실 세계 날짜나 시각으로 대체하지 않습니다. 가상의 달력은 고유한 날짜와 시각 텍스트를 그대로 유지합니다. 가상의 요일을 쓰려면 World State에 이름이 Weekday 또는 Day of Week인 사용자 지정 필드를 추가하세요.
예를 들어 {{#if weekday.world_state == "Monday"}}Use the weekday routine.{{/if}}는 현실의 요일 대신 추적 중인 요일을 읽습니다.
무작위 및 주사위 매크로
이 매크로들은 프롬프트에 우연 요소를 더합니다. 숫자와 선택지에는 무작위 매크로({{random}})를, 주사위에는 굴림 매크로({{roll}})를 쓰세요.
| 매크로 | 동작 |
{{random}} | 0에서 100까지의 무작위 정수. |
{{random:X:Y}} | X와 Y 사이의 무작위 정수. 양 끝값을 포함합니다. |
{{random::A::B::C}} | 선택지 하나를 무작위로 고른 뒤, 고른 선택지 안의 매크로만 치환합니다. |
{{random::A@2::B@0.5}} | 가중치를 준 무작위 선택. 아래 가중치 규칙을 참고하세요. |
{{roll:XdY}} | 주사위 굴림 합계. 예를 들어 {{roll:2d6}}은 6면체 주사위 2개를 굴려 더합니다. {{roll:d20}}은 주사위 1개를 굴리고, {{roll:1d8+3}}은 굴림에 3을 더합니다. |
그대로 복사해 쓸 수 있는 간단한 무작위 선택 예시입니다.
{{random::The door creaks open.::A bell rings.::Someone laughs nearby.}}가중치를 준 선택
선택지 끝에 @number를 붙이면 뽑힐 가능성을 정할 수 있습니다. 이 숫자는 상대적인 가중치이고, 클수록 잘 뽑힙니다.
{{random::Common event@1::Rare event@0.25}}이 예시에서는 가중치 합계가 1.25이므로 확률은 다음과 같습니다.
| 선택지 | 가중치 | 확률 |
| Common event | 1 | 80% |
| Rare event | 0.25 | 20% |
가중치 규칙입니다.
- 가중치를 적지 않으면 1로 봅니다.
- 0.5, 0.01처럼 소수 가중치도 쓸 수 있습니다.
- 가중치가 0이면 선택지는 남아 있지만 절대 뽑히지 않습니다.
- 모든 선택지의 가중치가 0이면 매크로는 빈 값으로 치환됩니다.
- 맨 끝의
@number만 가중치로 인식합니다. 이메일 주소처럼 다른 자리에 있는@는 그대로 둡니다.
동적 변수
변수를 쓰면 프롬프트의 한 부분에 값을 저장해 두고 뒷부분에서 읽을 수 있습니다.
| 매크로 | 동작 |
{{setvar::name::value}} | 값을 저장하고 텍스트에는 아무것도 남기지 않습니다. |
{{getvar::name}} | 저장한 값을 읽습니다(설정한 적이 없으면 빈 값). |
{{addvar::name::value}} | 두 값이 모두 숫자면 더하고, 아니면 새 텍스트를 뒤에 붙입니다. |
{{addnumvar::name::value}} | Marinara 확장 매크로입니다. 저장된 숫자 값에 항상 숫자를 더합니다. 없거나 올바르지 않은 숫자는 0으로 보고, 오버플로가 나는 덧셈은 무시합니다. |
{{incvar::name}} | 숫자 변수에 1을 더하고 새 값을 삽입합니다. |
{{decvar::name}} | 숫자 변수에서 1을 빼고 새 값을 삽입합니다. |
변수는 한 번의 프롬프트 생성 안에서 왼쪽부터 오른쪽으로 치환됩니다. 앞쪽에서 설정한 값, 예컨대 먼저 오는 로어북 항목에서 설정한 값은 같은 프롬프트의 뒤쪽에서 읽을 수 있습니다. Marinara는 SillyTavern의 로컬 변수 동작과 마찬가지로 변수를 현재 채팅에도 저장합니다. 이후 턴과 앱 재시작 뒤에도 값이 유지되며, 다른 채팅에는 각각 별도의 값이 있습니다.
기본 제공 매크로가 아닌 {{NAME}}은 이름으로 찾습니다. 먼저 프리셋 변수에서 찾고, 그다음 채팅 자체의 변수에서 찾습니다. 어느 쪽에도 그 이름이 없으면 태그는 입력한 그대로 텍스트에 남습니다. 양쪽에 같은 이름이 있으면 프리셋 변수가 우선합니다. 프리셋 쪽 설명은 프리셋 변수를 참고하세요.
채팅 변수
변수를 만들 때 반드시 {{setvar}}를 쓸 필요는 없습니다. Chat Settings(채팅 설정) 패널의 Chat Variables(채팅 변수) 섹션에서 이름과 값을 직접 입력한 뒤, 자신의 메시지를 포함해 매크로가 작동하는 곳에서 그 이름을 사용할 수 있습니다. char1에 Mary 값을 넣고 {{char1}} walks in.을 입력하면 AI는 "Mary walks in."으로 읽습니다.
채팅 변수 규칙은 다음과 같습니다.
- 이름에는 영문자, 숫자, 밑줄을 쓸 수 있으며 영문자나 밑줄로 시작해야 합니다. 정확히 21자인 이름은 캐릭터 참조용으로 예약되어 있습니다. 점이나 하이픈이 들어간 이름도
{{setvar}}와{{getvar}}로 설정하고 읽을 수 있지만, 단순한{{name}}형태로는 처리되지 않습니다. - 기본 제공 매크로 이름은 사용할 수 없습니다.
{{char}}는 항상 캐릭터를 뜻합니다. - 자신의 메시지에는 입력한 태그가 그대로 표시됩니다. 값은 프롬프트를 만들 때 채워지므로 나중에 값을 바꾸면 그 값을 사용한 이전 턴에도 반영됩니다.
- 채팅마다 하나의 저장소를 공유하므로
{{setvar}}로 설정한 변수도 이 섹션에 나옵니다.
패널 자체는 채팅 설정 개요를 참고하세요.
서식 매크로
다음 매크로들은 주변 텍스트의 모양을 다듬습니다.
| 매크로 | 동작 |
{{newline}} / {{\n}} | 줄바꿈을 넣습니다. |
{{trim}} | 자기 자신을 없애고 그 자리 앞뒤의 공백을 정리합니다. |
{{trimStart}} | 주변 텍스트 앞쪽의 공백을 정리합니다. |
{{trimEnd}} | 주변 텍스트 뒤쪽의 공백을 정리합니다. |
{{uppercase}}...{{/uppercase}} | 감싼 텍스트를 대문자로 바꿉니다. |
{{lowercase}}...{{/lowercase}} | 감싼 텍스트를 소문자로 바꿉니다. |
{{noop}} | 출력에서 사라집니다. 편집하는 동안 아무 영향 없는 자리 표시로 쓰기 좋습니다. |
{{// comment}} | 출력에서 사라지는 작성자용 메모. |
{{banned "text"}} | 출력에서 사라집니다. 무언가를 걸러 내거나 막지는 않습니다. |
중괄호 두 개를 그대로 보여 주기
매크로에는 이스케이프 문자가 없습니다. 중괄호 두 개를 텍스트에 그대로 남기고 싶다면 Marinara가 모르는 이름을 쓰세요. 알 수 없는 {{name}}은 같은 이름의 프리셋 변수와 채팅 변수가 모두 없는 한 입력한 그대로 남습니다. AI에 절대 전달되지 않는 개인 메모가 필요하다면 {{// like this}}를 쓰세요.
Macro reference와 /macros
매크로를 지원하는 입력란에는 모퉁이에 작은 버튼 2개가 있습니다.
- Expand editor(편집기 펼치기)는 그 입력란을 더 큰 편집 창으로 엽니다.
- Macro reference(매크로 참조)는 Macro reference라는 제목의 창을 엽니다. 기본 제공 매크로를 분류별로 정확한 구문과 함께 모두 보여 줍니다. 이 목록은 엔진이 쓰는 것과 같은 원본에서 생성되므로 항상 정확합니다.
이 입력란은 매크로 이름도 자동으로 완성해 줍니다. 줄 끝에 {{ch를 입력하면 나머지 부분(ar}})이 흐린 글자로 나타납니다. Tab을 누르거나 흐린 글자를 탭하면 받아들입니다. 무시하려면 계속 입력하세요. {{getvar::처럼 값을 받는 매크로는 값을 입력하는 위치에서 멈춥니다.
채팅 입력란에 /macros를 입력할 수도 있습니다(짧은 형태인 /macro도 동작합니다). 전체 매크로 목록을 채팅에 바로 출력해 간단히 확인할 수 있습니다.
매크로를 사용한 조건
조건부 블록({{#if ...}})에서는 ||(OR), &&(AND), 괄호로 비교식을 조합할 수 있습니다. 같음 비교를 나열할 때는 {{#if character == "Maukie" || "Pantalone"}} 같은 축약 형태도 쓸 수 있습니다. 연산 우선순위, 그룹 채팅 예시, 전체 연산자 목록은 조건부 프롬프트를 참고하세요.
조건은 Decision 모델에 장면을 물을 수도 있습니다. 예를 들어 예/아니요에는 {{#if decision:"The latest message moves the scene to a new place"}}, 옵션 하나를 고를 때는 {{#if decision_choice:"The kind of scene in the latest message" == "combat"}}를 사용합니다. Decision 모델이 없거나 답이 없으면 아니요로 읽습니다. Decision 모델에 묻기를 참고하세요. 문장 뒤에 추가할 수 있는 옵션은 다음과 같습니다.
sticky:3 cooldown:5는 예를 3턴 동안 유지한 뒤 5턴 동안 쉽니다. Sticky와 Cooldown을 참고하세요.until:"..."이나while:"..."은 두 번째 문장이 허용하는 동안 예를 유지합니다. Until과 While을 참고하세요.every:3은 3턴마다 한 번만 문장을 묻습니다. 몇 턴마다 확인하기를 참고하세요.priority:high나priority:low는 프롬프트 계획에 들어갈 문장을 고릅니다. 우선순위와 제한과 비용을 참고하세요.
자주 하는 실수
{{random::...}}블록 안에 변수를 쓰지 마세요. 무작위 선택지 안의{{setvar}}는 선택이 이루어지기 전에 모든 선택지에서 실행됩니다. 뽑힌 선택지에서만 실행되는 것이 아닙니다.- 로컬 변수를 전역 상태처럼 쓰지 마세요. 로컬 변수는 설정한 채팅 안에서만 유지됩니다.
{{setvar}}를 실행하는 프롬프트 섹션이나 로어북 항목은 같은 이름의 채팅 변수를 덮어씁니다. 채팅마다 하나의 저장소를 사용하기 때문입니다. 둘 다 유지하려면 서로 다른 이름을 사용하세요.{{prompt}}는 매크로가 아닙니다. 메시지 전체가{{prompt}}이면 Marinara는 메시지를 보내는 대신 Peek Prompt(프롬프트 미리보기) 뷰어를 엽니다. Peek Prompt를 참고하세요.- Custom Tools는
{{macro}}텍스트를 쓰지 않습니다. 도구 입력란에{{roll:1d20}}을 붙여넣고 치환되기를 기대하지 마세요. - Impersonate(유저 사칭) 프롬프트 템플릿은 전체 매크로 목록이 아니라 몇 가지 자리 표시만 받습니다. 이름 체계도 달라서 카드에서 되던 매크로가 거기서는 안 될 수 있습니다.
- 매크로 출력이 크거나 깊게 중첩되면 조용히 잘립니다. 오류도 표시되지 않으니 매크로가 펼쳐지는 양을 적당히 유지하세요.
관련 가이드
- 조건부 프롬프트
- 프리셋 변수
- Preset Editor와 프롬프트 관리
- Peek Prompt
- 캐릭터 만들기와 편집
- Conversation Mode 프로필(Display Name, About Me, Behavior)