PHP2Shell 공지를 보고 점검했더니 PHP가 하나도 없었습니다

이미지
10월 21일에 PHP와 Node.js가 같은 날 보안 패치를 냈습니다. PHP 쪽은 사람들이 PHP2Shell이라고 부르고 있고, Node 쪽은 Node2Shell이라는 이름이 붙었습니다. 이름부터가 좀 무섭습니다. 뒤에 Shell이 붙으면 대개 남의 서버에서 명령을 실행할 수 있다는 뜻이니까요. 회사에서도 바로 지시가 내려왔습니다. 전 프로젝트 점검하고, 외부 IP 붙은 서버는 전수조사하라는 내용이었습니다. 회사 쪽 일은 회사 쪽대로 하고, 저는 퇴근하고 개인 프로젝트랑 예전에 알바로 했던 것들을 한번 열어 봤습니다. 그런데 열어 보고 나니 이번 글은 패치 이야기가 아니라 7년 전 이야기가 됐습니다. PHP2Shell과 Node2Shell, 둘이 같은 무게는 아닌 것 같습니다 찾아오신 분들은 아마 이게 뭔지, 내 서버가 해당되는지부터 궁금하실 것 같아서 그것부터 적습니다. PHP2Shell은 CVE 두 건입니다. CVE-2026-109618 과 CVE-2026-109619이고, 둘 다 인증 없이 원격에서 코드를 실행할 수 있는 취약점입니다. CVSS 4.0 기준 9.2점입니다. 하나는 메모리가 부족할 때 PHP가 요청 데이터를 반쯤 만든 상태에서 멈추고, 정리 단계에서 그 망가진 데이터를 멀쩡한 걸로 취급하는 문제입니다. 다른 하나는 요청이 끝난 뒤에도 그 요청이 쓰던 상태가 남아 있다가 같은 워커가 받은 다음 요청에서 다시 쓰이는 문제입니다. PHP 공식 공지 기준으로 고쳐진 버전은 8.5.12, 8.4.27, 8.3.36, 8.2.35입니다. 그보다 낮은 버전은 전부 해당됩니다. 8.1 이하는 PHP 프로젝트가 더 이상 정규 릴리스를 내지 않습니다. 대신 보안팀이 7.4, 8.0, 8.1용으로 최소한의 소스 백포트를 따로 공개해 뒀고, 배포판이나 LTS 벤더 중에도 백포트를 내는 곳이 있다고 합니다. 직접 빌드하거나 벤더 패키지를 쓰는 게 아니면 사실상 버전을 올리는 수밖에 없어 보입니다. 공지에도 설정을 바꾸는 건 부분적인 완화일 뿐이고...

봉제인형 사진 한 장, ChatGPT와 Gemini의 다른 대답

봉제인형으로 바뀐 가족사진. 안경 쓴 아빠 앞에서 빨간 스팽글 리본을 한 아기가 웃고, 옆에서 줄무늬 니트를 입은 여자아이가 흰 고래 인형을 들고 있다

오전에 당근 모임 대화방에 그림 두 장이 올라왔습니다. 저는 대화에 끼지 않고 읽기만 하고 있었습니다.

하나는 한옥 마당에서 버섯 바구니를 든 주황색 고양이였고, 다른 하나는 시장 골목에서 장바구니를 든 가지와 당근이었습니다. 둘 다 펠트로 만든 인형처럼 생겼고, 표면에 보풀이 일어난 게 폰 화면으로도 보였습니다. 바로 밑에 누가 물었습니다.

제미나이로 만든거에요?

올린 분 답은 이랬습니다.

아뇨 인스타에서 찾은거
걍 인형같던데...

대화는 "으흠 신기하네용"으로 끝났는데, 저는 "걍 인형같던데"에서 한참 멈춰 있었습니다. 그 그림이 노린 반응이 딱 그거라서요. 진짜 인형을 찍은 사진이면 굳이 나올 말이 아니고, 보는 사람이 한 번은 헷갈려야 나오는 말입니다. 가지가 쓴 동그란 안경은 실로 수놓은 것처럼 보이는데, 손바닥만 한 인형에 안경테를 저렇게 고르게 수놓는 건 손으로 하기엔 꽤 성가신 일입니다. 배경이 전부 적당히 흐려져 있고 햇빛이 인형 털 끝에서만 반짝이는 것도 그랬습니다. 제 눈에는 AI 쪽으로 보였습니다.

