콘텐츠로 이동하기
AI 및 머신러닝

STS 및 Retrieval 사용 사례에 한국어 임베딩 모델 활용하기

2024년 4월 11일
David (Taebeom) Kim

AI Consultant

Grace Yang

Technical Account Manager

개요

임베딩 모델은 입력된 텍스트를 벡터 표현 (Vector Representation) 으로 변환함으로써 텍스트의 내재된 의미를 벡터 형태로 나타낼 수 있습니다. 임베딩 모델에서 출력된 벡터 좌표는 거리에 따라 의미론적 유사성을 나타내므로, 텍스트의 의미를 비교하거나 분류하는 Task 에 임베딩 모델을 활용하는 것이 좋은 옵션이 될 수 있습니다. 

대표적으로 문장의 유사성을 비교하는 Semantic Textual Similarity (STS), 유사한 텍스트를 분류하는 Classification, 입력된 질의에 따라 연관된 문서를 맵핑하는 Retrieval 과 같은 Task 에 임베딩 모델을 활용할 수 있습니다. 

이렇게 문장의 유사도를 활용하는 Task 는 엔터프라이즈의 다양한 LLM 아키텍처에서 중요한 구성요소가 됩니다. 본 포스팅에서는 한국어 데이터를 활용한 다양한 사용 사례, 그 중에서도 문장의 유사성을 비교하거나 분류, 맵핑하는 특정 Task 들에 임베딩 모델이 어떻게 활용될 수 있을지 알아보겠습니다. 

먼저, 간단한 실험을 통해 한국어 사용 사례에 고려할 수 있는 임베딩 모델들이 STS Task 에 어느 정도의 성능을 보이는지 알아보고, 임베딩 모델이 Retrieval 사용 사례에 어떻게 고도화되어 활용될 수 있는지 알아봅니다.

의미론적 텍스트 유사성(STS)에 대한 임베딩 모델 평가 실험

먼저, 간단한 한국어 STS Task 에 대해 최근 출시된 구글의 Embeddings for Text (multilingual) 모델을 비롯해 오픈된 몇 개의 임베딩 모델을 평가하는 실험을 해봅니다. 
(Remark: 모델의 성능을 측정하는 벤치 마크는 아니며, 제한된 STS 데이터셋으로 임베딩 모델의 평가 지표를 확인해보는 과정입니다.)

Dataset

STS 평가를 위해 이미 라벨링 된 오픈 데이터셋인 KorNLU STS Test Dataset 을 사용했습니다. 데이터 오염 (Data Contamination) 을 방지하기 위해, 실험 대상 모델은 학습 과정에서 사용된 데이터에 KorNLU STS Test Dataset 이 포함되지 않은 모델들로 선정하였습니다. 

STS Test Dataset 은 문장의 유사성을 비교할 수 있는 문장의 쌍 (sentence1, sentence2) 과 두 문장 간의 유사도에 대한 점수 (score) 라벨로 구성되어 있으며, score 값은 이후 평가 과정에서 라벨로 활용합니다.

[표1] KoNLU STS Test Dataset 예시

sentence1 sentence2 score
한 소녀가 머리를 스타일링하고 있다. 한 소녀가 머리를 빗고 있다. 2.5
한 무리의 남자들이 해변에서 축구를 한다. 한 무리의 소년들이 해변에서 축구를 하고 있다. 3.60
한 여성이 다른 여성의 발목을 재고 있다. 한 여자는 다른 여자의 발목을 측정한다. 5.0

Evaluating models

대상 모델은 한국어를 포함해 다국어를 지원하는 임베딩 모델들을 우선적으로 선정하였습니다. 다국어를 지원하는 구글의 인코더 모델인 Universal Sentence Encoder 와 구글 클라우드에서 2023년 11월에 출시된 다국어 지원 텍스트 임베딩 모델 (textembedding-gecko-multilingual@001), 2024년 4월에 Preview 로 출시된 텍스트 임베딩 모델 (text-multilingual-embedding-preview-0409) 그리고 sentence-transformers (stsb-xlm-r-multilingual)모델을 선정했습니다.

