https://arca.live/b/aiart/60392904

어제 프롬프트 내용이 서로 다른 캐릭터 여러명 뽑기 라는 글을 썼었다

윗 글은 순전히 내 경험을 토대로 작성한 공략글이고, 의문이 생겨서 어제부터 SD-WebUI의 프롬프트 Parser를 적당히 들여다봤음


간단한 결론을 말하자면, 저 윗글에서도 말한 것처럼 태그를 <>로 묶는 행위가 AI에게 어떤 특정한 명령을 하달하는 건 아니다. 파서에는 저걸 처리하는 기능이 없음

실제 파서가 처리하는 문법들을 간단히 우선 정리해 보자.

간단한 문법이라고 했지만, 프롬프트를 만드는 과정은 돌을 깎는 것과 별 다를 게 없다. 특정한 결과물을 원할 경우에는 더더욱.

AI를 살살 구슬려 내가 원하는 걸 뽑아낼 수 있는 방법을, 지금부터 알아보자.


가중치를 주는 방법은 거의 대부분 알고 있을 거임

(), [] 가 사용되는데

glasses 라는 프롬프트를 예로 들자면


(glasses) - 해당 프롬프트의 가중치를 1.1배 증가시킴

[glasses] - 해당 프롬프트의 가중치를 1.1배 감소시킴

((glasses)) - 해당 프롬프트의 가중치를 1.1 * 1.1 = 1.21배 증가시킴

(glasses:1.4) - 해당 프롬프트의 가중치를 1.4배 증가시킴


이라고 정리할 수 있다.

가중치는 말 그대로 AI에게 해당 프롬프트에 조금 더 무게를 둬라~ 라고 시키는 요소라고 생각하면 편하다.

간단한 사용예를 들어보자.


masterpiece, best quality, 1girl, blue hair, black eyes, red dress, green gloves

Negative prompt: lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name

Steps: 60, Sampler: Euler a, CFG scale: 11, Seed: 1907929040, Size: 512x768, Model hash: 925997e9, Clip skip: 2, ENSD: 31337


해당 셋업으로 짤을 하나 뽑아보자.


?

파란 머리카락(O)

검은 눈동자(▲) - 검은색인지 남색인지 잘 모르겠다

빨간 드레스(O)

초록색 장갑(X)


WebUI를 많이 써봤으면 느꼈을 테지만, AI는 색깔 관련 프롬프트들이 많이 겹칠수록, 한쪽의 색깔이 다른 쪽에 "옮는" 현상이 자주 발생한다.

위 경우에도 머리카락의 파란색이 장갑의 초록색을 누르고 발현된 모습.

원하는 대로의 결과물을 뽑기 위해 프롬프트에 가중치를 적용해 보자.


막간의 팁을 주자면, 귀찮게 타이핑하지 말고 저렇게 프롬프트를 선택한 상태에서 Ctrl + 키보드 방향키 위/아래를 누르면, 각각 가중치가 0.1씩 증가/감소한다. 편하게 단축키 쓰자.


masterpiece, best quality, 1girl, blue hair, (black eyes:1.1), red dress, (green gloves:1.4)

애매했던 눈 색깔과, 확실히 잘못 나왔던 장갑 색에 가중치를 각각 적용했다.


말을 아주 잘 듣는 모습.

이렇듯 가중치는 프롬프트에 적어넣었는데, 이상하게 그림에 발현하지 않는 경우에 사용하면 좋다.


팁 한접시)가중치를 과하게 주면, 아웃풋 그림 자체가 깨져서 제대로 안나온다. 1.5를 초과해서 주는 건 자제할 것.


그런데 왜 하필 "파란색" 이 "초록색" 을 덮어버린 걸까?

많이 뽑아본 사람들은 느꼈겠지만, 프롬프트들은 앞에 위치할수록 더 잘 반영되는 경향이 있다.

이는 오리지널 SD의 프롬프트 구문이 자연어 형태로 제공되기 때문인데, 위에서 사용한 프롬프트를 해당 형식으로 바꿔본다면

a girl with blue hair and black eyes, wearing a red dress and green gloves 라고 할 수 있다.

WebUI에는 이런 방식으로도 프롬프트를 넣을 수 있다. 태그로 묘사하기가 정말 어렵다 싶을 때는, 상황묘사를 저렇게 문장형으로 시도해 보는것도 좋은 어프로치다.