그래서 그 두 장을 뜯어보고 프롬프트로 옮겨 봤습니다. 인스타에 올린 사람이 어떤 프롬프트를 썼는지는 모르니 그림에서 보이는 걸 거꾸로 적어 내려간 거고, 그렇게 만든 프롬프트에 가지고 있던 사진 몇 장을 넣어 봤습니다.

그림을 문장으로

거꾸로 적어 내려간다는 게 말은 쉬운데, 해 보면 그림에서 뭘 볼지부터 정해야 합니다. 저는 얼굴을 먼저 봤습니다. 고양이 눈은 반쯤 감긴 선 두 줄이고 가지 얼굴도 눈과 입이 가는 선 몇 개로 끝납니다. 펜으로 그린 선이 아니라 실로 박음질한 선처럼 보여서, 눈, 눈썹, 코, 입은 프린트가 아니라 embroidery나 felt applique로 만든다는 문장이 됐습니다.

그다음이 표면이었습니다. 크게 키워 보면 고양이 털 끝부분이 햇빛을 받아 하얗게 빛나는데, 매끈한 3D 렌더링과 제일 다른 데가 여기라서 재질 단락과 림 라이트 문장을 따로 만들었습니다. 배경의 한옥 담장과 시장 좌판은 흐릿하지만 진짜 나무와 천처럼 보였고, 그래서 miniature diorama라는 말을 골랐습니다.

적어 놓고 보니 빠진 것도 있었습니다. 고양이 바구니에 담긴 버섯에도 얼굴이 있었고, 발밑에 놓인 초록색과 분홍색 떡 같은 동그란 것들에도 눈과 입이 있었습니다. 소품 하나하나가 캐릭터였던 겁니다. 저는 이걸 프롬프트에 안 적었고, 나중에 나온 결과물 일곱 장 어디에도 얼굴 달린 소품은 없었습니다. 적지 않은 건 안 나옵니다. 당연한 얘기인데 인스타 그림에서 제일 귀여웠던 게 그 버섯이었던 걸 생각하면 좀 아깝습니다.

그때는 생각 못 한 차이도 하나 있었습니다. 인스타 그림의 주인공은 고양이와 가지와 당근이라 닮아야 할 실제 대상이 없습니다. 누구를 알아보게 만들 필요가 없는 그림에서 뽑아낸 프롬프트를, 저는 누군지 알아봐야 하는 사람 사진에 썼습니다. 프롬프트 첫 단락은 원본을 유지하라는 말이지만 그 뒤의 재질과 조명과 배경 문장은 대부분 원본이 없는 그림을 보고 쓴 겁니다. 결과를 다 보고 나서야 이게 꽤 컸다는 생각이 들었습니다.

인형 얘기는 생각보다 적었습니다

프롬프트는 원본의 정체성을 유지하라는 말로 시작해서 비율, 재질, 얼굴 표현, 머리카락과 옷, 배경, 촬영 방식, 조명, 카메라, 포즈, 분위기를 차례로 지나고, 피해야 할 재질 목록과 마지막 한 줄로 끝납니다. 꽤 깁니다.

첫 단락에서 제일 중요하게 쓴 문장은 이겁니다.

캐릭터 자체를 새롭게 디자인하지 말고, 원본 캐릭터가 실제 봉제인형으로 제작되었다고 가정하여 표현한다.

재질 쪽은 이런 식입니다.

표면은 매끈한 CGI가 아니라 짧고 촘촘한 fuzzy fabric, soft felt, wool felt, short-pile plush fabric으로 이루어져 있으며

그리고 맨 끝 줄입니다.

'봉제인형처럼 보이는 3D 캐릭터'가 아니라 '실제로 존재하는 정교한 봉제인형을 따뜻한 miniature world에서 촬영한 사진'처럼 보여야 한다.

써놓고 다시 읽어 보니 인형 얘기는 생각보다 적었습니다. 분량으로 치면 절반 넘게가 이 사진이 어떻게 찍혔느냐에 쓰여 있었습니다. 50mm 렌즈, 얕은 심도, 골든아워 햇빛, 털 끝에 들어가는 림 라이트, 인형 눈높이에 맞춘 카메라 같은 것들이요. 인스타 그림이 인형 같다고 느끼게 만든 건 인형 자체보다 사진 쪽이라고 봤기 때문입니다. 진짜 봉제인형을 폰으로 대충 찍으면 저렇게 안 나옵니다. 저 그림들은 인형을 잘 만들었다기보다 인형 사진을 잘 찍은 쪽이었습니다.