다국어 지원 지원 모델이 많지 않은 관계로, 다국어를 학습하지 않은 임베딩모델들 (textembedding-gecko@001) 과 함께 한국어에 사전학습된 Pre-trained 모델(KLUE BERT base, KLUE RoBERTa base)도 비교군으로 함께 실험 했습니다.

[표2] STS 평가 실험 대상 임베딩 모델

모델명 모델 설명
Universal Sentence Encoder 텍스트를 텍스트 분류, 의미 유사성, 클러스터링 및 기타 자연어 작업에 사용할 수 있는 고차원 벡터로 인코딩하는 구글의 오픈 모델 (Multilingual) 
Embeddings for Text - 2023년 출시 버전(textembedding-gecko-multilingual@001) 구글 클라우드의 다국어 지원 텍스트 임베딩 모델 (Multilingual)
Embeddings for Text - 2024년 Preview 버전
(text-multilingual-embedding-preview-0409)
구글 클라우드의 다국어 지원 텍스트 임베딩 모델 (Multilingual)
sentence-transformers/stsb-xlm-r-multilingual 문장, 문단을 벡터 공간으로 변환하며 클러스터링 및 semantic 검색에 활용될 수 있는 Sentence Transformer 모델 (Multilingual)
Embeddings for Text
(textembedding-gecko@001)
구글의 텍스트 임베딩 모델 (textembedding-gecko) 중 2023년 6월 출시 버전 (English)
KLUE BERT base 한국어에 사전학습된 BERT 모델 (Korean)
KLUE ROBERTa Base 한국어에 사전학습된 RoBERTa 모델 (Korean)

Evaluation Method

주어진 두개 문장에 대해 임베딩된 벡터로 계산한 Cosine similarity 값을 기준으로, 데이터셋 라벨과의 피어슨 상관 계수 (Pearson correlation coefficient) 및 스피어만 상관 계수 (Spearman correlation coefficient) 값을 계산하여 모델 별로 비교합니다. 피어슨 상관계수와 스피어만 상관 계수 모두 값이 높을 수록 주어진 두 문장의 유사도에 대한 임베딩 성능이 높은 것으로 간주합니다.

로드 중...

Evaluation Results

주어진 한국어 STS 테스트 데이터셋에 대해 실험한 결과, 예상대로 한국어를 포함한 다국어 데이터에 학습된 것으로 명시된 네 개의 모델이 (Universal Sentence Encoder, textembedding-gecko-multilingual@001, text-multilingual-embedding-preview-0409, sentence-transformers/stsb-xlm-r-multilingual) 다른 모델들 대비 두 문장 간 의미론적 유사성 추론에 대한 정확도가 높았습니다. 

네 개의 한국어 지원 임베딩 모델 중에서는 최근에 Preview 로 출시된 text-multilingual-embedding-preview-0409 모델이 가장 높은 성능을 보였습니다.

[표3] 임베딩 모델의 STS 평가 결과 (VM Type : E2 머신 사용 - 16 vCPUs, 128 GB RAM, 1376 개의 문장 임베딩)

  Pearson correlation coefficient Spearman correlation coefficient
Universal-sentence-encoder 0.737 0.726
textembedding-gecko@001 0.027 0.034
textembedding-gecko-multilingual@001 0.759 0.751
text-multilingual-embedding-preview-0409 0.793 0.789
sentence-transformers/stsb-xlm-r-multilingual 0.770 0.780
KLUE Bert Base 0.486 0.481
KLUE Roberta Base 0.509 0.519

높은 성능을 보인 네 개의 모델 중 Embeddings for Text (textembedding-gecko-multilingual@001, text-multilingual-embedding-preview-0409) 두 모델은 구글 클라우드에서 관리형 서비스로 제공하는 모델이며, 다른 두 개의 모델은 사용자가 직접 관리하며 사용하는 오픈 모델입니다. 저희는 이번 포스트에서 엔터프라이즈 아키텍처에서의 여러 사용 사례를 주로 살펴볼 예정이므로, 관리형 서비스인 구글 클라우드의 Embeddings for Text(textembedding-gecko-multilingual@001) 을 사용할 예정입니다. (2024년 4월 현재 기준 GA 된 001 다국어 버전을 사용했습니다.)

