LLM 엔지니어링12장 · 멀티모달 RAG 와 데이터셋 자동 생성8 / 22← 이전목차다음 →MetaContents

12장. 멀티모달 RAG 와 데이터셋 자동 생성

멀티모달 RAG 의 짜임

은행 창구에서 서류를 내면, 직원은 신분증 사진과 서류의 표를 함께 보고 처리합니다. 멀티모달 RAG 도 질문을 받아 그림과 글과 표에서 근거를 찾고, 찾은 근거를 LLM 에 보여 답합니다.

질문을 받아, 그림 설명이 붙은 조각을 검색하고, 조각 세 개를 자료로 붙여, LLM 이 답하고, 출처를 다는 다섯 단계 흐름도

1번에서 "빨간 머그컵 값"처럼 그림의 정보가 섞인 질문을 받습니다. 2번에서 그림 설명이 붙은 조각을 글 임베딩으로 찾습니다. 3번에서 찾은 조각 셋을 [자료]로 붙이고, 4번에서 로컬 LLM 이 답을 쓰고, 5번에서 상품 코드를 출처로 답니다. 이 장은 그림을 설명 글로 바꾸는 길을 썼으므로 2번부터는 6장의 RAG 와 같습니다. 여기서 신분증 사진과 서류의 표가 조각의 그림 설명과 표의 행입니다.

멀티모달 RAG 를 짜는 세 가지 길

길검색답하는 모델이 장에서
그림을 글로 바꾸기글 검색 하나글 LLM실습 4에서 쓴다
따로 찾아 합치기글 검색 + CLIP 그림 검색, 결과를 섞는다글 LLM실습 4에서 CLIP 검색만 견준다
그림을 그대로 보여 주기그림 검색비전 LLM 에 찾은 그림을 넣는다다루지 않는다(느리다)

조각 하나 꾸리기

Python
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개뿐인 작은 시험입니다. 서비스에 쓰려면 실제 고객 질문으로 더 큰 시험 묶음을 만듭니다.
← 이전 절12장 · 그림과 표가 섞인 문서다음 절 →12장 · 데이터 기반 LLM 파인튜닝