반대로 원본 인물에 대한 지시는 거의 유지하라 하나뿐이었습니다. 얼굴 특징, 헤어스타일, 표정, 의상, 색상, 액세서리를 최대한 유지하라. 무엇을 어떤 기준으로 유지하라는 말은 없고 그 판단은 모델한테 맡겨 뒀습니다. 쓸 때는 이게 문제가 될 거라고는 생각 못 했습니다.

피해야 할 재질 목록도 꽤 깁니다. glossy plastic, vinyl toy, clay, porcelain, action figure 같은 것들인데, 이미지를 좀 만들어 본 사람이면 왜 넣는지 다 압니다. 인형이라고만 쓰면 모델이 제일 먼저 꺼내 오는 게 반질반질한 피규어나 3D 애니메이션 캐릭터라서 그쪽으로 가지 말라고 미리 적어 두는 겁니다.

ChatGPT로 만든 다섯 장

처음에는 ChatGPT에만 넣었습니다. 가족사진 몇 장과 강아지 사진 하나였습니다.

봉제인형으로 바뀐 셀카. 웨이브 머리의 엄마가 보라색 반짝이 왕관을 쓴 아기를 안고 있고, 화면 왼쪽 아래로 팔이 뻗어 나가 있다

재질은 기대한 대로 나왔습니다. 머리카락은 실을 뭉쳐 놓은 것 같고, 니트는 코가 하나하나 보이고, 얼굴은 양모 펠트를 바늘로 찔러 만든 것처럼 보송보송합니다. 재질 단락을 제일 길게 쓴 보람은 있어서, 다섯 장 전부 이 부분만큼은 한 번도 어긋나지 않았습니다.

원본 구도도 꽤 충실하게 남깁니다. 위 사진은 화면 왼쪽 아래로 팔이 뻗어 나가 있는데 원본이 셀카였던 모양입니다. 폰을 들고 있던 팔이 인형이 되어서도 그대로 남아 있습니다.

봉제인형으로 바뀐 셀카. 동그란 안경을 쓴 아빠가 줄무늬 옷을 입은 아기를 안고 있고, 앞에 곰 인형과 나무 블록이 흐릿하게 보인다

이 장에서는 옷에 적힌 글자가 재밌었습니다. 맨투맨 가슴에 영문이 있는데 "ARM B", "PROT", "/24" 정도만 읽히고 나머지는 뭉개져 있습니다. 글자가 있었다는 것과 대략의 모양은 가져오는데 뜻은 안 가져옵니다. 아기 옷의 곰 패치에는 "our"라고 수가 놓여 있는데 이것도 원래 뭐였는지는 모르겠습니다. 이미지 모델이 글자에 약하다는 건 이제 다 아는 얘기지만 인형 스타일에서는 오히려 덜 거슬립니다. 손으로 만든 인형 옷에 글자가 좀 삐뚤빼뚤한 건 자연스러우니까요.

그런데 이 장과 맨 위 대표 이미지를 나란히 놓으면 이상한 게 보입니다. 빨간 지붕을 얹은 나무 블록 집, 별이 그려진 파란 블록, 파란 나무 자동차. 서로 다른 사진으로 만든 두 장인데 이 소품 세 개가 둘 다 나옵니다. 앞쪽에 흐릿하게 들어간 초록 잎사귀도 같고 뒤쪽의 스탠드 조명과 액자도 비슷합니다.

프롬프트에 작은 생활 소품이라고 적어 두면 모델은 그걸 매번 같은 창고에서 꺼내 오는 것 같습니다. 한 장만 볼 때는 아기자기하게 잘 채운 배경인데 두 장을 겹쳐 보면 세트장이 하나라는 게 보입니다. 가족사진을 전부 같은 톤으로 맞추고 싶으면 이 반복이 통일감이 될 수도 있겠지만, 대신 사진마다 원래 어디서 찍혔는지는 거의 지워집니다.

빛도 그렇습니다. 다섯 장이 전부 골든아워입니다. 거실 소파에서 찍은 사진도, 아마 형광등 아래서 찍었을 사진도 전부 해 질 녘 창가로 들어오는 햇빛을 받고 있습니다. 프롬프트가 golden-hour sunlight를 쓰라고 했으니 틀린 건 아닌데, 원본이 몇 시에 찍혔든 모든 사진이 같은 시각이 돼 버립니다.

