멀티모달 RAG(Multi-modal Retrieval-Augmented Generation): 다양한 형태의 데이터 처리 방식

calico·2025년 10월 27일

Artificial Intelligence

목록 보기
83/161

1. 멀티모달 RAG에서 비텍스트 데이터 유형별 처리 방식


각 데이터의 구조·정보 표현 방식이 다르기 때문에, 텍스트로 변환하는 과정과 사용하는 모델이 달라집니다.

데이터 유형주요 처리 단계사용 기술/모델특징 & 주의사항
이미지(Image)추출 → 크기 조정 → Base64 인코딩 → 멀티모달 LLM 요약pdf2image, OpenCV, Claude 3, GPT-4V, Gemini시각적 요소(사진, 그림, 차트) 해석. 토큰 비용 관리 필요
표(Table)추출 → 구조화(OCR 또는 HTML 변환) → LLM 요약Camelot, Tabula, Table Transformer, OCR+LLM숫자·항목 관계 유지 중요. OCR 오류 보정 필요
그래프/차트(Graph)이미지 추출 → LLM 해석(축, 데이터 포인트, 추세)Matplotlib 캡처, OpenCV, 멀티모달 LLM데이터 추세·비교 설명. 시각적 패턴 인식 필요
도면/지도(Diagram/Map)이미지 추출 → 객체·레이아웃 인식 → LLM 설명YOLO, Detectron2, 멀티모달 LLM위치·관계 정보 보존 필요
오디오(Audio)음성 추출 → STT(Speech-to-Text) → 텍스트 요약Whisper, AWS Transcribe, Google STT발음·잡음 처리 필요. 언어별 모델 선택 중요
영상(Video)프레임 추출 → 이미지 처리 + 자막 분석 → 요약ffmpeg, OpenCV, STT, 멀티모달 LLM장면 선택·샘플링 전략 필요. 대용량 처리 시 병렬화 필수



2. 왜 처리 방식이 다른가?

  • 데이터 구조 차이

    • 이미지: 픽셀 기반 → 시각적 패턴 인식 필요

    • 표: 행·열 구조 → 구조화된 텍스트 변환 필요

    • 오디오: 시간축 + 음성 → 음성 인식(STT) 필요

    • 영상: 시간축 + 시각 정보 → 프레임 샘플링 + 이미지 처리 필요

  • 모델 입력 형식 차이

    • 이미지: Base64 또는 URL

    • 오디오: WAV/MP3 → 텍스트 변환

    • 표: CSV/HTML 또는 이미지 → 텍스트 변환

  • 정보 손실 위험

    • 표·그래프는 단순 이미지 요약 시 수치 정확도 손실 가능 → OCR(Optical Character Recognition) 병행 필요

      OCR(광학 문자 인식)은 이미지나 스캔 문서에서 문자 영역을 인식하고 텍스트로 변환하는 기술입니다.

      • 즉, 비텍스트 데이터 → 텍스트 데이터로 바꾸는 핵심 전처리 과정입니다. 참고
    • 오디오·영상은 요약 과정에서 맥락 손실 가능 → 타임스탬프 메타데이터 유지



3. 공통 처리 흐름 (멀티모달 RAG 관점)


모든 비텍스트 데이터는 텍스트로 변환 → 임베딩 → Vector DB 저장이라는 공통 흐름을 가집니다.


[비텍스트 데이터]
   ↓ (유형별 추출/변환)
[텍스트 설명/요약 생성]
   ↓ (임베딩 변환)
[Vector DB 저장]



4. 유형별 처리 예시


이미지


# 이미지 → Base64 → LLM 요약
img_base64 = image_to_base64("chart.png")
summary = multimodal_llm(img_base64, prompt="이미지 내용을 설명하세요.")



# PDF 표 → CSV → LLM 요약
table_df = camelot.read_pdf("report.pdf").df
summary = llm(f"다음 표를 요약하세요:\n{table_df.to_string()}")

오디오

# 오디오 → STT → LLM 요약
text_transcript = whisper_model.transcribe("meeting.mp3")
summary = llm(f"다음 회의록을 요약하세요:\n{text_transcript}")

영상