무엇보다 Embeddings for Text 모델은 구글 클라우드 내에서 다양한 서비스와의 연계가 유용하다는 큰 장점이 있습니다. 아래의 이미지와 같이 구글 클라우드의 Vertex AI Pipelines와 연계하여 튜닝 워크플로우를 파이프라인으로 손쉽게 구성할 수 있는데, NDCG (Normalized Discounted Cumulated Gain) Metric 에 따른 평가를 자동으로 수행하고 생성된 모델을 관리할 수 있도록 Model Registry 에 배포할 수 있습니다. 또한 학습 데이터/테스트 데이터 분리(split)를 자동화하거나 모델 튜닝에 사용될 데이터셋의 query, corpus를 정의하는 과정을 손쉽게 구성할 수 있습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/unnamed_8_ctCO0pq.max-600x600.png

[그림1] Vertex AI Pipelines 를 활용한 텍스트 임베딩 모델 튜닝 파이프라인 예시

사용 사례 (적용) 

다국어 임베딩 모델을 RAG(Retrieval Augmented Generation) 의 Retriever로 사용하는 사례를 소개드리기 위해 사용자의 질문을 제주도 방언으로 번역하는 사용 사례를 구성하였습니다.

해당 사용 사례를 통해 3가지의 목표를 달성하고자 합니다

  1. LLM (특히 text bison) 모델이 사전에 학습하지 않은 제주도 방언에 대해서도 번역할 수 있도록 구성 : RAG를 통해 사전 학습 없이 외부의 지식을 활용할 수 있음을 증명
  2. textembedding-gecko-multilingual 다국어 임베딩 모델의 한국어 성능에 대한 확인 : 사용자의 질문으로 부터 가장 유사한 제주도 방언을 찾는데 다국어 임베딩 모델의 적합성을 확인
  3. 다국어 임베딩 모델을 Google Cloud의 Vector Search와 결합하여 Retriever를 구성하는 과정을 설명

사용사례의 Logical Diagram을 구성하면 아래와 같습니다.

  1. 입력 / 출력 : 표준어로 된 사용자 질문이 입력으로 들어오면 이를 제주도 방언으로 번역하여 답변하게 됩니다. (예시 - Input : 오늘 날씨가 참 좋다 / Output : "오늘 날씨가 참 좋다"의 제주도 방언은 "오늘 날씨가 참 줴다" 입니다.)
  2. Knowledge Ingestion : (방언 - 뜻풀이) paired data에서 뜻풀이를 벡터화하여 저장하고, Vector Search Index 생성을 통해 검색할 수 있도록 구성합니다.
    1. Vectorize : 다국어 임베딩 모델(textembedding-gecko-multilingual) 를 활용하여 Text Input을 768 Dimension의 Vector로 변환합니다.
    2. Upload Document : Vector Search의 Datapoint와 매핑되는 컨텐츠(이 사례의 경우 방언) 을 Text 형태로 업로드합니다.
    3. Upsert Datapoints : Vector Search(Vector DB)에 벡터화된 데이터를 검색 가능한 Datapoint 형태로 저장, 즉 데이터의 수 만큼 Datapoint가 생성됩니다.
  3. Retrieval Augmented Generation : 사용자의 입력을 벡터화 한 뒤, 유사도 검색을 통해 가장 뜻이 비슷한 제주도 방언을 탐색하고 방언-뜻풀이 모음(Dictionary)를 활용하여 제주도 방언으로 번역합니다.
    1. Vectorize : 다국어 임베딩 모델을 활용하여 사용자 입력(표준어)을 768 Dimension의 Vector로 변환합니다.
    2. Similarity Search : Google의 ScaNN 에 기반한 유사도 검색을 통해 가장 유사한 뜻풀이 Datapoint(Vector 와 ID) 탐색합니다.
    3. Download Document : Datapoint ID와 매핑되는 문서(이 경우 제주도 방언)를 읽어서 Context에 주입합니다.
    4. Generator : 제주도 방언-뜻풀이 모음(Dictionary) 을 Context로 포함하여 LLM 에게 요청하여 답변을 생성합니다.

