12장. 멀티모달 RAG 와 데이터셋 자동 생성
멀티모달 RAG 의 짜임
은행 창구에서 서류를 내면, 직원은 신분증 사진과 서류의 표를 함께 보고 처리합니다. 멀티모달 RAG 도 질문을 받아 그림과 글과 표에서 근거를 찾고, 찾은 근거를 LLM 에 보여 답합니다.
1번에서 "빨간 머그컵 값"처럼 그림의 정보가 섞인 질문을 받습니다. 2번에서 그림 설명이 붙은 조각을 글 임베딩으로 찾습니다. 3번에서 찾은 조각 셋을 [자료]로 붙이고, 4번에서 로컬 LLM 이 답을 쓰고, 5번에서 상품 코드를 출처로 답니다. 이 장은 그림을 설명 글로 바꾸는 길을 썼으므로 2번부터는 6장의 RAG 와 같습니다. 여기서 신분증 사진과 서류의 표가 조각의 그림 설명과 표의 행입니다.
멀티모달 RAG 를 짜는 세 가지 길
| 길 | 검색 | 답하는 모델 | 이 장에서 |
|---|---|---|---|
| 그림을 글로 바꾸기 | 글 검색 하나 | 글 LLM | 실습 4에서 쓴다 |
| 따로 찾아 합치기 | 글 검색 + CLIP 그림 검색, 결과를 섞는다 | 글 LLM | 실습 4에서 CLIP 검색만 견준다 |
| 그림을 그대로 보여 주기 | 그림 검색 | 비전 LLM 에 찾은 그림을 넣는다 | 다루지 않는다(느리다) |
조각 하나 꾸리기
row = {"코드": "P01", "이름": "데일리 머그 1호", "가격": "9,900원", "용량": "350ml"}
caption = "그림 속 물건은 노란색 머그컵입니다." # 설명용으로 적은 글(비전 모델의 실제 출력이 아니다)
# 그림 설명과 표의 행을 한 조각 글로 묶는다. 코드는 출처로 남긴다
text = f"[머그컵] {row['이름']}({row['코드']}): 가격 {row['가격']}, 용량 {row['용량']}. 그림: {caption}"
print(text)코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
row = {"코드": "P01", ...} | 표의 행 하나를 칸 이름과 값의 사전으로 적었다 |
row['이름'] | 사전에서 "이름" 칸의 값을 꺼낸다 |
caption = "..." | 비전 모델이 만들었다고 치고 적은 설명용 그림 설명이다 |
f"[머그컵] {row['이름']}({row['코드']}): ..." | 종류, 이름, 코드, 값, 그림 설명을 한 줄 글로 끼워 넣는다 |
이 코드가 뜻하는 것
택배 상자에 붙이는 송장 한 장에는 받는 사람, 물건 이름, 송장 번호가 함께 적혀 있습니다. 송장만 보면 상자 안을 열지 않아도 무엇인지 알 수 있고, 송장 번호로 어디서 왔는지 되짚을 수 있습니다. 여기서 송장 한 장이 조각 하나, 송장에 적은 내용이 표의 행과 그림 설명, 송장 번호가 출처로 남기는 상품 코드입니다. 다만 송장은 사람이 읽지만, 조각은 임베딩으로 바뀌어 검색에 쓰인다는 점이 다릅니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
row = {...} | 표의 행 하나를 준비한다 | 물건의 값과 용량 |
caption = "..." | 그림 설명 글을 준비한다 | 물건의 생김새 |
text = f"..." | 둘을 한 조각 글로 묶고 코드를 괄호에 넣는다 | 송장 한 장에 모두 적는다 |
print(text) | 묶은 조각을 보인다 | 송장을 읽어 본다 |
실행하면 [머그컵] 데일리 머그 1호(P01): 가격 9,900원, 용량 350ml. 그림: 그림 속 물건은 노란색 머그컵입니다. 가 나옵니다. 이름에는 없던 색 "노란색"이 조각 글에 들어갔으므로, 색으로 묻는 질문도 글 검색으로 이 조각을 찾을 수 있게 됩니다.
주의할 점
- 그림 설명을 붙인 조각은 설명이 틀리면 엉뚱한 질문에 걸립니다. 그림 설명이 섞인 답에는 "그림 설명을 바탕으로 한 답"임을 알 수 있게 출처를 남깁니다.
- 실습 4는 질문이 12개뿐인 작은 시험입니다. 서비스에 쓰려면 실제 고객 질문으로 더 큰 시험 묶음을 만듭니다.