재질에서 하나 더 눈에 들어온 게 있었습니다. 전부 천으로 바뀐 건 아니었습니다. 대표 이미지에서 여자아이가 들고 있는 고래 인형에는 열쇠고리 고리가 달려 있는데, 이 고리는 반짝이는 금속 그대로입니다. 엄마 사진에서 아기가 입에 대고 있는 은색 물건도 금속 광택이 남아 있고, 아기 머리의 빨간 리본은 스팽글이 햇빛에 반짝입니다. 프롬프트는 glossy와 hard surface를 피하라고 했는데 말이죠. 반대로 아빠 얼굴의 안경은 두 장 모두 검은 실로 바뀌어서 테가 살짝 보풀 인 털실처럼 보입니다.

처음엔 제멋대로라고 생각했는데 프롬프트를 다시 보니 나름의 규칙이 있었습니다. 캐릭터 전체는 천과 솜으로 만들라고 했고 배경과 소품은 실제 재료로 만든 미니어처 세트처럼 표현하라고 했습니다. 그러면 모델은 사진 속 물건 하나하나가 캐릭터에 속하는지 소품인지부터 나눠야 합니다. 얼굴에 붙은 안경은 캐릭터 쪽이라 실이 되고, 손에 든 열쇠고리는 소품 쪽이라 금속으로 남습니다. 스팽글은 원래 천에 다는 장식이라 반짝여도 천으로 쳐 준 것 같고요. 저는 이 기준을 적은 적이 없는데 모델은 꽤 그럴듯하게 알아서 나눴습니다.

봉제인형으로 바뀐 남자아이. 노란 민소매와 파란 반바지 차림으로 펠트 눈알 두 개를 양손으로 눈앞에 대고 있고, 옆에 스케이트보드와 트럭 장난감, 축구공이 놓여 있다

이 장이 다섯 장 중에 프롬프트가 바란 모습에 제일 가까웠습니다. 펠트로 만든 눈알 두 개를 양손으로 눈앞에 대고 있는데, "작은 행동이나 상황이 느껴지는 자연스러운 포즈"와 "stop-motion 영화의 한 장면"이라는 주문을 이 장이 제일 잘 받았습니다. 주변의 스케이트보드, 트럭 장난감, 축구공도 이 아이 하루를 설명하는 소품이라 거실 세트처럼 복사해 붙인 느낌이 덜합니다.

봉제인형 재질로 바꾼 흰 강아지. 털이 부스스한 강아지가 러그 위에 서서 카메라를 올려다보고, 주변에 펠트로 만든 뼈다귀와 곰 장난감이 놓여 있다

강아지 사진은 반대로 거의 아무 일도 안 일어났습니다.

처음 봤을 땐 원본을 그냥 보정한 건가 싶었습니다. 원래 털이 하얗고 부스스한 강아지라 봉제인형 재질로 바꾸라는 지시가 바꿀 게 별로 없었던 겁니다. 눈이 좀 더 동그래지고 코가 좀 더 반들반들해졌을 뿐, 사람 사진에서 보이던 변화가 여기선 거의 안 보입니다. 주변의 뼈다귀 장난감과 곰 인형, 방석은 확실히 펠트인데 주인공만 진짜 강아지처럼 서 있습니다. 발밑 러그와 털 색까지 비슷해서 어디까지가 강아지인지도 흐릿합니다.

재질을 바꾸는 프롬프트는 원래 재질과 거리가 먼 만큼만 티가 나는 것 같습니다. 사람 피부는 펠트와 멀어서 변화가 크게 보이고, 원래 보송한 강아지 털은 펠트와 가까워서 변화가 묻힙니다. 강아지를 인형처럼 보이게 하고 싶었다면 짧게 깎은 펠트처럼 원래 털과 다른 재질을 따로 정해줬어야 했습니다.

생각해보면 이건 이미지에서만 생기는 일도 아닌 것 같습니다. 바꾸라는 지시는 바뀌는 게 클 때만 잘 보이고, 원래 비슷한 걸 바꾸라고 하면 됐는지 안 됐는지부터 애매해집니다. 강아지 사진을 보고 제가 처음에 보정만 한 건가 했던 것도 그래서였을 겁니다. 모델이 일을 안 한 건지, 했는데 티가 안 나는 건지를 결과만 보고는 구분하기가 어렵습니다.

같은 사진을 두 군데에

여기까지는 ChatGPT만 봤습니다. 그런데 대화방 질문이 "제미나이로 만든거에요?"였던 게 계속 마음에 남아서, 같은 사진과 같은 프롬프트를 Gemini에도 넣어 봤습니다.