# 영상 → 프레임 추출 → 이미지 처리 + 자막 분석
frames = extract_frames("training.mp4", interval=5)
for frame in frames:
    frame_summary = multimodal_llm(frame, prompt="장면 설명")



5. 멀티모달 RAG에서 이미지 처리

이미지 처리의 핵심 목적은 다음과 같습니다.


  1. 검색 가능하게 변환

    • 대부분의 Vector DB는 텍스트 임베딩을 사용 → 이미지 내용을 텍스트로 변환 필요.
  2. 이미지 기반 질문 대응

    • 예: "이 그림에 나와 있는 안전 수칙은?" → 이미지 설명 텍스트로 변환 후 검색.
  3. 시각 자료 의미 보존

    • 단순 OCR보다 LLM 기반 요약이 의미 전달에 유리.



이미지 처리 전체 흐름


  • 이미지 자체를 벡터로 저장하는 것이 아니라 LLM이 해석한 텍스트 요약을 벡터로 변환해 저장.

  • 원본 이미지는 메타데이터로 보관

    • 필요 시 재처리 가능.
  • 검색 시: 질문 → 임베딩 → Vector DB 검색 → 관련 텍스트 반환
    → LLM 답변 생성.

[원본 문서(PDF, Word, HTML, 이미지)]
   ↓ (파서: Unstructured.io, pdf2image, PyMuPDF 등)
[이미지 추출]
   ↓ (좌표 Crop, 필요 시 Resize)
[Base64 인코딩]
   ↓ (멀티모달 LLM: Claude, GPT-4V, Gemini 등)
[이미지 내용 → 텍스트 요약]
   ↓ (텍스트 임베딩: OpenAI, Amazon Titan, HuggingFace 등)
[Vector DB 저장: OpenSearch, Pinecone, Weaviate 등]



단계별 구현 방법


Step 1: 이미지 추출


from pdf2image import convert_from_path
import cv2

pages = convert_from_path("sample.pdf")
for i, page in enumerate(pages):
    page.save(f"tmp/{i+1}.jpg", "JPEG")

# 좌표 기반 Crop
img = cv2.imread("tmp/1.jpg")
crop_img = img[y1:y2, x1:x2]
cv2.imwrite("images/table-1.jpg", crop_img)



Step 2: 이미지 크기 조정


Claude 3 기준 토큰 계산:

Image tokens=width(px)×height(px)750\text{Image tokens} = \frac{\text{width(px)} \times \text{height(px)}}{750}
if image_token > 1500:
    resize_img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
    cv2.imwrite("images/table-1-resize.jpg", resize_img)



Step 3: Base64 인코딩


import base64

def image_to_base64(path):
    with open(path, "rb") as f:
        return base64.b64encode(f.read()).decode('utf-8')

img_base64 = image_to_base64("images/table-1-resize.jpg")



Step 4: 이미지 → 텍스트 요약


human_prompt = [
    {"type": "image_url", "image_url": {"url": "data:image/png;base64," + img_base64}},
    {"type": "text", "text": "이미지를 보고 간결하게 요약하세요. 한국어로 작성."}
]
summary = summarize_chain.invoke({"image_base64": img_base64})

예시 결과

"이 이미지는 여름철 폭염 대비 건강 수칙을 안내하고 있습니다. 물 자주 마시기, 시원하게 지내기, 더운 시간대 휴식하기 등 3가지 수칙이 포함되어 있습니다."



Step 5: 텍스트 임베딩 변환


from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
vector = embeddings.embed_query(summary)



Step 6: Vector DB 저장


from langchain.vectorstores import Pinecone

vector_db.add_documents([
    {
        "page_content": summary,
        "metadata": {
            "type": "image",
            "image_base64": img_base64
        }
    }
])



장점 & 주의사항


장점


  • 기존 텍스트 임베딩 모델 그대로 사용 가능.

  • 이미지·표 기반 질문에도 대응 가능.

  • 메타데이터로 원본 이미지 보관 → 재검증 가능.



주의사항


  • LLM 이미지 해석 정확도에 따라 검색 품질 좌우.

  • 이미지 크기 관리(토큰 비용 절감) 필요.

  • 대량 이미지 처리 시 병렬화·캐싱 전략 필요.



profile
https://velog.io/@corone_hi/posts

0개의 댓글