更新於 2023/05/18閱讀時間約 8 分鐘

Stable Diffusion進階 -- 提示詞矩陣

今天來介紹Script中,用來判別提示詞性質,甚至是除錯的好用工具--提示詞矩陣(Prompt matrix)。

前言

身為一個軟體工程師,業界有一句很好玩的俚語:
最可怕的不是搞不懂為何寫出來的程式不能動,而是搞不懂為何寫出來的程式能動。
很多時候,從網路上抓的一大串提示詞在某些模型表現良好,但是換了個模型就走樣。有時一些提示詞看似無用,移除了之後畫面的感覺又變得怪怪的,不清楚到底是哪裡被影響了。有時整個圖爛掉或功能壞掉,但是不管怎麼調提示詞,圖依然是壞掉的。這時候就可以請出Prompt matrix來追根究底。

功能

Prompt matrix用起來的感覺跟之前介紹的X/Y/Z plot很類似,都是能跑出一整組的圖,但是設定畫面差很多:
Prompt matrix設定畫面
Prompt matrix設定畫面
在設定畫面中,我們可以指定是要以正面或者負面提示詞為主來構築矩陣。構築的提示詞字串要以 | 符號隔開提示詞,Automatic1111就會分組生成圖片,這概念好像很難懂,讓我用一個範例來講解。
今天你想要算一隻貓的圖,但是不知道各種提示詞對貓咪的影響是怎麼樣,例如你想測試吼叫(roaring)、毛茸茸(fluffy)跟生氣(angry)分別套上去的效果,就能用Prompt matrix來實驗:
digital painting of cat,
(extremely detailed CG unity 8k wallpaper), 
best quality, masterpiece , hdr, ultra highres |
roaring | 
fluffy |
angry
在上面的正面提示詞,開頭的前三行,會被當作基本提示詞,用在每一張圖上,四、五、六行被 | 符號分組的提示詞們會變成交錯添加的元素,產生一個成果組合圖:
Prompt matrix成果圖
左上角的第一張圖,就是什麼額外提示詞都沒加的狀態,它第二列的圖,則全都是添加了憤怒這個提示詞的效果。第二行則是都增加了怒吼提示詞的效果。而最右下的,就是憤怒、毛茸茸與怒吼全部提示詞都有的效果。
這樣你就能很清楚地看到,各種提示詞交互疊加起來的效果。例如憤怒這個提示詞,不僅改變了貓的表情,連姿勢跟背景都被影響了。因為AI在解釋提示詞時,並沒有真的了解了「憤怒」這個概念是什麼,它只是被訓練出了關聯性,把憤怒這個字,與憤怒的表情、令人害怕的背景顏色還有讓人感到威脅的攻擊姿勢關聯起來而已。
同時,你也能觀察到有關連的提示詞疊加起來也有更強化的效果,例如怒吼這個詞,單獨使用其實一點氣勢都沒有,但是與憤怒跟毛茸茸疊加起來,效果就很明顯,真的能表達出貓咪殺氣騰騰時全身的毛倒豎起來的效果。
提示詞矩陣不只一次能組合一個詞,而是可以一串提示詞為一組來使用,例如:
digital painting of 1girl, white dress | 
red hat, red shoes | 
holding flowers, smiling | 
from behind
這樣就能配出紅帽紅鞋一組,微笑與捧花一組,背後視角獨一組,共三組提示詞組合的矩陣了:
多提示詞一組的矩陣
這個功能跟X/Y/Z plot有點像,但是它只能改變提示詞,其他更複雜的設定就不如X/Y/Z plot那麼寬廣。但是這個功能在某些時候特別好用,以下舉兩個我會用到的場合。

提示詞檢定

當我們對某些定義很模糊的提示詞有疑慮時,通常會產生兩張圖片來比對,有時候這樣有用,但某些很詭異的提示詞,兩張圖看不太出來差別,但是拿掉了又覺得好像不一樣了,這時候就能用Prompt matrix來大規模生圖來確認。
例如我在檢查某個從網路上抓下來的正面提示詞時,發現了兩個我看不懂的提示詞:
extremely luminous bright design(極亮鮮豔設計),以及autumn lights(秋天光影)。每個字都懂,組合起來卻想不出會是什麼樣的效果,出了好幾張圖來比較檢查也是看不出什麼名堂,真的跟咒語一樣。
但是在Prompt matrix底下,就能很明顯看出差別:
用Prompt matrix檢查意義不明的提示詞
在這張組合圖中,極亮鮮豔設計出現在二、四、六、八行裡面,秋天光影出現在右半邊的所有圖上。這樣一比對下來,馬上就能看出所謂的極亮鮮豔設計,其實是在人物附近產生鮮豔的螢光光斑,但是在與秋天光影一起出現時會被壓制。而秋天光影,則是一種淡黃色的暖色系光,帶來秋天夜晚的感覺,而且人物的衣著也會被影響,變成長袖秋裝,連背景都變成秋天街道的夜景!

除錯

第二個場合就是除錯,有時候你的提示詞因為互相衝突,而造成整個畫面變得非常奇怪,或者讓某些外掛功能失效,這時候就要靠Prompt matrix把提示詞分組過濾出有問題的提示詞,才能順利算圖。
這種事情尤其容易發生在負面提示詞上,因為通常我們都是從網路大神那裡直接拷貝下來用在所有地方,但其實在某些複雜設定下,這種超長萬用提示詞反而容易出錯。
舉個例子,當我在用Latent Couple這個外掛,想要把兩個人物放進同一張圖時,使用官網提供的範例可以正常運作,但是當我把非常複雜的提示詞放進去的時候,反而只能算出一個人。
為了追根究柢,我開始測試各種組合:
  • 複雜的正面提示詞配上少少的負面提示詞:出現兩個人物,但是非常醜
  • 簡單的正面提示詞配上複雜的負面提示詞:出現一個漂亮的人物
由此可見,是某些負面提示詞造成問題。但是我的負面提示詞長達225個tokens,是哪些負面提示詞破壞了外掛的功能呢?這時候就是用Prompt matrix解決問題的時候了!
由於這個問題可能是好幾個提示詞一起影響造成的,我將全部的負面提示詞分成四組之後跑圖比對:
四組提示詞
這邊可以發現,第一行不管什麼情況都能出現兩個人,而其他組合一率只有一個,換句話說,問題出在其他三組提示詞上。於是我將第一組提示詞合併進基本組,然後繼續測試,找出沒問題的提示詞組就合併進基本組,直到最後變成了這樣:
最後結果
到了這種程度,已經可以確定是這幾個提示詞有問題,但是當我無論怎麼調換順序想要抓出到底是哪幾個提示詞在搞怪時,卻發現全都有問題。但是從提示詞的含義來看,根本不像會影響到一個人或多個人的生成。所以問題出在哪邊呢?
這時候我注意到了,沒問題的那串提示詞,總長度都在75個token以下,超過75個token就會出問題。於是我在75與76的長度反覆測試了幾個無關痛癢的提示詞,證明了是提示詞長度的問題,Latent couple碰到長度超過75 tokens的正面或負面提示詞,很容易癱瘓!
這是靠著Prompt matrix快速測試大量提示詞的功能抓到的問題,如果用其他方法,可能會跟瞎子摸象一樣難以掌握全局。
這個功能就介紹到這,祝大家AI算圖愉快!

進階技巧目錄:
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.