원본 사진은 싣지 않고 말로만 적겠습니다. 실제 아이 얼굴이 나온 사진을 올리는 건 인형으로 바꾼 결과물을 올리는 것과는 다른 문제라서요. 동물 체험하는 곳에서 찍은 것 같은 사진인데, 여자아이가 한쪽 팔을 옆으로 쭉 뻗고 있고 그 팔뚝 위에 진짜 투칸이 앉아 있습니다. 노란 부리는 화면 왼쪽을 향해 길게 뻗어 있고, 아이는 손가락을 활짝 편 채 고개를 숙여 새를 내려다봅니다. 웃는 얼굴은 아닙니다. 새가 팔에 올라와 있으니 조심스러운 얼굴에 가깝습니다. 머리에는 은색 반짝이 별 세 개가 달린 머리띠를 했고, 옷은 네이비 폴로 셔츠에 가슴에 분홍색 말 로고가 있습니다. 바닥은 초록색으로 칠한 시멘트이고, 아이 뒤로 차례를 기다리는 다른 아이들 옷자락이 보입니다. 그중 하나는 여자아이 그림이 프린트된 흰 후드티입니다.

ChatGPT 결과. 봉제인형이 된 여자아이가 활짝 웃으며 팔을 뻗고 있고, 팔 위에 펠트 투칸이 앉아 있다. 뒤로 다른 아이들과 투칸 그림 안내판, 나무 울타리가 보인다

ChatGPT 쪽은 이렇게 나왔습니다.

거의 다 남겼습니다. 네이비 폴로, 단추, 분홍 말 로고, 활짝 편 손가락, 왼쪽을 향한 부리까지요. 뒤에 서 있던 아이들도 남겼고, 흰 후드티의 여자아이 프린트까지 펠트 그림으로 바꿔서 그대로 넣었습니다. 원본을 옆에 놓고 보면 요소 하나하나가 거의 그대로 대응됩니다.

바뀐 건 두 가지였습니다. 하나는 표정입니다. 고개를 숙이고 조심스럽게 새를 보던 아이가 여기서는 볼이 발그레한 채로 웃고 있고, 눈도 원본보다 훨씬 크고 반짝입니다. 프롬프트에 표정을 유지하라는 말이 분명히 있었는데 그 말보다 "cute, cozy, heartwarming"을 더 크게 들은 것 같습니다. 다른 하나는 배경입니다. 시멘트 바닥이 없어지고 나무 울타리와 밧줄, 작은 연못이 생겼고, 뒤쪽에는 투칸 그림이 그려진 안내판이 섰습니다. 원본엔 없던 안내판입니다. 투칸이 있으니 동물원이겠다고 짐작하고 그 짐작에 맞는 소품을 알아서 채운 거죠.

귀염귀염하다는 말이 이 장에는 딱 맞습니다. 원본을 충실하게 옮긴 다음 전체를 한 단계 귀엽게 보정한 느낌입니다. 그리고 세상 크기가 실물 그대로입니다. 사람만 한 인형이 동물원에 서 있는 것 같지, 탁자 위 미니어처 세트를 찍은 것처럼 보이지는 않습니다.

Gemini 결과. 검은 생머리의 수제 인형 같은 여자아이가 무표정하게 팔 위의 펠트 투칸을 보고 있다. 잔가지 울타리와 자갈 바닥, 이끼, 과일이 담긴 라탄 바구니가 있는 미니어처 세트다

Gemini 쪽은 많이 달랐습니다.

뒤에 있던 아이들이 전부 없어졌습니다. 대신 잔가지를 엮은 울타리와 철망, 자갈 바닥, 이끼, 돌멩이가 생겼고, 뒤쪽에 망고 같은 과일이 담긴 라탄 바구니가 놓였습니다. 자갈 알갱이 크기를 보면 확실히 탁자 위에 만든 미니어처 세트입니다. 인형도 달라서, ChatGPT 쪽이 귀엽게 그린 펠트 캐릭터라면 이쪽은 공방에서 실제로 파는 수제 인형에 더 가깝습니다. 얼굴은 무표정에 가깝고, 눈은 작고, 손은 손가락 없이 벙어리장갑처럼 뭉쳐 있습니다. 원본 머리의 갈색 기가 빠져서 새까만 생머리가 됐고, 투칸은 방향을 바꿔 아이 쪽을 보고 앉았습니다. 새를 만든 방식도 다릅니다. ChatGPT 쪽 투칸은 부리 가운데로 박음질 선이 지나가는 펠트이고, Gemini 쪽 투칸은 주황색 줄무늬를 수놓은 매끈한 천으로 부리를 감쌌습니다.