masterpiece, best quality, a girl with blue hair and black eyes, wearing a red dress and green gloves

문제없이 묘사 잘 된다. 그런데 역시 아까처럼 맨 뒤의 장갑색은 다른 색깔 프롬프트에게 먹혔다.

masterpiece, best quality, a girl with blue hair and black eyes, wearing a red dress, (green gloves:1.3)

가중치를 수정해서 문제없이 원하는 결과물을 뽑아냈다!

이렇듯, 색깔 관련된 프롬프트들을 많이 넣으면 많이 넣을수록, 서로가 서로를 망가뜨릴 확률이 꽤나 높아진다.

자연어 형식으로 서술하던 태그를 나열하건, 경험에서 나온 팁을 주자면

색깔과 전혀 상관없는 프롬프트들을 색깔 프롬프트 사이에 쿠션처럼 넣어주면 망가질 확률이 체감상 좀 낮아진다.

masterpiece, best quality, 1girl, blue hair, standing, black eyes, smiling, red dress, long hair, green gloves 같은 느낌으로.

물론 이렇게 쿠션을 채워넣어도 문제가 해결되지 않을 수 있다. 근본적으로는 색깔 관련 프롬프트의 수를 최대한 줄이는 것이 정신건강에 이롭지만, 내 머릿속의 환상의 그림을 뽑아내기 위해서 색깔을 포기할 순 없는 노릇. 가중치와 쿠션을 적절히 섞어가며 조절해보자.

위에서 말한 것처럼, 프롬프트를 만들어 나가는 과정은 돌을 깎는 과정과 별 다를 바 없다. 자기 나름 변주를 줘 가며 최적의 방법을 찾아보자.


문법과는 별개로, Negative Prompt를 사용하는 것도 매우 효과적이다.

SD는 주어진 프롬프트를 해석해서 그림을 뽑아내지만, 그 해석하는 과정이 매우 독특하다.

위에서 본 것처럼 프롬프트들끼리 색깔이 겹치기도 하며, 슬링샷 비키니를 입히라고 했더니 비키니를 입은 여자에게 슬링샷 새총을 들려주기도 한다.

AI가 슬링샷 비키니라는 프롬프트가 진짜 슬링샷 비키니인지, 비키니를 입은 여자가 슬링샷을 들고 있다는 뜻인지 어떻게 알겠나?

이렇게 창의적인 AI 덕분에, 내가 특정한 프롬프트를 넣었는데, 원하지 않는 결과물이 튀어나올 때가 종종 있다.

그럴 때 사용하는 것이 바로 Negative Prompt다.

일반 Prompt에 주어진 프롬프트들을 AI는 정말 다양한 방식으로 해석한다. 단어별로 끊어서 가능한 거의 계통도를 그리는 느낌으로.

하지만 그런 무궁무진한 해석의 계통도를 그릴 때에도, AI가 절대 참조하지 않는 것이 있다. 바로 주어진 Negative prompt.



masterpiece, best quality, 1girl, red hair, city

Negative prompt: lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name

Steps: 60, Sampler: Euler a, CFG scale: 11, Seed: 1762804147, Size: 512x768, Model hash: 925997e9, Clip skip: 2, ENSD: 31337


빨간머리 여자아이와 도시.

근데 왜 비키니를 입고있냐?????

간단하다. 니가 AI에게 "얘한테 비키니를 입히지 마라" 라고 시킨 적 없기 때문이다.

AI는 매우 직관적으로 작동한다. 시킨 일을 한다. 반대로 말하면, 시키지 않은 일을 할 수도 있고, 하지 않을 수도 있다.

나는 평범한 옷을 입은 여자애가 보고싶었지, 속옷을 입은 여자애가 보고 싶던 건 아니다.

Negative Prompt에 underwear, bikini 2개를 추가하고 동일한 시드로 다시 뽑아보자. 


시키는 건 잘한다.

속옷 입히지 말랬더니 맘대로 다른 옷을 입혀놓은 모습.

이처럼 AI에게 "절대로 하지 말 것" 을 명시해 줄 수 있는 Negative prompt는 제대로 사용하면 정말 강력한 도구가 될 수 있다.