Logical Diagram을 코드로 구현하는 과정은 다음과 같습니다. 이번 포스트에서는 전체 코드에 대한 설명은 생략하고, 핵심 코드에 대한 부분만 작성을 하였습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/unnamed_9_OSIHOAE.max-1000x1000.png

[그림 2] 제주도 방언 번역 사용사례의 Logical Diagram

Step1. Vector Search Index의 생성 및 API 호출을 위한 Endpoint 배포

본 단계에서는 MatchingEngineUtils 를 일부 Customization 하여 Vertex Vector Search(구 Vertex AI Matching Engine)의 Index를 생성하고 배포합니다.

MatchingEngineUtil과 MatchingEngine의 사용 예제 코드는 Question Answering with Documents using LangChain and Vertex AI Matching Engine 에서도 확인하실 수 있습니다.

[Vector Search Index 생성]  

Embedding Data point를 저장하고 유사도 검색에 활용하기 위한 Vector Search Index를 생성합니다. 이번 사례에는 새로운 제주도 방언이 추가됨에 따라 Datapoint의 Incremental Update가 필요할 것으로 예상되어 batch 또는 streaming 중 streaming type을 고려하였고, 효과적인 탐색을 위해 tree-AH 알고리즘으로 생성합니다. Index의 configuration은 Configure indexes 에서 참고하실 수 있으며 Create an index for streaming updates 가이드를 참고하여 콘솔에서 생성하실 수도 있습니다.

로드 중...

[Vector Search Index Endpoint 배포]

생성한 Index Instance에 접근하기 위해서는 Endpoint 생성이 필요합니다. Deploy and manage public index endpoints 를 참고하여 콘솔에서 Endpoint를 생성 및 배포하실 수도 있습니다.

로드 중...

배포된 Index 확인

로드 중...

Index의 생성 결과는 아래와 같고, 약 5100개의 방언-뜻풀이 Data가 Vector화 되어 적재되어 있습니다.

방언-뜻풀이 Datapoint의 적재 과정은 다음 Step에서 확인하실 수 있습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/unnamed_10_DD3PxI3.max-700x700.png

Step2. Vector Search Index에 Knowledge(Data) Ingestion

본 단계는 LangChain Google Vertex AI PaLM 에 rate_limit을 추가한 Embedding 모델을 활용하여 뜻풀이를 벡터화한 뒤, Vector Search에 적재하는 과정입니다. Vector Search에 적재 및 검색은 MatchingEngine 을 일부 Customization하여 활용합니다. 

[Embedding Model 정의]

Embedding 모델의 Load에는 지정된 Quota 이상으로 호출이 되어 오류가 발생하는 상황을 예방하기 위해 기존 LangChain의 VertexAIEmbeddings에 rate_limit 기능을 추가합니다.

로드 중...

본 사용사례에서는 textembedding-gecko-multilingual@001 다국어 임베딩 모델을 사용합니다.

로드 중...

[Vector Search 정의]

Vector Search 정의를 위해 MatchingEngine 를 생성하고, 이때 embedding 모델은 앞에서 정의한 모델을 활용합니다.

로드 중...

[Vector Search Datapoint 적재]

제주도 방언 뜻풀이 Datapoint를 적재하고, 매핑되는 제주도 방언 표현을 Google Cloud Storage에 적재하기 위한 add_phrase 함수를 추가합니다. 해당 함수의 phrases 에는 벡터화 하고자 하는 문구 (이 경우 뜻풀이) 를 입력으로 받고, texts 에는 검색하고자 하는 내용 (이 경우 제주도 방언) 을 넣습니다.

