12장. 멀티모달 RAG 와 데이터셋 자동 생성
그림으로 찾고 글로 찾기
옷가게 점원에게 "이런 거 있어요?" 하고 사진을 보여 줄 수도 있고, "빨간 모자 있어요?" 하고 말로 물을 수도 있습니다. 점원이 "이건 모자네요" 하고 이름을 붙여 줄 수도 있습니다. 같은 공간의 임베딩이 있으면 이 세 가지를 모두 할 수 있습니다.
왼쪽은 글 임베딩과 가장 가까운 그림을 찾고, 가운데는 그림 임베딩끼리 견줘 비슷한 그림을 찾고, 오른쪽은 "a drawing of a mug" 같은 이름표 글 여러 개와 그림을 견줘 가장 가까운 이름표를 고릅니다(제로샷 분류). 여기서 말로 묻기가 글로 그림 찾기, 사진 보여 주기가 그림으로 찾기, 점원이 이름 붙이기가 제로샷 분류입니다.
세 쓰임 견주기
| 쓰임 | 질문 | 견주는 것 | 예 |
|---|---|---|---|
| 글로 그림 찾기 | 글 | 글 임베딩 ↔ 그림 임베딩 | "파란 배낭" → 배낭 그림 |
| 그림으로 그림 찾기 | 그림 | 그림 임베딩 ↔ 그림 임베딩 | 고객이 올린 사진과 닮은 상품 |
| 제로샷 분류 | 그림 | 그림 임베딩 ↔ 이름표 글 임베딩 | 새 상품 그림에 종류 붙이기 |
이름표 글 만들기
제로샷 분류는 이름표를 문장으로 감쌀 때 더 잘 맞는 경우가 많습니다. CLIP 이 학습한 글이 대개 "a photo of …" 같은 문장이었기 때문입니다.
kinds = {"머그컵": "mug", "우산": "umbrella", "배낭": "backpack"}
# 이름표를 그림 설명 문장 꼴로 감싼다. 이 글들의 임베딩과 그림 임베딩을 견준다
prompts = [f"a drawing of a {en}" for en in kinds.values()]
print(prompts)코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
kinds = {"머그컵": "mug", ...} | 한국어 종류 이름과 영어 낱말을 짝지은 사전이다 |
kinds.values() | 사전의 값(영어 낱말)만 차례로 꺼낸다 |
f"a drawing of a {en}" | f-string(formatted string, 서식 글)이다. 중괄호 자리에 낱말을 끼워 문장을 만든다 |
"a drawing of a ..." | "…을 그린 그림"이라는 뜻의 영어 문장 틀이다 |
이 코드가 뜻하는 것
옷가게 점원이 새 상품에 붙일 이름표를 "이것은 ___ 입니다" 라고 인쇄된 빈칸 카드로 만든다고 해 봅시다. 빈칸에 "모자", "장갑"을 적은 카드를 여러 장 만들어 두고, 상품을 보며 가장 맞는 카드를 고릅니다. 여기서 빈칸 카드가 "a drawing of a ..." 틀이고, 빈칸에 적는 낱말이 이름표이고, 카드 고르기가 제로샷 분류입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
kinds = {...} | 종류 셋의 한국어와 영어 이름을 적는다 | 붙일 수 있는 이름 목록 |
prompts = [...] | 영어 낱말마다 문장 틀에 끼운다 | 빈칸 카드 석 장을 채운다 |
print(prompts) | 만든 문장 셋을 보인다 | 카드를 펼쳐 본다 |
실행하면 ['a drawing of a mug', 'a drawing of a umbrella', 'a drawing of a backpack'] 이 나옵니다. 영어 문법으로는 an umbrella 가 맞지만, 이 코드는 틀의 a 를 그대로 붙여서 이렇게 나왔습니다. 이 코드는 글만 만듭니다. 이 글들의 임베딩을 그림 임베딩과 견주는 일은 실습 2에서 합니다.
주의할 점
- 제로샷 분류는 준비한 이름표 가운데에서만 고릅니다. 이름표에 없는 종류의 그림이 와도 가장 가까운 이름표를 내놓으므로, 유사도가 낮으면 "모름"으로 두는 기준을 함께 둡니다.
- 그림끼리 견주면 모양보다 색이 같은 그림이 가까울 수도 있습니다. 무엇을 "비슷하다"고 볼지는 서비스마다 다릅니다(실습 2).