Google Cloud 실습 - Vertex AI Gemini API를 사용한 멀티모달 검색 증강 생성(RAG)

 이 글은 Google Cloud Skills Boost 의 실습을 진행하고 정리한 내용입니다.

 

실습을 시작하기 전에

2021년도에 Google Cloud Study Jam 을 통해서 구글 클라우드에서 직접 실습해 보면서 스터디를 진행했었는데 그 당시에는 무료로 여러 실습을 진행할 수 있었다. 올해에도 마찬가지로 Study Jam 을 통해서 사용해 볼 수 있는 기회가 있었는데 기간 내에 신청하지 못해서 별도로 크레딧을 받아서 실습을 해보려고 한다.

 

크레딧 같은 경우는 아래와 같이 Innovators 를 구독하면 35 크레딧을 매달 무료로 준다고 해서 구독했다.

 

크레딧을 사용해서 실습해 보기

내가 하려고 하는 실습은 Vertex AI Gemini API를 사용한 멀티모달 검색 증강 생성(RAG) 라는 내용이다.

실습에 대한 내용은 아래의 사이트에서 진행할 수 있다.

 

Vertex AI Gemini API를 사용한 멀티모달 검색 증강 생성(RAG) | Google Cloud Skills Boost

이 실습에서는 Vertex AI Gemini API를 사용하여 멀티모달 검색 증강 생성(RAG)을 수행하는 방법을 알아봅니다.

www.cloudskillsboost.google

 

실습은 1시간 동안 진행할 수 있고 목표에 맞게 실습을 진행하게 된다.

 

실습에 대한 설명을 한 번 쭉 읽고 나서 실습 시작을 하게 되면 실습을 진행할 수 있다.

 

나는 크레딧을 사용해서 진행하기로 선택!

 

그러면 다음과 같이 실습을 진행할 수 있고 사용자 정보가 주어진다.

 

자 그럼 이제 실습을 시작해 보자! 실습은 우측의 순서대로 따라서 진행하면 된다.

탐색 메뉴에서 Vertex AI  에서 Workbench 를 누르게 되면 다음과 같이 하나의 인스턴스가 띄워져 있다.

여기서 Open JupyterLab 을 누르면 새 창에 실습할 수 있는 JupyterLab 이 실행된다.

바로 실행될 줄 알았는데 실행되는데 1-2분가량 소요되었다.

 

JupyterLab 이 실행되면 아래와 같이 실습을 위한 파일이 준비되어 있다.

 

rag 파일을 열어보면 다음과 같이 내용을 확인할 수 있다.

 

이제 순서대로 따라 하면 된다. 중간마다 이렇게 진행 상황을 확인할 수 있게 되어있다.

실습 내용 정리하기

실습에서 모델은 gemini-2.0-flash 를 사용해서 진행했다.

모델을 가져와서 멀티 모달에서 사용하기 위한 모델과 멀티 모달에서 사용하기 위한 모델인데 flash 가 붙었다.

이후에 어떻게 사용하는지 확인해봐야 할 것 같다.

 

모델과 파이썬 라이브러리들을 준비하고 문자와 이미지가 포함된 문서의 메타데이터를 추출해서 저장한다.

get_document_metadata라고 하는 멀티모달 유틸을 사용해서 추출하게 되는데 다음과 같이 텍스트 메타데이터와 이미지 메타데이터를 추출하게 된다.

유틸에서 사용하는 로직을 확인해보려고 했는데 1시간이라는 시간이 너무 빠듯하다 ㅠ

텍스트의 경우 pdf 파일을 가져와 페이지 번호와 텍스트 그리고 텍스트를 임베딩하고 청크로 나누어서 번호로 구분하고 청크 텍스트를 다시 임베딩을 한다.

이미지의 경우 이미지 파일을 가져와서 페이지 번호와 이미지 번호, 그리고 이미지 경로와 이미지 설명, 이미지만 임베딩한 값과 이미지 설명을 따로 임베딩하고 있다.

 

다음으로 그 밖에도 여러 목적을 가지는 유틸 함수를 가져와서 사용하고 있는 것을 확인할 수 있다.

 

이제 이렇게 준비한 데이터를 통해서 텍스트 검색과 이미지 검색을 진행해 본다.

 

