VLM 이미지 캡셔닝
RAG는 기본적으로 이미지 데이터를 다루지 않는다. 하지만 RAG 구축을 위한 문서 데이터에서 이미지는 꽤 중요한 역할을 할 수 있다.
인공지능에서 텍스트와 이미지를 함께 다루는것을 '멀티모달' 이라고 부르는데, 일부 멀티모달 임베딩 모델은 이미지를 텍스트처럼 벡터로 만들어 한 공간에 매핑될 수 있게 한다. 그래서 텍스트로 검색하면 그 내용과 유사한 이미지를 찾을 수 있다.
하지만 이 방식은 이미지 분류에 가깝다. 예를 들어 PDF에 도표나 차트 이미지가 있다면, 멀티모달 임베딩 모델은 단순히 '도표 또는 차트'로 분류할 뿐이지 어떤 시리즈들이 있으며, 어느 곡선이 얼마나 가파르게 증가하는지와 같은 '그래프 분석'은 이루어지지 않는다.
그래서 이미지에 대한 해석을 RAG 지식에 포함시키는 방법으로는 VLM을 사용해 캡션을 만들어내야 한다. 이를 위해 비전 기능이 있는 LLM(VLM)을 사용해 이미지를 입력으로 주고 해석을 만들어내도록 프롬프팅하여 파이프라인을 구축하였다.

VLM 품질 테스트
본격적으로 파이프라인을 구축하기 전, Ollama에서 바로 설치할 수 있는 여러 무료 VLM 중 어느 모델이 가장 정확하게 이미지를 분석할 수 있는지 확인하는 과정을 거쳤다. 간단한 대답조차 못하는 llama 계열과 같은 모델들을 제외하고, 써볼만 하다고 생각되는 4개 모델로 추린 다음, 하나의 그래프 이미지로 VLM 분석 결과를 비교해보았다.
프롬프트로 요구한것은 다른 두 곡선의 증가 추이가 어떻게 다른지에 대한 분석 내용이였다. 초록색 선과 빨간색 선이 각각 다른 시리즈임을 인지하고, 초록색 선이 빨간색 선에 비해 상대적으로 급격히 증가한다는 분석 결과만 나와주기를 기대하였다.

gemma3, qwen-2.5와 3.5, ministral-3 총 4가지를 비교해본 결과 ministral-3이 압도적으로 우수한 분석 결과를 내놓았다. 다른 모델들과 비교가 어려울만큼 상세하고 정확하게 분석했는데, 여러번 테스트해도 거의 같은 답변을 내놓을만큼 품질 역시 매우 일관적이라 서비스하기에도 적절해보였다.
이후 알아본 바로는 ministral-3는 메타에서 분리된 스타트업 미스트랄AI(Mistral AI)가 개발한 오픈 소스 모델이라고 한다.
자세한 비교 내용을 기술한 파일은 아래 링크에서 다운로드할 수 있다.
VLMtest.xlsxDocling 이미지 추출 및 컨텍스트 윈도잉
VLM이 이미지를 분석하고 나면 그 내용은 전부 벡터로 임베딩하여 RAG에 반영해야 한다. 하지만 이미지 분석 내용만 딱 잘라 임베딩한다면 문서에서 이미지 원래 위치에서의 문맥과 단절될 수 있다.
그렇게 되면 VLM 만든 이미지 캡션은 문서 내용와 별개인 이미지 분석 내용에 불과하게 되고, 그것이 문서와 어떤 연관이 있는지는 검색시 반영되지 않을 수 있다.
정석대로라면 VLM이 생성한 캡션 내용을 원래 이미지 위치에 되돌려놓아야 문맥이 적절하게 형성된다. 그러나 VLM 캡션 생성이 상당히 오래걸리는 작업이라 PDF 추출 로직과 비동기적으로 따로 처리해야 하기에 문서를 재구성하는것은 어려움이 있고, 되돌려놓는다 하더라도 문서 전체 내용을 다시 임베딩해야 하므로 비효율적일 수 있다.
그래서 비동기적인 파이프라인 내에서 본문의 문맥을 VLM 캡션에 반영할 방법을 고안했는데, VLM에 전달할 이미지를 추출할 때 앞, 뒤로 내용 몇 문장을 발췌한 다음 VLM 캡션이 완성되고 나면 그 내용의 양쪽에 본문 일부를 덧붙여 함께 임베딩하는 것이다. 제미나이는 이것을 '컨텍스트 윙도잉' 기법이라고 했다.
바로 이 부분이다.

캡션 생성 파이프라인
아래는 Docling을 구현한 클래스에서 이미지들을 추출해 저장하고 컨텍스트(앞, 뒤 본문 일부 내용)들을 반환하는 메소드이다.
이미지 저장과 함께 컨텍스트들 역시 각 이미지에 대한 DB에 저장된다. VLM 캡션이 완성되면 DB에서 문맥을 다시 조회하여 캡션과 결합되고 임베딩되어 RAG를 업데이트한다.
프롬프팅
이미지의 형태는 다양하다. 그래프, 표, 구조도, 해부도, 플로우차트 등 논문을 뒷받침하는 다양한 형태의 시각자료를 VLM이 해석하고 일관된 형식의 분석 결과를 내놓아야 지속적인 RAG를 운영할 수 있다. 따라서 가장 일반화되고 명확한 프롬프트가 필요했다.
아래는 이미지 캡션 생성 시 VLM에 전달하는 프롬프트 전문이다.
정확도를 위해 영어로 프롬프트를 전달한다. 한국어로 해석한 버전은 아래와 같다.