로드 중...

[제주도 방언 - 뜻풀이 모음집 로드]

제주도 방언 - 뜻풀이(제주특별자치도) 사이트로부터 방언과 뜻풀이 모음집을 받은 뒤, 데이터를 로드합니다.

로드 중...

저장된 내용을 확인하기 위해 유사도 검색을 하면 아래와 같이 응답을 받을 수 있습니다. 유사도 검색을 통해 찾은 제주도 방언(예시: 하르방)은 page_content 필드에, 벡터화 된 검색 원문(예시: 할아버지)은 metadataphrase 필드에서 확인할 수 있습니다.

로드 중...

Response 출력 결과 :

로드 중...

Step 3. RAG 구성

Step 2에서 정의한 Vector Search를 이용하여 LangChain의 VectorStore class를 상속받으면 Retriever를 구성할 수 있습니다. 논리적 흐름도에서 회색 음영으로 표시된 Retriever와 LLM을 이용하여 RAG(Retrieval-Augmented Generation) 를 도입하면 Knowledge base를 참조하는 LLM Application 을 구성할 수 있습니다.

다음은 MatchingEngine 를 통해 생성한 VectorStore Instance의 as_retriever 함수를 이용하여 Retriever를 구성하고 Invoke를 통해 테스트를 하는 과정입니다.

로드 중...

“여보세요” 라는 표준어를 입력을 받을 경우 의미론적으로 가장 유사한 제주도 방언인 “어이", “날봅서", “이-디" 라는 표현이 출력되는 것을 확인할 수 있습니다.

 

retrieved_context 출력값 :

로드 중...

Retriever 구성 이후에는 LLM에 Context를 입력하여 최종 답변을 생성할 수 있도록 Prompt Template을 구성할 수 있습니다. Template 구성에는 정답이 없지만 이번 예제에서는 Personality (예시: 번역가), Separator (예시: #),  Few shot prompting(예시: 질문 답변 예시 제공) 을 이용하여 구성합니다.

로드 중...

이후 LangChain의 Expression Language를 이용하여 제주도 방언으로 번역해주는 Chain을 생성하고 text-bison을 이용하여 답변을 생성합니다. (gemini-pro 는 4월 현재 Preview 상태이지만 사용이 가능합니다.)

로드 중...

사용자로부터 표준어로 “오늘 갑자기 비가 오네요" 라는 입력을 받는 경우 아래와 같이 제주도 방언을 활용한 답변이 최종적으로 생성됩니다.

로드 중...

로드 중...

마치며

이번 포스팅에서는 임베딩 된 벡터의 좌표 거리가 문장의 유사도를 나타낸다는 특성을 활용하여, 문장의 유사성을 기반으로 하는 대표적인 Task 에서 임베딩 모델을 사용해보았습니다. 먼저는 한국어 STS (Semantic Textual Similarity) 데이터셋에 대해 여러 임베딩 모델 성능을 간단히 실험해보았고,  textembedding-gecko-multilingual 모델이 다국어에 대해 의미론적인 유사성을 잘 찾아낸다는 점을 확인하였습니다.

사용 사례에서는 구글 클라우드의 textembedding-gecko-multilingual 다국어 임베딩 모델을 활용하여 RAG (Retrieval Augmented Generation) 의 Retriever 로 활용하는 방안을 알아보았습니다. 해당 사용 사례는 LLM (PaLM2 for Text) 이 사전 학습하지 않은 제주도 방언에 대해, 임베딩 모델 (Embeddings for Text) 과 RAG를 활용하여 사전 학습 없이 외부의 지식을 활용할 수 있음을 확인했습니다. 또한, 이러한 사용 사례에 다국어 임베딩 모델이 활용될 수 있다는 점을 보이며, 구글 클라우드 상에서 다국어 임베딩 모델 및 LLM, Vertex AI Vector Search, Cloud Storage 와 같은 다양한 서비스를 결합하여 RAG 를 구성하는 과정을 다루었습니다.

 

참고 자료

게시 위치