그런데 별은 세 개입니다. ChatGPT 쪽은 두 개였고, 원본 머리띠의 별은 세 개입니다. 머리띠가 머리에 꽂은 핀처럼 바뀌긴 했지만 개수는 Gemini가 맞췄습니다. 아이 시선이 새를 향하고 있는 것도 웃음을 얹은 ChatGPT보다 원본에 가깝습니다. 둘이 원본에서 챙긴 게 서로 달랐습니다.

옷도 자세히 보면 좀 이상합니다. 투칸이 앉은 팔은 손목까지 오는 긴소매인데, 화면 오른쪽 아래로 보이는 반대쪽 팔은 반소매입니다. 원본은 양쪽 다 긴소매였습니다. 원본 옷을 그대로 옮겼다면 생길 수 없는 실수라서, Gemini는 옷을 옮긴 게 아니라 네이비 폴로라는 정보만 가져와서 새로 지은 것 같습니다.

Gemini 결과 오른쪽 아래 구석에는 작은 반짝이 표시가 찍혀 있습니다. Gemini가 만든 이미지에 넣는 표시입니다. 대화방 질문에 답할 단서로는 사실 이게 제일 확실할 텐데, 인스타 그림은 대화방 미리보기로만 봐서 그 구석이 어땠는지는 모르겠습니다.

제가 제일 오래 들여다본 건 라탄 바구니였습니다.

원본 사진에는 바구니가 없습니다. 투칸 체험장에 과일 바구니가 있을 이유도 딱히 없고요. 그러면 이 바구니는 프롬프트에서 온 겁니다. 배경 소품을 적은 문장에 "나무, 돌, 풀, 낙엽, 천, 라탄 바구니, 식물, 음식"이라고 적혀 있었고, Gemini는 그 목록에서 나무, 돌, 풀, 라탄 바구니, 식물, 음식을 거의 그대로 꺼내 썼습니다.

그 목록은 대화방에 올라온 인스타 그림 두 장에서 왔습니다. 고양이가 버섯이 담긴 바구니를 들고 있었고, 가지와 당근이 장바구니를 들고 있었습니다. 그 그림을 보고 프롬프트를 쓰면서 제가 바구니를 목록에 넣었습니다. 저는 이런 분위기의 소품이라는 예시로 적은 건데 Gemini는 이 장면에 들어가야 할 물건으로 읽었습니다.

그러니까 Gemini 결과 속 바구니는, 인스타에서 누가 만든 고양이 그림 속 바구니가 제 프롬프트를 거쳐서 제 사진 속 체험장까지 들어온 겁니다. 프롬프트에 원래 그림의 흔적이 이렇게 남아 있다는 걸 이 결과를 보고서야 알았습니다. ChatGPT는 같은 목록을 받고도 바구니를 안 넣었습니다. 같은 단락에 "장면은 원본 캐릭터의 분위기와 상황에 맞게 자연스럽게 구성한다"는 문장이 있었으니, ChatGPT는 그 문장을 따랐고 Gemini는 목록을 따른 것 같습니다.

이걸 보고 나니 이 프롬프트를 남한테 그대로 넘기면 어떻게 될까 싶었습니다. 받은 사람은 라탄 바구니가 왜 목록에 있는지 모릅니다. 인스타 고양이 그림을 본 적이 없으니까요. 그 사람 눈에는 그냥 따뜻한 분위기를 내는 소품 예시로 보일 거고, Gemini에 넣었다가 바구니가 나오면 Gemini가 엉뚱하다고 생각할 겁니다. 실은 제 프롬프트에 남아 있던 흔적인데요. 프롬프트도 코드처럼 문장마다 왜 들어갔는지가 어딘가 적혀 있지 않으면, 넘겨받은 사람은 그 문장을 지워도 되는지조차 판단을 못 할 것 같습니다. 만약 이 프롬프트를 대화방에 공유한다면, 그 전에 바구니 줄부터 손봐야 할 것 같습니다. 거기 바구니가 왜 있는지 아는 사람은 지금 저 하나뿐이니까요. 저조차 몇 달 지나면 잊어버릴 것 같기도 하고요.

어느 쪽이 잘 따랐나

처음에는 ChatGPT가 잘했고 Gemini가 엉뚱했다고 생각했습니다. 사진 속 아이를 알아볼 수 있는 쪽은 분명 ChatGPT입니다.

