RisuAI · Lorebook
기본 키 매칭은 공백을 지우고 부분 문자열로 비교한다. 그래서 엉뚱한 단어에 로어북이 켜진다. 정규식 키로 바꾸면 단어 경계까지 딱 맞춰 잡을 수 있다.
한 줄 요약 — 이 형식만 기억하면 됨
/(?!)|한글키워드|한자키워드|\b영어숫자키워드\b/i
원문 gomigomi3 (아카라이브)재구성·변환기 이 문서 하단 도구
RisuAI 기본 로어북 매칭은 대소문자·공백을 모두 없앤 뒤 부분 문자열 포함(.includes) 여부로만 판단한다. 단어 경계 개념이 아예 없다.
활성화 키 yuzu 하나를 걸었다고 하자. 의도는 "yuzu가 나오면 켜라"이다. 그런데 이런 입력에도 켜진다.
Lemon is drinking yuzutea. — 유자차 이야기인데 yuzu가 부분 문자열로 걸려 켜짐.
managing, abandon — 흔한 이름 nagi, ando가 일반 단어 속에 박혀 걸림.
공백까지 지우므로 yuzu of goa 키가 yuzuofgoa에도 매칭됨.
키 DBA → 소문자·공백 제거 후 dba. 채팅엔 "DBA"가 한 번도 없었는데 켜졌다.
범인은 contracted back. 공백이 사라지면서 ...dba...가 두 단어에 걸쳐 생겼다. and back, old bag 같은 조합도 같은 방식으로 걸린다.
토큰 적은 로어북이면 넘어갈 수 있지만, 무거운 로어북이 오탐으로 켜지면 인풋 토큰이 낭비되고 AI가 내러티브와 상관없는 캐릭터를 억지로 끌어오기도 한다.
로어북 항목 설정에서 정규식 사용을 체크하면, 활성화 키를 /regex/flags 형식으로 쓸 수 있다.
키워드를 파이프(|)로 이어 붙이고, 전체를 /.../i로 감싼다. (설정의 "단어 단위 매칭"은 하이픈·따옴표·마침표까지 다 막아버려서 실전에선 잘 안 씀 — 정규식이 정답.)
/(?!)|유즈|그즈|\byuzu\b/i
정규식 키의 시작 /가 첫 키워드에 딸려 들어가는 버그가 있다. /유즈|yuzu/i로 쓰면 실제로는 /유즈(슬래시 포함)를 찾게 된다.
해결: 맨 앞에 (?!)(빈 부정 룩어헤드)를 첫 대안으로 둔다. 빈 문자열은 어디에나 있으므로 (?!)는 절대 매칭되지 않아 안전한 자리채움이 된다. → /(?!)|유즈|yuzu/i
일반 모드는 대소문자를 자동 무시하지만, 정규식 모드는 i 플래그가 없으면 구분한다.
/yuzu/ — 오직 yuzu만. Yuzu는 안 됨/yuzu/i — yuzu Yuzu YUZU yUzU 전부CJK(한·일·중)로만 키를 쓸 게 아니라면 i는 사실상 필수.
\b는 단어 문자(알파벳·숫자·_)와 비단어 문자(공백·따옴표·마침표·문자열 끝 등) 사이의 경계다. 이걸로 앞의 yuzutea 오탐을 막는다.
키 /\byuzu\b/i 기준:
Yuzu smiled. 양쪽이 경계said to yuzu. 온점·공백은 비단어 문자"Yuzu-chan!" 하이픈·따옴표도 경계yuzutea / goayuzu / yuzu4 옆에 단어 문자가 붙어 경계 없음yuzu_chan _는 단어 문자라 경계 성립 안 함한글·한자·가나는 단어 문자가 아니라 \b를 붙여도 안 붙인 것과 같다. 조사가 붙어 나오는 특성상 [가-힣] 범위 지정도 배보다 배꼽이 큼. 그래서 CJK 키워드는 그냥 두고, 영어·숫자 키워드에만 \b를 감싼다.
일반 키는 쉼표로 나눴지만 정규식에선 OR인 |로 합친다. 쉼표를 쓰면 조각마다 /.../i에 \b까지 일일이 감싸야 해서 손만 아프다.
// 비권장 (쉼표 구분)
/(?!)|유즈/i, /그즈/i, /\byuzu\b/i
// 권장 (OR로 합침)
/(?!)|유즈|그즈|\byuzu\b/i
네 로어북에서 그대로 가져온 케이스. CJK는 그대로, 영어·숫자만 \b로 감싸는 게 규칙이다.
// 기존
office, 회사, 사무실, 출근, 조직, CEO
// 정규식
/(?!)|\boffice\b|회사|사무실|출근|조직|\bCEO\b/i
// 기존 — DBA가 contracted back 등에 오탐
DBA, database, rival, 라이벌
// 정규식 — \bDBA\b 로 경계 오탐 차단
/(?!)|\bDBA\b|\bdatabase\b|\brival\b|라이벌/i
이제 DBA는 독립 단어일 때만 잡히고 contractedback 같은 붙은 문자열은 무시된다.
룩어헤드로 "둘 다 있을 때만" / "이건 없을 때만" 같은 조건도 건다.
| 목적 | 패턴 |
|---|---|
| 유즈 그리고 고아 둘 다 | /(?!)|(?=.*유즈)(?=.*고아)/s |
| yuzu 있고 뒤에 goa 없을 때 | /(?!)|\byuzu\b(?!.*goa)/si |
| Dr.Jongwon 여러 표기 | /(?!)|\bdr\.?\s?jongwon/i |
필요할 때만 펼쳐 보는 서랍. 로어북 키에 쓸 만한 것만 추렸다.
| 기호 | 의미 | 예시 |
|---|---|---|
* | 0회 이상 | 아* → "", 아, 아아… |
+ | 1회 이상 | 아+ → 아, 아아… |
? | 0 또는 1회 | colou?r → color, colour |
{n} | 정확히 n회 | \d{3} → 103, 207 |
{n,m} | n~m회 | \d{2,4} → 42, 2077 |
/(?!)|\d{3}호실/ → "103호실"은 잡고 "42호실"(2자리)은 안 잡음.
[Rr]oom\s?[A-C] Room A, roomB, Room C (Room D ✕)[Ss]ector[^0] Sector1·SectorA (Sector0만 제외)| 기호 | 의미 |
|---|---|
. | 줄바꿈 제외 아무 문자 1개 |
\d | 숫자 [0-9] |
\w | 단어 문자 [A-Za-z0-9_] |
\s | 공백·탭·줄바꿈 |
\D \W \S | 위 셋의 부정형 |
| 기호 | 의미 |
|---|---|
(?=…) | 뒤에 …이 있으면 (긍정 룩어헤드) |
(?!…) | 뒤에 …이 없으면 (부정 룩어헤드) |
(?<=…) | 앞에 …이 있으면 (긍정 룩비하인드) |
(?<!…) | 앞에 …이 없으면 (부정 룩비하인드) |
비캡처 그룹 (?:…)은 여러 대안을 묶을 때. /(?!)|(?:제1|제2|제3)의 폭탄/
| 플래그 | 역할 |
|---|---|
i | 대소문자 무시 — 영어 매칭이면 거의 필수 |
s | .이 줄바꿈도 매칭 — 여러 줄 조건(룩어헤드)에 |
m | ^ $가 줄 단위로 동작 |
u | 유니코드 모드 — 이모지 등 정확히 |
g | 쓰지 말 것. 활성화는 한 번이면 되므로 불필요 |
05 / 자동 변환기
쉼표로 구분된 기존 활성화 키를 붙여넣으면, 규칙대로 정규식 키를 만들어 준다. CJK는 그대로, 영어·숫자는 \b로 감싼다.
CJK+영어가 섞인 키워드는 \b가 불안정해서 그대로 둔다. 정규식 특수문자(. ( ) * + ? 등)는 자동으로 이스케이프해 문자 그대로 매칭한다.
RisuAI에서 내보낸 로어북 JSON을 올리면 항목마다 정규식 활성화 키를 자동으로 만들어 준다. 하나씩 복사만 하면 끝.