텍스트 검색은 쿼리를 작성해서 쿼리와 일치하는 유사한 텍스트를 가져오는 실습을 진행했다.

입력한 쿼리를 임베딩 모델을 사용해서 임베딩을 하고 임베딩한 값과 이전에 생성한 텍스트 메타데이터와 코사인 유사도 계산을 진행한다. 그렇게 가장 유사한 데이터를 가져와서 정보를 보여준다.

 

그리고 다시 질문에 메타데이터를 통해서 가져온 데이터를 컨텍스트로 추가해서 프롬프트를 생성해서 질문하게 된다.

 

다음으로는 텍스트 쿼리를 사용해서 비슷한 이미지를 가져오는 실습을 진행했다. 문자열과 이미지 메타데이터의 코사인 유사도를 비교해서 가장 유사한 이미지를 가져와서 보여주게 되는데 문자열과 이미지가 같은지 어떻게 판단하는지 잘 이해가 되지 않았다. 이미지 내에 있는 문자열과 비교하는 걸까? 조금 더 살펴보니 이미지의 설명과 유사한 값을 찾아서 이미지를 가져오는 것처럼 보였다.

 

그렇게 이미지와 이미지 설명을 컨텍스트에 추가해서 질문에 맞게 답변을 생성하게 된다.

그다음 이미지를 입력해서 비슷한 이미지를 가져오는 과정을 실습해 봤다.

이러한 실습을 마치고 나서 멀티모달 RAG를 단계별로 실습해 보게 되었다.

먼저 쿼리를 생성한다. 그런데 질문이 하나가 아닌 여러 개의 질문으로 이루어져 있었다.

 

다음으로 쿼리와 비슷한 텍스트를 검색해서 가져오고 비슷한 이미지를 검색해서 가져온다.

 

그리고 컨텍스트에 유사한 텍스트와 이미지를 추가해 준다.

이렇게 질문과 컨텍스트를 통해서 답변을 생성한다.

 

또한 추가로 답변을 생성하기 위해 참고한 텍스트와 이미지를 확인해 본다.

 

이렇게 멀티모달 RAG 의 단계를 모두 실습해 보았다.

 

마지막으로 멀티모달을 사용하게 되면 텍스트뿐만 아니라 이미지를 참고해서 보다 나은 답변을 생성할 수 있다.

하지만 멀티모달을 사용하는데 여러 한계가 있다는 점을 유의해야 한다.

정말 신뢰성이 높은 텍스트와 이미지가 필요하고 텍스트뿐만 아니라 이미지도 처리해주어야 하기 때문에 많은 리소스가 필요하다. 그리고 일반적이지 않은 특수한 분야에서는 효과적이지 않을 수도 있다. 그리고 이러한 과정이 상당히 복잡하기 때문에 어떻게 동작하는지 이해하는데 많은 어려움을 느낄 수 있어 도입이 쉽지 않을 수 있다는 점이다.

 

 

무엇이 되었든 목적에 맞지 않는다면 그리고 이해 수준이 맞지 않는다면 사용하기 쉽지 않을 것 같다.

 

정리

한 시간가량 직접 실습해 보면서 과정에 대해서 조금이나마 이해해 보는 시간을 가졌는데 RAG에 대해서 공부하면서 느낀 점은 항상 임베딩을 통해서 유사한 데이터를 가져오는 과정에서 정말 유사한 데이터를 가져오는 것일까 하는 신뢰적인 문제가 가장 컸던 것 같고 멀티모달의 경우 정말 다양한 신뢰를 가지는 데이터를 보유하고 있을 때 시도해 보면 좋을 것 같다는 생각이 들었다.

 

1시간이라는 시간 동안 온전히 모든 것을 이해하기란 어렵기 때문에 어떻게 사용하고 동작하는지에 대해서 조금이라도 이해하기 위해서 열심히 분석해 가면서 실습을 진행해 보았다. 그래도 해보지 않은 것보다 이렇게 한 번 사용해 보는 것이 많은 도움이 되기 때문에 앞으로도 이러한 실습이나 교육들을 많이 듣고 또 들은 내용을 직접 사용해 볼 수 있는 경험이 많았으면 좋겠다.