그런데 프롬프트 마지막 줄을 다시 읽으면 좀 달라집니다. 봉제인형처럼 보이는 3D 캐릭터가 아니라, 실제로 있는 정교한 봉제인형을 miniature world에서 찍은 사진. 이 문장만 놓고 보면 Gemini 쪽이 더 가깝습니다. ChatGPT 결과는 솔직히 봉제인형처럼 보이는 캐릭터 그림에 가깝고, 저 인형을 실제로 만들어 달라고 하면 공방에서 난감해할 것 같습니다. 눈 크기와 볼 터치가 특히 그렇습니다. Gemini 결과는 저 인형이 실제로 어딘가 있을 것 같고, 저 세트도 누가 탁자 위에 만들 수 있어 보입니다. miniature diorama라는 단어를 정말 미니어처로 만든 것도 Gemini였습니다.

둘 다 프롬프트를 따르긴 했고, 따른 부분이 달랐습니다. 프롬프트 첫 단락은 원본을 유지하라는 거였고 마지막 줄은 진짜 인형 사진처럼 보이라는 거였는데, 둘이 부딪힐 때 뭘 먼저 지킬지를 저는 안 적었습니다. 그 순서를 ChatGPT는 원본 쪽으로, Gemini는 프롬프트 쪽으로 정했습니다.

제가 보기엔 이 차이가 프롬프트보다는 두 도구가 첨부 사진을 대하는 기본 태도에서 나오는 것 같습니다. ChatGPT는 첨부한 사진을 편집할 대상으로 보고 프롬프트를 그 위에 씌우는 필터처럼 씁니다. 그래서 구도도, 인물도, 뒤에 선 아이들까지 남기고 거기에 자기 취향의 귀여움을 한 겹 더 입힙니다. Gemini는 사진을 참고 자료로 보고 프롬프트를 설계도로 씁니다. 사진에서는 인물 정보만 가져오고 장면은 설계도대로 새로 만듭니다. 그 설계도 문장 대부분이 원본 없는 인스타 그림에서 왔으니, 설계도를 충실히 따른 Gemini가 원본에서 멀어진 건 어쩌면 자연스러운 일이었습니다. 원본이 없던 그림의 세계를 원본이 있는 사진 위에 새로 지은 거니까요.

출력 비율만은 반대였습니다. 원본은 가로로 긴 사진인데, 내용을 거의 다 바꾼 Gemini는 가로 비율을 그대로 뒀고, 내용을 거의 다 남긴 ChatGPT는 다른 다섯 장처럼 정사각형에 가깝게 잘랐습니다. 사진을 편집 대상으로 본다는 제 설명과는 안 맞는데, 이건 태도보다는 도구마다 출력 크기를 정하는 기본값이 다른 거라고 보고 있습니다.

대화방에서 누가 제미나이로 만든 거냐고 물었던 그 그림들은 제 눈에는 오히려 ChatGPT 결과와 더 닮았습니다. 동그랗고 큰 눈, 과장된 표정, 배경보다 캐릭터가 먼저 보이는 구성이 그렇습니다. 누가 뭘로 만들었는지야 저도 모르지만요.

다시 쓴다면

이번에 제일 크게 느낀 건 긴 프롬프트가 결국 바라는 걸 늘어놓은 목록에 가깝다는 겁니다. 그리고 목록 안에는 서로 부딪히는 항목이 꼭 섞여 있습니다. 표정을 유지하라는 말과 heartwarming하게 하라는 말. 원본 상황에 맞게 구성하라는 말과 라탄 바구니를 쓰라는 말. 캐릭터 눈높이의 50mm 인물 사진이라는 말과 탁자 위 미니어처 세트라는 말. 하나씩 읽으면 다 그럴듯한데 한 장의 그림 안에서 전부 지킬 수는 없습니다. 뭘 버릴지는 모델이 정하고, 모델마다 버리는 쪽이 다릅니다.

그래서 다음에 이 프롬프트를 고친다면 문장을 더 넣기보다 순서부터 적을 것 같습니다. 원본과 이 지시가 부딪히면 원본을 따른다, 같은 한 줄이요. 원본 인물을 알아보는 게 목적이면 이렇게 쓰고, 인스타 그림 같은 분위기가 목적이면 반대로 씁니다. 둘 다 원하면 둘 다 어정쩡하게 나올 것 같습니다.

