Skip to content

파라미터와 정규식

이미지를 파라미터로 관리하고 정규식을 사용해 출력해봅시다.

개요

만약 수백 장의 이미지를 일일이 이미지 매크로로 관리하면 어떻게 될까요?
분명히 어디선가 오타 등의 이유로 실수가 생기고, 그 실수를 찾는 과정은 답이 없어질 것입니다.

본 페이지에서는 정규식과 파라미터를 활용해 효율적으로 관리하는 방법을 알아봅니다.

외부 이미지

아쉽게도 외부 이미지 기능까지 무료로 지원하는 것은 다소 어려운 환경입니다.

코멧에서는 Cloudflare R2 Storage를 이미지 호스팅 사이트로 추천하고 있습니다.
관리가 필요한 경우 해당 서비스를 이용하고, 그렇지 않은 경우 코멧의 이미지 매크로를 이용해주세요.

본 페이지는 여러 방법을 통해 개별 이미지 서버가 구축된 상태 이후를 다룹니다.
R2 Storage 사용법 바로가기

파라미터

시스템, 함수, 모델 등의 특정 속성이나 동작 방식을 결정하는 변수나 값을 파라미터라고 합니다.
우리말로는 매개변수라고 하며, 파라미터에 들어가는 값이 바뀌면 그 결과도 바뀝니다.

먼저 기본적인 마크다운 이미지 방식은 아래와 같습니다.

markdown
![](이미지 링크)

이때 이미지가 출력되는 원리를 파라미터로 이해해 본다면, 아래와 같이 구성될 것입니다.

단순히 이와 같이 구성된다면, 이미지가 하나 늘어날 때마다 URL에 대한 정보를 추가해 주어야 합니다.
이럴 경우 이미지가 수백 장이 된다면, 마찬가지로 수백 장에 대한 정보가 모두 필요하게 됩니다.

그래서 URL을 파라미터화하는 과정이 필요합니다.
일반적으로 아래와 같이 이미지 서버를 설계하게 됩니다.

markdown
캐릭터 1
├─1.webp
├─2.webp
└─3.webp

캐릭터 2
├─1.webp
├─2.webp
└─3.webp

...

이럴 경우, 링크는 주로 아래와 같이 구성됩니다.

markdown
https://도메인 주소/시뮬레이션 폴더명/캐릭터명/이미지 번호.webp

이때 캐릭터명과 이미지 번호를 독립적으로 관리한다고 생각한다면,
전체 이미지 URL을 두 개의 파라미터로 관리할 수 있습니다.

그림으로 나타낸다면 아래와 같이 구성됩니다.

캐릭터명 리스트는 앞서 서술했듯 프롬프트 내에 존재할 것이기 때문에,
우리는 이미지 번호에 대한 설명만 프롬프트에 서술해 주면 됩니다.

💡 이미지를 번호로 저장하는 이유?

만약 파일명을 angry.webp, sad.webp와 같이 저장하면 어떻게 될까요?
이 경우, 다양한 감정에 대한 설명이 존재하므로 없는 감정도 존재할 것이다라는 환각이 발생합니다.

예를 들면, 분명히 angry, sad, happy만 등록했는데,
시간이 지나면 어느 순간 자연스럽게 curious, gloomy를 사용하는 현상이 일어납니다.

이를 할루시네이션 (Hallucination) 이라고 하며, 이는 AI의 고질적인 문제입니다.
이러한 현상을 사전에 방지하기 위한 가장 효과적인 방법으로 1, 2, 3과 같이 숫자로 매기는 방법이 있습니다.

숫자를 사용할 때에도 주의해야 할 점은, 반드시 연속된 자연수만을 사용해야 한다는 점입니다.
예를 들어, 1, 2, 4를 저장해 놓았다면 자연스럽게 3을 사용해버릴 가능성이 생깁니다.

정규식

정규식을 간단히 설명하자면, 훨씬 강력한 단어 찾기 도구라고 이해하시면 됩니다.

일반적인 찾기 도구는 특정 단어 하나만을 찾습니다.
그러나 정규식은 조건에 맞는 모든 단어를 찾아낼 수 있는 강력한 도구입니다.

