각 데이터의 구조·정보 표현 방식이 다르기 때문에, 텍스트로 변환하는 과정과 사용하는 모델이 달라집니다.
| 데이터 유형 | 주요 처리 단계 | 사용 기술/모델 | 특징 & 주의사항 |
|---|---|---|---|
| 이미지(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 | 장면 선택·샘플링 전략 필요. 대용량 처리 시 병렬화 필수 |
데이터 구조 차이
이미지: 픽셀 기반 → 시각적 패턴 인식 필요
표: 행·열 구조 → 구조화된 텍스트 변환 필요
오디오: 시간축 + 음성 → 음성 인식(STT) 필요
영상: 시간축 + 시각 정보 → 프레임 샘플링 + 이미지 처리 필요
모델 입력 형식 차이
이미지: Base64 또는 URL
오디오: WAV/MP3 → 텍스트 변환
표: CSV/HTML 또는 이미지 → 텍스트 변환
정보 손실 위험
표·그래프는 단순 이미지 요약 시 수치 정확도 손실 가능 → OCR(Optical Character Recognition) 병행 필요
OCR(광학 문자 인식)은 이미지나 스캔 문서에서 문자 영역을 인식하고 텍스트로 변환하는 기술입니다.
- 즉, 비텍스트 데이터 → 텍스트 데이터로 바꾸는 핵심 전처리 과정입니다. 참고
오디오·영상은 요약 과정에서 맥락 손실 가능 → 타임스탬프 메타데이터 유지
모든 비텍스트 데이터는 텍스트로 변환 → 임베딩 → Vector DB 저장이라는 공통 흐름을 가집니다.
[비텍스트 데이터]
↓ (유형별 추출/변환)
[텍스트 설명/요약 생성]
↓ (임베딩 변환)
[Vector DB 저장]
# 이미지 → 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="장면 설명")
이미지 처리의 핵심 목적은 다음과 같습니다.
검색 가능하게 변환
이미지 기반 질문 대응
시각 자료 의미 보존
이미지 자체를 벡터로 저장하는 것이 아니라 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 등]
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)
Claude 3 기준 토큰 계산:
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)
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")
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가지 수칙이 포함되어 있습니다."
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
vector = embeddings.embed_query(summary)
from langchain.vectorstores import Pinecone
vector_db.add_documents([
{
"page_content": summary,
"metadata": {
"type": "image",
"image_base64": img_base64
}
}
])
기존 텍스트 임베딩 모델 그대로 사용 가능.
이미지·표 기반 질문에도 대응 가능.
메타데이터로 원본 이미지 보관 → 재검증 가능.
LLM 이미지 해석 정확도에 따라 검색 품질 좌우.
이미지 크기 관리(토큰 비용 절감) 필요.
대량 이미지 처리 시 병렬화·캐싱 전략 필요.