간단한 예를 들어 설명했을 뿐이니, 직접 실험해보면서 사용법을 익히는 걸 추천. 위에서 이야기했던 색깔 이슈때도 좋은 해결책이 될 수 있다.


파서가 처리하는 문법적 기호는 (), [] 외에도 종류가 두가지 남아있다.

그중 첫번째는 [시작:끝:언제] 라는 문법.

얘는 생각보다 복잡한 녀석이다. []가 사용되었지만, 가중치와는 전혀 상관이 없다.

시작, 끝에는 임의의 프롬프트가 들어간다. "언제" 에는 0~1 사이의 숫자가 들어간다. 

간단한 예를 들어보자.

masterpiece, best quality, 1girl, [mountains:lake:0.25] 라는 프롬프트를 샘플링 스텝 60으로 뽑아내었다.

이렇게 되면 0부터 14스텝(60의 0.25, 즉 1/4)까지는 AI가 masterpiece, best quality, 1girl, mountains 라는 프롬프트로 그림을 그려낸다.

나머지 15~60스텝까지는 masterpiece, best quality, 1girl, lake 라는 프롬프트로 그림을 그려내는 것.

결과물은 다음과 같다.


소녀와, 산과, 강이 모두 나왔다.

동일 시드와 스텝수에, 프롬프트를 masterpiece, best quality, 1girl, [mountains:lake:0.75] 로 수정해서 뽑아보자.


아까와 배경이 달라졌다!

[mountains:lake:0.25]는 산과 강의 비율이 1:3,

[mountains:lake:0.75]는 산과 강의 비율이 3:1로 적용된 모습을 볼 수 있다.

잘만 쓰면, 정말 다양한 결과물을 뽑아낼 수 있는 문법이다. 역시 가지고 놀아보면서 사용방법을 익히는 것을 추천.


마지막 문법은 | 다.

얘는 기능 자체는 특정 스크립트를 활성화시켜야 작동한다.

Prompt matrix.

이 스크립트가 미적용된 상태여도, 파서 자체는 | 에 반응할 가능성이 높기 때문에, 사용법을 모르는 상황에서는 | 를 사용하지 않는 것이 좋다. 며칠동안 여기서 이거 넣었다가 태그 섞여서 나왔다고 절규하는 애들 몇명 봤다.


Prompt matrix는 예를 먼저 들어보겠다.

a girl standing|on the boat|on the lake

프롬프트 A| 프롬프트 B| 프롬프트 C 의 형식으로 구성되어 있다.

저렇게 입력 시, 4개의 이미지가 생성된다.

각각의 프롬프트들은 다음과 같다.


a girl standing

a girl standing on the boat

a girl standing on the lake

a girl standing on the boat on the lake


대충 감이 오는가?

| 를 사용 시, 제일 앞에 있는 프롬프트는 고정된 상태에서, 뒤에 있는 프롬프트들의 가능한 모든 조합으로 이미지들을 뽑아서 보여준다.

프롬프트 A | 프롬프트 B | 프롬프트 C | 프롬프트 D ... 같은 식으로 쭉 이어나갈 수 있다. 당연하지만 프롬프트가 많아질수록 경우의 수가 많아지기 때문에, 뽑아내는 이미지의 양도 많아진다.

위 프롬프트를 돌려서 나온 결과는 다음과 같다.


각각의 프롬프트가 어떻게 적용되었는지 쉽게 알 수 있다. 

| 를 프롬프트에 사용한 사람들이 태그가 섞였다~ 라고 말한 이유는 여기에 있다. 원래 그런 문법이기 때문.

플러그인을 미적용한 상태에서 | 를 사용 시, 어떤 결과물이 나올지 장담할 수 없다. 파서가 저 기호를 무시해도 프롬프트 자체에 노이즈가 섞여 들어가기 때문.



아무튼 SD-WebUI에서 적용되는 프롬프트 문법들을 대충 정리해 봤다.

여기서 의문을 가지는 사람들이 분명히 있을 것이다.


????? 아니 님이 https://arca.live/b/aiart/60392904 에서 프롬프트:<...> 라고 쓰래매요 그거는 없음?

없다.