소품 목록 앞에도 한 줄 붙이고 싶습니다. 원본 사진에 있는 것을 이런 재료로 바꾼다, 라고 적으면 그 목록은 새로 넣을 물건이 아니라 재료를 고르는 기준이 됩니다. 이번 Gemini 결과의 바구니는 이 한 줄이 없어서 생겼다고 보고 있고, ChatGPT 쪽에서 여러 장에 같은 나무 블록이 반복되던 것도 좀 줄지 않을까 싶습니다.

표정도 따로 적을 생각입니다. 투칸 사진에서 ChatGPT가 조심스러운 얼굴을 웃는 얼굴로 바꾼 건 cute와 heartwarming이 표정 유지보다 세게 들렸기 때문이라고 봤습니다. 분위기 단어는 장면 전체에 영향을 주는 말이라 얼굴까지 덮어 버립니다. 분위기는 조명과 배경으로만 만들고 표정은 원본을 따른다, 처럼 분위기 단어가 어디까지 닿는지 범위를 정해 두면 조심스러운 아이 얼굴이 그대로 남은 따뜻한 사진이 나오지 않을까 싶습니다. 원본 사진이 재밌는 이유도 사실 그 조심스러운 얼굴에 있다고 생각합니다.

강아지처럼 원래 털이 있는 대상은 따로 적어야겠습니다. 원래 재질과 다른 재질을 정해줘야 바뀐 게 눈에 보입니다. 얼굴 달린 소품도 넣고 싶으면 적어야 합니다. 인스타 그림의 버섯처럼 소품에도 눈과 입을 수놓으라고 한 줄 쓰면 되는데, 이건 어느 쪽 목적이든 해가 없어 보입니다. 거실의 나무 블록에 얼굴이 생기면 아이 사진에는 오히려 잘 어울릴 것 같고, 원본을 알아보는 데는 방해가 안 되니까요.

골든아워는 아직 고민 중입니다. 여러 장을 같은 빛으로 맞추면 한 세트처럼 보여서 좋은데, 원본이 밤에 찍은 사진이면 결과도 밤이어야 하는 게 아닌가 싶기도 합니다. 어디에 쓰느냐에 따라 다를 것 같습니다. 한 세트로 묶을 사진인지 한 장씩 따로 볼 사진인지를 먼저 정하면 답이 나올 것 같기도 한데, 그것도 아직은 짐작입니다.

코딩 쪽과는 좀 다르게

예전에 plan 모드로 plan.md를 쓰는 습관을 두고 프롬프트 엔지니어링의 잔상이라고 쓴 적이 있습니다. 두 번째 기회가 없던 시절에 한 번에 다 넣던 습관이 계획서로 모양만 바꿔서 남아 있다는 얘기였습니다. 코딩은 지금도 그렇게 봅니다. 대화하면서 고치면 되니까요.

이미지는 아직 사정이 좀 다른 것 같습니다. 코드는 한 줄을 고치면 그 한 줄만 바뀌는데, 이미지는 표정 하나만 고쳐 달라고 해도 얼굴 전체가 새로 그려지는 일이 흔합니다. 원본 인물을 알아볼 수 있게 남기는 게 목적인 작업에서는 이게 꽤 치명적입니다. 그래서 이미지 쪽에서는 처음 넣는 프롬프트를 공들여 쓰는 게 아직은 의미가 있다고 봅니다.

다만 공들일 게 문장의 양은 아니었습니다. 이번 프롬프트는 재질과 카메라와 빛을 아주 자세하게 적었고, 그 부분은 두 도구 모두 잘 따랐습니다. 결과를 다르게 만든 건 제가 안 적은 부분, 뭘 먼저 지킬지였습니다. 그 빈 곳을 채운 건 프롬프트가 아니라 도구였고, 같은 프롬프트로 두 도구에서 나온 차이가 제가 문장 몇 개를 고쳐서 만들 수 있는 차이보다 훨씬 컸습니다. 이미지 쪽에서는 문장을 다듬기 전에 어느 도구에 넣을지를 먼저 고르게 될 것 같습니다.

대화방에 같은 질문이 또 올라오면 저라면 오른쪽 아래 구석부터 보고 그다음에 바구니를 찾을 것 같습니다. 바구니 쪽은 반쯤 농담입니다.

댓글

이 블로그의 인기 게시물

AI 부업으로 3개월에 2달러 벌고 50달러를 썼다는 증언을 봤습니다. 그 위에 광고가 네 겹입니다

구글은 서울에서 모델이 아니라 에이전트를 판다