우리는 이미지를 평소에 쓰던 것처럼 {{img::캐릭터명/번호}} 꼴로 쓰고 싶습니다.
그러나 이는 정의되지 않은 문법이므로, 마크다운 이미지 문법에 맞추어 바꾸는 작업이 필요합니다.

일반적인 키워드 대체의 경우 가능한 모든 캐릭터명과 번호 조합에 대해 일일이 저장해야 합니다.
코멧에서는 이러한 단순 반복 작업을 줄일 수 있도록 정규식을 공식적으로 지원하고 있습니다.


매크로 편집 창에서 정규식 치환을 사용하면 정규식을 사용할 수 있습니다.

정규식 설계

파라미터를 뽑아내는 가장 대표적인 키워드는 (.*?)입니다.
원하는 자리에 이 기호를 넣으면, 그 자리에 어떤 키워드가 오든 그 데이터를 뽑아서 사용할 수 있습니다.

선택: 기호의 의미

먼저 가장 크게 소괄호로 한번 묶습니다. 이는 소괄호 내의 데이터를 뽑아서 쓰겠다는 의미입니다.
(용어로는 "캡처"라고 합니다.)

다음으로 .어떤 글자가 오든 상관없다라는 의미입니다.
(완전 엄밀히는 아니지만, 편의상 그렇다고 하겠습니다.)

그리고 * 기호는 바로 앞의 기호가 0개 이상 오는 모든 패턴을 감지하겠다는 뜻입니다.
(유사 기호로는 +가 있습니다. 이는 *과는 달리 1개는 와야 합니다.)

마지막으로 ? 기호는 최대한 빨리 끝내겠다는 뜻입니다.
이게 없으면 중간에 /이 와도 .에 해당하므로 끊지 않고 그냥 넘어가버리는 경우가 생깁니다.

우리는 캐릭터명과 번호를 뽑아쓰고 싶으니, 아래와 같이 설계하면 될 것 같습니다.

markdown
{{img::(.*?)/(.*?)}}

그러나 이는 동작하지 않습니다. { 기호가 정규식 자체에서 특수 기호로 쓰이기 때문입니다.
특수 기호로 쓰이는 문자를 글자로 사용하고 싶다면, 앞에 \를 붙여주어야 합니다.
(키보드에는 원화 기호일 수도 있습니다.)

이렇게 완성된 정규식은 아래와 같습니다.

markdown
\{\{img::(.*?)/(.*?)\}\}

다음으로 대체식입니다. 대체식은 파라미터를 쓰는 법만 알면 됩니다.
첫 번째 파라미터는 $1, 두 번째 파라미터는 $2와 같이 사용합니다. 이게 끝입니다.

예시로, 이미지 링크를 아래와 같이 구성해 보았습니다.

markdown
https://raw.githubusercontent.com/stalights/img/refs/heads/main/reminiscence/캐릭터명/번호.webp

(예전에는 github를 사용한 이미지 호스팅 방법도 있었습니다.)

캐릭터명과 번호의 실제 값을 넣기 위해 파라미터를 사용해야 합니다.
아래와 같이 설정하면 작동합니다.

markdown
https://raw.githubusercontent.com/stalights/img/refs/heads/main/reminiscence/$1/$2.webp


위와 링크 변환이 원활히 작동하는 것을 확인하실 수 있습니다.

마지막으로, 실제 이미지로 출력해야 하므로 마크다운 문법을 사용해 줍시다.

markdown
![](https://raw.githubusercontent.com/stalights/img/refs/heads/main/reminiscence/$1/$2.webp)


위와 같이 이미지가 원활히 출력되는 것을 확인하실 수 있습니다.

출력 형식 프롬프트는 해당 페이지의 내용을 참고하세요.

💡 정규식을 사용하는 이유

만약 정규식이 없다면, AI에게 매번 원본 링크를 출력하도록 해야 합니다.

문제는 이 원본 도메인이 지나치게 길어 토큰 효율이 낭비되는 경우가 흔합니다.
도메인을 단축하려면 새 도메인을 사야 하는데, 이 또한 비용 발생이 나타나는 원인이기도 하고요.

플랫폼에서 간단한 기능을 제공할 경우 충분히 해결할 수 있는 사항이기에 제공되고 있습니다.
또한, 기존 마크다운 문법과 구분되며 img라는 이미지 표시 기호까지 있어 매우 AI 친화적인 방식입니다.