캐릭터 embedding 기술 프라이머: 내부 아키텍처
현대 AI 영상 스택에서 캐릭터 일관성 시스템이 내부적으로 어떻게 작동하는지 엔지니어 관점에서 해설. 아키텍처, 설계 결정, 실패 모드, 미해결 연구 과제.
이 글은 엔지니어를 위한 것입니다 — AI 영상 도구를 만들거나 평가하는 연구자, ML 실무자, 개발자가 대상입니다. 캐릭터 일관성이 왜 중요한지에 대한 비기술적 개관을 원한다면 완전 가이드부터 시작하세요.
여기서는 현대 AI 영상 스택에서 캐릭터 embedding 시스템이 실제로 어떻게 작동하는지를 다룹니다: 아키텍처, 설계 결정, 실패 모드, 그리고 아직 풀지 못한 미해결 문제들.
문제 정의
생성 영상 모델 M과 캐릭터 C가 주어졌을 때, C를 참조하는 프롬프트 시퀀스 p_1, p_2, …, p_n의 임의의 p_i에 대해, 생성된 출력이 모두 C의 정체성을 보존하는 절차를 원합니다.
나이브한 접근 — 모든 프롬프트에 캐릭터 묘사를 포함시키는 것 — 은 실패합니다. 디퓨전 샘플링이 확률적이고, 프롬프트는 카테고리를 묘사하지 정체성을 묘사하지 않기 때문입니다. 각 생성은 묘사에 부합하는 유효 캐릭터 분포에서의 추출이며, 추출 간에 정체성이 드리프트합니다.
묘사가 아닌 특정 학습된 정체성에 모델 출력을 컨디셔닝하는 방법이 필요합니다.
아키텍처
현대 캐릭터 일관성 시스템은 6개 컴포넌트로 구성됩니다:
1. 특징 추출 — 참조에서 정체성 embedding 생성
2. 스토리지 — embedding을 character_id에 묶어 영구화
3. 네거티브 프롬프트 합성 — 드리프트 카탈로그에서 자동으로 negative_prompt 구축
4. 컨디셔닝 주입 — embedding을 모델 컨디셔닝에 주입
5. 생성 — 컨디셔닝된 모델로 디퓨전 샘플링
6. 일관성 검증 — 사후 유사도 체크, 필요 시 재생성하나씩 살펴봅시다.
1. 특징 추출
캐릭터 업로드 시, 참조 이미지에 대해 여러 전문 모델을 실행합니다:
- 얼굴 인코더: ArcFace, FaceNet, 또는 유사 모델. 얼굴 인식에 최적화된 512차원 정체성 embedding 출력. 정체성 불변 특징 포착.
- 신체 파서: 신체 비율과 자세용 PIFu 또는 Sapiens. 키, 체격, 자세를 인코딩하는 저차원 벡터.
- 외관 인코더: 머리색, 피부톤, 의상 스타일용 CLIP(Contrastive Language-Image Pretraining, 대조 학습 기반 이미지 인코더) 이미지 인코더. 768차원 의미 embedding.
- 스타일 분류기: 참조가 사실적인지, 양식화됐는지, 애니메이션인지 등을 별도로 인코딩. 작은 카테고리컬 벡터.
이들을 연결(또는 어텐션으로 통합)해 고차원 캐릭터 embedding e_C로 만듭니다. 총 차원 수는 일반적으로 1500~3000입니다.
왜 하나가 아니라 여러 모델인가? 정체성에는 단일 인코더가 완전히 포착하지 못하는 여러 축이 있기 때문입니다. 얼굴 인코더는 "이게 같은 얼굴인가?"에는 강하지만 신체 비율에는 무지합니다. 신체 파서는 얼굴 디테일에 무지합니다. CLIP은 의미적 외관에 강하지만 미세한 정체성을 잃습니다. 연결이 직교적 커버리지를 줍니다.
트레이드오프: 더 복잡한 추출 파이프라인은 캐릭터 업로드 시 더 많은 연산을 의미합니다(업계 다수의 시스템에서 ~30~90초). 소비자 도구라면 괜찮습니다. 고처리량 파이프라인에서는 업로드 시 embedding을 한 번 사전 계산하고 생성 시 참조할 수 있습니다.
2. 스토리지
각 캐릭터는 (character_id, embedding_vector, metadata)로 저장됩니다. 메타데이터에는:
- 소스 참조 이미지 (디버깅과 재추출용)
- 소유자 / 프로젝트 연결
- 서브-변형 포인터 (상태 변형 섹션에서 더 자세히)
- 스타일 앵커 (크로스 스타일 작업용)
- 드리프트 모드 오버라이드 리스트 (캐릭터별 커스터마이징)
스토리지는 일반적으로 벡터 데이터베이스(Pinecone, Qdrant, Weaviate)나 커스텀 인덱스 구조입니다. 룩업은 빠르게 — 100ms 이하로 — 이뤄져야 합니다. 모든 생성에서 발생하기 때문입니다.
프라이버시 민감한 배포에서는 embedding을 테넌트별 키로 암호화 저장할 수 있습니다. 추출은 단방향 함수입니다(embedding에서 참조 이미지를 복원할 수 없음). 그러나 실존 인물을 다루는 시스템에서는 embedding을 PII로 다루는 것이 올바른 디폴트입니다.
3. 네거티브 프롬프트 합성
이 부분이 시스템의 비자명한 부분이고, 엔지니어링 작업의 대부분이 사는 곳입니다.
흔한 드리프트 모드 카탈로그를 유지합니다 — 수천 건의 생성에서 관찰된 카테고리컬 실패 유형들. 각 모드에 대해 그 실패를 억제하는 대응 negative_prompt 조각을 가집니다.
업계 카탈로그 예시:
| 드리프트 모드 | 네거티브 프롬프트 조각 |
|---|---|
| 눈 색 시프트 (갈색 → 녹색) | "green eyes, hazel eyes" (참조가 갈색일 때) |
| 턱선 좁아짐 | "narrow jaw, weak chin, soft jawline" |
| 헤어라인 후퇴 | "high hairline, thinning hair, receding hairline" |
| 피부톤 따뜻해짐 | "warm skin tone, golden complexion" (참조가 차가운 톤일 때) |
| 비대칭 침투 | "asymmetric face, uneven features" |
| 눈 간격 시프트 | "wide-set eyes, close-set eyes" |
이 카탈로그를 만들려면 라벨링된 데이터가 필요합니다. 업계 일부 팀들은 공개 AI 영상 도구(Runway, Pika, Sora 등)에서 ~10,000건의 생성에 나타난 특정 드리프트 모드를 라벨링했습니다. 클러스터링으로 ~30개의 별개 모드가 나왔고, 관찰된 드리프트의 ~85%를 커버합니다.
각 생성에서 시스템은:
- 캐릭터의 참조 속성을 가져옴
- 각 속성의 "반대"를 계산 (예: 참조가 짙은 눈이면 반대는 옅은 눈)
- 관련 드리프트 억제기들을 조립한 캐릭터별 네거티브 프롬프트 구성
결과는 프롬프트 단독 생성보다 훨씬 강한 컨디셔닝 신호입니다.
4. 컨디셔닝 주입
영상 모델마다 컨디셔닝을 받는 방식이 다릅니다:
- 참조-이미지 기반 모델(대부분의 공개 API): 참조 이미지를 전달할 수 있습니다; 학습된 프로젝션으로 embedding을 "합성 참조 이미지"로 다시 인코딩한 뒤 그것을 전달합니다.
- 텍스트 전용 컨디셔닝: embedding의 학습된 소프트 프롬프트 프로젝션을 전달.
- API 레벨 모델 접근(가능한 경우): IP-Adapter 컨디셔닝과 유사하게, embedding을 크로스 어텐션 레이어에 직접 주입.
업계 일부 팀들의 경험상 API 레벨 주입이 참조 이미지 기반보다 훨씬 효과적이지만, 대부분의 공개 API는 이 깊이의 접근을 노출하지 않습니다. 사용 가능한 API 표면에서 작업하면서, 강력한 네거티브 프롬프트와 참조-이미지로 인코딩된 embedding을 결합하는 방식이 API 레벨 주입의 80~90%까지 가져다준다는 것을 발견했습니다.
이게 기반 모델을 통제하지 않더라도 캐릭터 일관성 레이어를 구축하는 게 의미 있는 이유 중 하나입니다 — 공개 API가 이미 노출하는 컨디셔닝 표면에는 의미 있는 헤드룸이 있습니다.
5. 생성
표준 디퓨전 샘플링이지만, 컨디셔닝이 다음의 조합이 됩니다:
- 원본 프롬프트 (장면, 액션, 프레이밍)
- 캐릭터 embedding (위 메커니즘으로 주입됨)
- 네거티브 프롬프트 (자동 합성됨)
- 스타일 앵커 (세그먼트에 적용 가능한 경우)
생성 비용은 보통 바닐라 생성의 1.0~1.2배입니다. 한계 비용은 작습니다.
6. 일관성 검증
생성 후, 별도의 정체성 모델(보통 1단계에서 사용한 같은 얼굴 인코더)을 출력에 대해 실행합니다. 출력의 정체성 embedding과 원본 참조 embedding 간의 코사인 유사도를 계산합니다.
임계값: 보통 0.85 코사인 유사도. 임계값 이상이면 출력이 수락됩니다. 이하면 더 엄격한 컨디셔닝(높은 네거티브 프롬프트 가중치, 강한 embedding 주입)으로 재생성을 트리거합니다.
이는 평균적으로 ~5~10%의 생성 비용을 추가하고(대부분의 샷이 첫 시도에 통과), 최악의 드리프트 케이스가 사용자에게 도달하는 것을 막습니다.
잘 작동하는 것, 그렇지 않은 것
잘 작동하는 것:
- 표준 장면 변동에 걸친 단일 캐릭터의 30샷 이상 높은 일관성
- 프로젝트 간 캐릭터 라이브러리 재사용 (한 번 추출, 무한 재사용)
- 크로스 플랫폼 일관성 (같은 character_id, 합리적 범위 내 다른 장면 / 스타일에 걸쳐 같은 정체성)
- 구별되는 특징(다른 나이, 성별, 인종)을 가진 멀티 캐릭터 장면
더 어려운 것:
- 상태 변형: 같은 캐릭터지만 부상, 노화, 다른 옷. 마스터에서 파생된 서브-embedding을 사용하며, 마스터는 불변 정체성을 인코딩하고 서브는 델타를 인코딩합니다. 중간 정도 변동에는 작동; 큰 변환(예: 같은 캐릭터의 8세 버전)에서는 무너짐.
- 멀티 캐릭터 장면에서 정체성 침투: 두 락된 캐릭터가 프레임을 공유하고 비슷한 특징(예: 둘 다 30세 아시아 여성)을 가질 때, 약 10%의 생성에서 부분적 특징 침투가 나타남.
- 크로스 스타일 정합성: 락된 사실적 캐릭터가 양식화된 "수채화" 세그먼트에 배치됨. 세그먼트별 스타일 앵커로 부분 해결되지만 열화가 보임.
- 동물 / 비인간 캐릭터: 같은 아키텍처가 적용되지만, 인간 얼굴 외부에서는 얼굴 인코더 품질이 급격히 떨어짐.
- ~3분을 넘는 장편 정합성: 드리프트 억제는 샷 단위로 작동하지만, 50샷 이상에서 누적된 미세한 차이가 주의 깊은 시청자에게는 미세한 시각적 비일관성으로 보일 수 있음.
미해결 연구 과제
이 영역에서 일하고 있다면, 풀리는 것을 보고 싶은 문제들:
- 상태 변형 불변량. 정체성 불변 얼굴 구조를 포착하면서 임의의 상태 변환을 허용하는 올바른 학습 표현은 무엇인가?
- 샘플링 중 능동 드리프트 검출. 현재의 일관성 체크는 사후적이다. 디퓨전 프로세스 중에 드리프트를 검출하고 샘플링 중에 보정할 수 있을까?
- 암묵 vs 명시적 정체성 트레이드오프. 캐릭터별 작은 LoRA 훈련이 embedding 기반 컨디셔닝을 능가하는 시점은? 경계는 어디?
- 멀티 캐릭터 상호작용 모델링. 두 락된 정체성뿐 아니라, 샷에 걸쳐 유지되는 그들의 관계 역학을 어떻게 포착하나?
- 정체성 불확실성 정량화. 모델이 정체성에 대해 확신이 없을 때, 자신감 있게 드리프트하는 대신 그 불확실성을 표면화할 수 있을까?
이 중 하나라도 작업하고 있고 노트를 비교하고 싶다면, Juying 팀은 진심으로 관심이 있습니다. 연락주세요.
빌더를 위한 실용적 조언
자체 제품에 캐릭터 일관성 레이어를 만드는 걸 고려한다면, 세 가지 조언:
1. 네거티브 프롬프트 카탈로그부터 시작하세요. 가장 임팩트 크고 비용 적은 승리입니다. API 레벨 모델 접근이 필요 없습니다 — 네거티브 프롬프트는 모든 공개 API가 노출합니다. 1주일을 1000개 생성을 라벨링하는 데 쓰면 대부분의 드리프트를 커버하는 카탈로그를 갖게 됩니다.
2. 사후 검증을 과소평가하지 마세요. 단순한 "유사도 0.85 미만이면 재생성" 루프를 추가하는 것만으로 최악 10%의 실패를 잡고 체감 품질을 극적으로 향상시킵니다. 사용 가능한 90/100 → 95/100 품질 부스트 중 가장 저렴한 방법입니다.
3. 스토리지에 일찍 투자하세요. 캐릭터 embedding을 영구 자산으로 다루는 것이 복리로 쌓이는 아키텍처적 통찰입니다. 올바른 프리미티브를 한 번 만들면 모든 미래 기능(스타일 락, 장면 라이브러리, 자산 재사용)이 자연스럽게 확장됩니다.
관련 글
이 영역에서 만들고 있고 얘기하고 싶다면 — info@juying.art