파서는 해당 형식으로 프롬프트가 제공되어도 우리가 원하는 방식으로 그걸 해석하지 않는다. 그 때문에 위 글에서도 실제로 원하는 결과물을 뽑아내기 위해 몇번의 과정을 걸치기도 하고.

현재 SD-WebUI에서 "확정적으로" 여러 대상에게 원하는 프롬프트를 딱딱 적용시키는 방법은 현재로써는 없다. 저 글에서 사용하는 프롬프트:<...> 도 민간신앙에 가깝다. 사람이 보기 편하게 태그를 정리한 수준인 셈.


엄밀히 말하면 "AND"라는 설명하지 않은 문법이 하나 있긴 하다. 하지만 얘는 샘플러 중 LMS에서만 작동이 그나마 원하는 대로 된다. 그러나 LMS는 NAI 모델과 궁합이 정말, 정말 좋지 않다.

당장은 없는 문법이라고 생각해도 문제없을 상황.


마치기 전에 자잘한 팁을 몇가지 더 주자면,

NAI에서 캐릭터나 작품 등등에 관한 태그를 입력할 때의 형식은 보통 다음과 같다.

ganyu(genshin impact)

우리는 위에서 SD-WebUI가 가중치를 줄 때 ()를 사용한다는 것을 배웠다. 하지만 NAI에서의 가중치는 ()가 아니다.

그럼 NAI에서 사용한 프롬프트와 WebUI에서 사용하는 프롬프트를 완전히 같게 만드려면?

\ 를 사용하면 된다. ( 좌상단에서 우하단으로 뻗는 백슬래시 기호)


ganyu\(genshin impact\)


이렇게 프롬프트를 입력하면, 가중치를 주지 않고 순전히 괄호 그 자체로 사용할 수 있게 된다. 저 백슬래시를 괄호 앞에 붙이면 그냥 괄호로 인식이 되는 셈.

참고로 NAI에서는 가중치를 {}와 []로 사용한다. 위에서 설명한 ()가 포함된 태그를 편하게 사용하기 위해 기호를 바꾼 것으로 추정중.

NAI의 {glasses} 는 SD-WebUI의 (glasses:1.05) 와 동일하다. SD-WebUI의 괄호 1개는 1.1배지만, WebUI의 {} 1개는 1.05배이기 때문에, 프롬프트를 한쪽에서 다른쪽으로 옮길 때에는 이 수치에 주의해야 한다. 단순히 ()를 {}로만 바꾸면 적용되는 가중치의 수치가 달라지기 때문.


마지막으로, 태그를 입력할 때 그냥 스페이스바를 눌러서 띄우는 것과, 언더바(_)를 사용해서 띄우는 것에도 결과물이 미묘하게 달라지는 효과가 있다.



두 이미지 모두

Negative prompt: lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name

Steps: 60, Sampler: Euler a, CFG scale: 11, Seed: 1102953348, Size: 512x768, Model hash: 925997e9, Clip skip: 2, ENSD: 31337

를 사용했고,

위 이미지는 masterpiece, best quality, 1girl, blue hair

밑 이미지는 masterpiece, best quality, 1girl, blue_hair를 사용했다.

정말 미세하게 결과가 바뀐 것을 볼 수 있다.

아까 말한 것처럼 기호 때문에 노이즈가 섞여 들어간 결과이다.


스페이스바와 언더바(_)도 서로 바꿔 보고,

괄호 앞에 \ 도 붙여보고,

태그를 나열해보기도 하고, 자연어 문장으로 그림을 묘사해서 프롬프트를 넣어보기도 하고


위에서 설명한 기능들을 결국에는 직접 한번씩 해보면서, 본인이 익힌 뒤에 자신이 마음에 드는 방식을 찾는 것이 제일 중요하다.

무조건 언더바를 써라~ 자연어로 묘사하지 마라~ 같은 국룰 세팅은 없다.

취향은 무궁무진하니까, 각자의 취향에 맞는 방식을 직접 찾아보는 것은 어떨까?


221011 11:22 작성 시작

221012 00:52 작성 종료


궁금한 내용이나 오타, 피드백 등등이 있으면 댓글로 남기길 바람

잘 읽었으면 개추나 한번씩 주고 가고


문법을 마스터했으면 그 다음으로 읽는걸 추천하는 가이드  - https://arca.live/b/aiart/60606603