안녕하세요.누리미디어의 AI 엔지니어입니다.
누리미디어는 DBpia AI라는 브랜드로 AI 검색, AI 아이디어, AI 뷰어 등 다양한 AI 서비스를 운영하고 있습니다.이런 다양한 AI 서비스를 한 단계 더 업그레이드시키기 위한 첫 번째 프로젝트로서 사내 검색 시스템의 근간을 단순 키워드 기반에서 의미 기반으로 전환하는 과정을 소개하겠습니다.
제목없음
제목없음
1. 왜 의미 기반 검색이 필요한가?
누리미디어의 다양한 서비스는 논문 검색에서 출발하기 때문에, AI 서비스의 근간에도 검색 시스템이 자리하고 있습니다.
하지만 AI 서비스는 지금까지의 일반적인 서비스와는 다르게 이용자의 ‘의미’를 이해하여 처리해야 할 필요성이 제기됩니다.
지난 3월, 초기 AI 검색 서비스 단계에서는 아직 의미 기반 검색 기능이 갖춰지지 않았습니다. 키워드 검색으로만 문헌을 검색할 때는 최대한 LLM에게 적합한 논문을 찾기 위해 이용자 질문에서 다양한 방식으로 키워드를 추출해 쿼리를 생성했습니다. 그러나 이 방식은 처리량의 한계가 있었을 뿐만 아니라, 의미적으로 유사한 논문을 찾아내기 어려운 정확도 문제도 존재했습니다.
이러한 한계를 극복하기 위해, 우리는 AI 서비스를 성공적으로 구현하기 위한 첫 번째 과제로 검색 시스템 고도화에 착수했습니다.
현재 가장 대중적인 방법인 벡터 검색을 논문 데이터 기반으로 어떤 점을 고려하여 어떻게 구축했는지 소개하겠습니다.
제목없음
제목없음
2. 벡터 검색이란 무엇인가?
벡터 검색이란 텍스트, 이미지 등 데이터를 고차원 벡터로 변환하여 인덱싱하고, 검색 요청도 벡터로 변환하여 가장 가까운 벡터를 찾는 검색 방식을 말합니다. 벡터 간 거리가 가까울수록 유사하다고 판단하며, 이 거리는 유클리드 거리나 코사인 유사도 같은 수학적 척도로 계산합니다
위의 이미지처럼 텍스트의 의미와 맥락이 고차원 벡터로 표현되기 때문에 검색 요청에 대해서 의미적으로 가장 유사한 문헌을 검색할 수 있습니다.
제목없음
제목없음
3. 임베딩 모델이란 무엇인가?
임베딩 모델이란? 임베딩 모델은 텍스트나 이미지 등 비정형 데이터를 수치형 벡터로 변환해 표현하는 모델입니다. 주로 오픈소스 모델이나 LLM 기업에서 제공하는 유료 API를 활용할 수 있습니다.
API 형태의 임베딩 모델을 활용하면 쉽게 활용할 수 있고 빠르게 AI 서비스를 개발할 수 있다는 점에서 장점이 있습니다. 하지만 오픈소스 모델에 비해 약간의 성능 차이가 있고, 직접적인 성능 최적화가 어렵다는 단점이 있습니다.
아래는 다양한 오픈소스 임베딩 모델과 상용 임베딩 모델에 대해 정리한 표입니다.
오픈소스 모델 종류
상용 임베딩 모델 종류
Model Size는 해당 임베딩 모델을 연산하기 위해 필요한 가중치 파라미터의 크기이며 Model data type은 해당 모델을 학습시킬 때 활용한 데이터 타입을 말합니다. Max tokens는 임베딩 모델이 한 번에 입력할 수 있는 최대 토큰값입니다. 이 값이 클수록 많은 양의 데이터를 한 번에 임베딩 벡터로 변환할 수 있습니다.
그리고 Embedding Dimension은 해당 모델이 만든 임베딩 벡터의 크기로서 차원이 높을수록 큰 크기를 가져 실제 인덱싱을 할 때 검색 비용이나 인덱스 크기 등을 고려할 때 확인해야 하는 부분입니다.
제목없음
제목없음
4. 임베딩 모델 선택
벡터 검색을 위해서 보유한 데이터에 가장 적합한 모델을 선택하고 튜닝할 필요가 있습니다.먼저 한국어에 가장 최적인 모델을 찾기 위한 평가 작업을 테스트셋을 구축하여 진행하였습니다.
보유한 논문의 분류명 12개를 기준으로 5,000개 문서의 요약 데이터를 추출하여 해당 데이터를 기준으로 삼아, GPT-4o-mini 모델로 요약을 검색하는 질문 데이터를 생성합니다. 생성한 질문과 요약을 페어로 검색 정확도 테스트셋을 구축하여 평가는 Top-k Accuracy로 진행합니다.
아래는 실제 평가한 결과를 100분위 점수로 환산한 결과입니다.
bge-m3와 snowflake-arctic-embed-l 모델이 가장 좋은 성능을 보여주었습니다. 여기서 bge-m3의 경우 모델의 특성상 Dense vector, sparse vector, Multi Vector와 같은 다양한 유형을 선택하여 모델의 성능을 좀 더 세밀하게 조절할 수 있습니다.
이번 목표는 의미 기반 검색 시스템의 구축과 앞으로의 확장성만을 고려하였기 때문에 모델의 파인튜닝과 같은 후속 작업은 다루지 않겠습니다.
제목없음
제목없음
5. 벡터 검색 인덱스 구축
ElasticSearch 9
대상 규모 : 약 300만 건
Index : HNSW
data type : int8
벡터 검색을 수행할 수 있는 검색 엔진으로 다양한 벡터 DB를 활용할 수 있는데 Qdrant, Milvus 등이 있습니다. 이들을 사용하면 임베딩 모델이 생성한 벡터값을 인덱스에 저장하여 이용자의 쿼리를 임베딩 벡터로 연산하여 의미적으로 가장 유사한 검색 결과를 리턴합니다.
이 중에서 엘라스틱서치를 활용하였는데 단순히 벡터 검색을 위한 용도가 아닌 다양한 검색을 수행하기 종합적인 판단에서 엘라스틱서치에 벡터 인덱스를 구축하는 방향으로 정해졌습니다.
그렇다면 벡터 인덱스를 정할 때, 어떤 데이터를 어떻게 넣어야 할지 고려할 차례입니다. 전체 데이터 크기가 약 300만 건의 논문 데이터이기 때문에 검색 속도와 인덱스의 용량을 논의해야 합니다.
먼저 가장 중요한 검색 속도를 위해서 HNSW(Hierarchical Navigable Small Worlds) 알고리즘을 활용하여 임베딩 벡터 데이터를 인덱싱합니다. 일반 벡터 DB는 디폴트값이 Flatten 구조로 되어 있는 경우가 있어 300만 건의 대용량 데이터를 처리한다면 많은 검색 시간이 소요될 수밖에 없습니다. 그래서 벡터를 클러스터링 하듯이 그래프 구조로 인덱싱하여 검색 속도를 향상시키는 HNSW 알고리즘이 효과적입니다.
또한, 임베딩 벡터값 int8로 변환한 것은 검색 속도와 연산 효율화를 위해서입니다.
기존 float16 혹은 float32로 임베딩 벡터값을 연산하면 CPU에서는 연산효율이 낮기 때문에, int로 바꿔 검색 속도를 최적화합니다.
제목없음
제목없음
6. 임베딩 모델 서빙
이제 임베딩 모델의 선정과 벡터 인덱스 구축이 완료되었습니다.
그렇다면 실제 서비스에서 활용하기 위해서는 이용자의 질문도 벡터로 변환시켜 줘야 합니다.
이를 위해서 이제 임베딩 모델을 서비스에 서빙(Serving) 즉 추론(Inference)을 해야 하는데 빠른 처리를 위해서 어느 정도 컴퓨팅 스펙이 마련되어야 실제 서비스에서 활용할 수 있는지를 확인하기 위해, 모델의 초당 처리 속도를 측정했습니다.
동일한 조건을 위해서 모델은 BGE-m3를 활용하였고 16bit ONNX 포맷으로 변환하였습니다. 2, 4, 8 코어로 코어 수를 늘릴수록 1초당 처리량이 약 2배씩 늘어나지만 초당 15개 처리는 사내 검색 시스템으로서 서비스하기에는 너무 낮은 성능이었습니다.
결국 AWS에서 GPU 인스턴스를 빌려서 A10G에서 테스트해 본 결과 바로 RPS가 8코어 대비 약 3배가량 증가하였습니다.
심지어 GPU는 별도의 VRAM에서 모델을 실행하기 때문에, API 서버 기능과 분리된 상태로 컴퓨팅 자원을 활용할 수 있어 훨씬 효율적으로 운영됩니다.
AWS에서 GPU를 활용한다면 CPU 8코어에 비해서 확실히 비싼 가격을 가집니다.
LLM의 시대로 오면서 거의 볼 일이 없게 된 T4 모델도 저렴한 가격은 아닌 편이죠.
사실 AI 엔지니어 입장에서 아무리 작은 모델이어도 500M 사이즈의 모델을 양자화 없이 CPU로 서비스하는 건 불가능한데? 라고, 당연하게 생각할 수 있을 겁니다. 하지만 이론적으로 설명하는 것이 아닌 실제로 증명하여 GPU 활용의 당위성을 얻어내기 위해서는 이런 작업이 필수적이라고 볼 수 있습니다.
최종적으로는 g4dn.xlarge 인스턴스를 활용해서 벡터 검색 API 서버를 개발하였습니다!
제목없음
제목없음
여기서 소개하지는 않았지만, FastAPI 기반으로 API 서버도 구현하고 임베딩 모델을 서비스 레벨로 활용하는 Infinity Embedding 라이브러리도 활용하면 위와 같이 스웨거에서 의미 기반 검색인 벡터 검색을 확인해 볼 수 있습니다.
query에 맞춰 스코어 점수가 나오며 가장 유사한 검색 문헌이 순서대로 검색됩니다!심지어 검색 속도도 아주 빨라 0.08초밖에 걸리지 않는 모습이 나옵니다.
제목없음
제목없음
누리미디어에서 AI 서비스는 이제 막 걸음마를 떼고 있는 상황이라고 볼 수 있습니다.단순히 상용 API만을 활용한 의존적인 AI 서비스가 아니라, 자체 GPU 활용과 모델 서빙을 통해 독립적으로 작동하는 시스템을 구축했습니다.이에 맞는 인프라를 직접 마련했다는 점에서, 이번 벡터 검색 프로젝트는 매우 의미 있는 시도였습니다.
앞으로는 임베딩 모델의 Fine-tuning과 더 나아가 논문 특화 임베딩 모델의 Pre-training까지 고려하고 있으며 좀 더 정확한 검색을 위한 Re-ranking 모델과 CLIP모델과 같은 멀티모달을 고려한 다양한 검색 시스템까지 고려하고 있습니다.
앞으로도 정확도가 높고 신뢰할 수 있는, 누리미디어만의 AI 서비스를 기대해 주세요!