Elasticsearch 도입기

crowdworks
크라우드웍스 Tech Blog
10 min readNov 29, 2024
이미지 출처 — www.elastic.co

안녕하세요. AI 개발팀의 박지훈입니다. 저희는 다양한 문제를 AI를 활용해 해결할 수 있는 서비스를 개발합니다. 최근에는 LLM 모델과 관련된 프로젝트를 주로 하고 있는데요. 이번 글에선 RAG에 적합한 검색엔진 선정과 이유에 대해 소개하겠습니다.

먼저 이해를 돕기 위해 LLM, Fine-tuning과 RAG에 대해 간략히 설명하겠습니다.

LLM과 한계

LLM(Large Language Model)은 방대한 양의 데이터를 학습해 번역, 조언, 텍스트 생성 등 다양한 작업을 수행할 수 있는 강력한 도구입니다. 이러한 모델은 자연어 처리(NLP) 작업에서 탁월한 성능을 발휘하며, 많은 문제를 해결할 수 있습니다.

하지만, LLM에도 몇 가지 한계가 존재합니다

학습되지 않은 데이터에 대한 제한 : 모델이 훈련 데이터에 포함되지 않은 정보나 최신 데이터에 대한 질문에는 정확한 답변을 제공하기 어렵습니다.

지식의 고정성 : 학습이 완료된 시점 이후에 발생한 정보는 모델에 반영되지 않아, 최신 정보를 요구하는 작업에서 문제가 될 수 있습니다.

이러한 한계를 극복하기 위해 두 가지 대표적인 접근 방식이 있습니다

Fine-tuning : 기존 모델에 새로운 데이터를 추가 학습시켜 특정 도메인이나 작업에 맞게 성능을 개선하는 방법입니다. 하지만 Fine-tuning에는 시간이 많이 소요되며, 정기적인 업데이트가 필요할 경우 비용이 증가할 수 있습니다.

RAG (Retrieval-Augmented Generation) : 외부 데이터 소스를 검색하고 이를 바탕으로 LLM이 답변을 생성하도록 하는 방법입니다. RAG는 최신 정보나 학습되지 않은 데이터도 실시간으로 반영할 수 있다는 점에서 매우 효과적입니다.

저희는 주로 특정 LLM에 의존적이지 않고, 비교적 빠르게 구축해 결과를 확인 할 수 있는 RAG를 이용해 프로젝트를 수행하고 있습니다.

RAG에서 검색

RAG는 검색, 증강, 생성의 단계로 구분되는 프로세스를 말하며, 그 중 검색은 참조할 데이터를 선정하는 과정입니다.

검색에는 다양한 방법이 있지만, 저희는 BM25와 Vector search를 주로 사용하고 있습니다. 검색 방법에 대해 깊게 설명하는것은 본글의 취지와 맞지 않아 짧게만 설명하겠습니다.

BM25의 계산 공식. 출처 임시 표기 : https://www.elastic.co/kr/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables

BM25는 키워드를 기반으로 관련 정보를 검색하는 방식입니다. 전체 문서내에서 검색하고하는 내용의 키워드 등장 빈도를 기준으로 평가합니다. 키워드에 근거한 정확한 문서를 검색할때는 높은 성능을 보이지만, 질문의 의도의 반영, 동일한 의미의 다른 단어 사용, 오타 등에는 취약한 편입니다. 또한, 문서의 길이에 따라서 평가가 올바르게 이뤄지지 않을 수 있습니다.

출처 임시표기 : https://medium.com/@hari4om/word-embedding-d816f643140

Vector Search는 검색의미를 기반으로 검색하는 방식입니다. 문서를 임베딩해 벡터 간 거리를 기준으로 평가합니다. BM25와는 달리 문서 자체를 기반으로 비교해 검색하기 때문에 보다 세밀한 영역까지 고려되는 방법입니다. 다만, 비교적 높은 리소스를 사용하며, 임베딩 모델에 의존적이며 검색 된 근거를 명확히 할 수 없다는 단점이 있습니다.

저희는 위 두 가지 검색 방식을 기반으로 몇 가지 프로젝트를 진행하며, 다양한 라이브러리와 도구를 다음의 검토 항목을 중심으로 평가하였습니다. 결과적으로는 두가지 검색과 더불어 복잡한 검색을 지원하며 안정적인 서비스와 관리가 가능한 Elasticsearch를 사용하기로 결정했습니다.

왜 Elasticsearch인가

Elasticsearch는 오픈소스 기반의 분산형 검색 및 분석 엔진으로, 빠르고 확장 가능한 검색 기능을 제공하는 데이터베이스 솔루션으로, 장점은 아래와 같습니다.

Search Engine(좌) 과 Vector DB(우)의 순위표. Elasticsearch가 모두 1위를 차지하고 있다. 출처: https://db-engines.com/en/ranking_trend/search+engine/all
  • RESTful 검색 및 분석 : Elasticsearch는 RESTful API를 통해 손쉽게 데이터를 검색하고 분석할 수 있어, 다양한 애플리케이션과의 통합이 용이합니다.
  • 유연한 데이터 구조 : JSON 형식의 문서 기반 데이터 저장 방식을 사용하여, 구조화된 데이터와 비구조화된 데이터를 모두 유연하게 처리할 수 있습니다.
  • 확장성 및 분산처리 : 클러스터 아키텍처를 기반으로, 수평적 확장이 가능하며 대규모 데이터 처리 및 고속 검색을 지원합니다.
  • 풍부한 래퍼런스 : 강력한 커뮤니티와 방대한 문서를 통해 다양한 문제 해결 방안을 제공받을 수 있으며, 사용자 지원이 활발합니다.
  • 복잡한 조건의 쿼리 : 단순한 키워드 검색뿐만 아니라, 필터링, 집계, 범위 검색 등 고도화된 쿼리를 통해 정교한 데이터 검색 및 분석이 가능합니다.
  • 데이터 시각화 : Kibana는 대시보드 생성, 실시간 모니터링, 데이터 탐색 등의 기능을 통해 Elasticsearch의 검색 결과를 효과적으로 이해하고 활용할 수 있도록 지원합니다.

그중 복잡한 조건의 쿼리데이터 시각화에 대해 더 자세히 말씀 드리겠습니다.

복잡한 조건의 쿼리

앞서 설명드린 검색 방법은 엄밀히 말하면, 유사성을 평가지표로 활용하는 방식에 해당합니다. BM25는 키워드 기반으로 유사성을 판단하는 데 반해, VectorSearch는 문맥적 의미를 기준으로 유사성을 평가합니다. 이러한 방식들은 검색 대상 문서가 서로 연관성이 적고 유사성이 명확한 경우에는 적합하지만, 상호 보완적인 내용이나 비슷한 주제로 연결된 문서가 포함될 경우 중복된 정보나 불필요한 내용이 검색 결과에 포함될 가능성이 있습니다.

예를 들어, 이제 막 입사한 신입사원이 업무에 도움을 주는 챗봇에게 “복리후생을 알려줘”라고 요청했을 때를 생각해볼 수 있습니다. 이 경우, 챗봇이 오래된 정보나 모든 직급 및 부서별 복리후생과 같은 다양한 내용을 모두 검색해 보여준다면 신입사원이 실제로 필요한 정보에 접근하기 어려울 수 있습니다.

이를 해결하기 위해 신입사원의 인적사항(예: 직급, 부서 등)이나 많은 사람들이 자주 찾아본 문서와 같은 추가 정보를 활용하면 검색의 정확도를 크게 향상시킬 수 있습니다. 이러한 접근 방식은 단순히 텍스트 유사성에만 의존하지 않고, 문서의 맥락과 사용자 상황을 고려해 보다 유용하고 맞춤화된 검색 결과를 제공할 수 있습니다.

Elasticsearch는 여러 필드를 연결하여 조건을 구성해 검색할 수 있으며, Function Score를 활용하면 보다 정밀하고 유연한 조건 설정이 가능합니다. 이를 통해 조건에 부합하는 데이터에 가중치를 부여하거나, 스코어의 최소/최대 값을 지정하거나, 새로운 연산식을 적용해 스코어를 계산할 수 있습니다. 이러한 기능은 검색 결과의 우선순위를 세밀하게 조정하고, 사용자에게 더욱 적합한 결과를 제공하는 데 유용합니다.

{
"query": {
"function_score": {
// 기본 검색 쿼리
"query": {
"bool": {
"must": [
{ "match": { "content": "복리 후생에 대해 알려줘." } }
],
"filter": [
{ "term": { "team": "Ai-Dev" } }
]
}
},
// 추가 조건
"functions": [
// 최근 계시물에 더 높은 점수 부여
{
"weight": 2,
"gauss": {
"publish_date": {
"origin": "now",
"scale": "7d",
"offset": "0d",
"decay": 0.5
}
}
},
// populariry 필드가 높은 문서에 더 높은 점수 부여
{
"weight": 1.5,
"linear": {
"popularity": {
"origin": 1000,
"scale": 500,
"decay": 0.3
}
}
},
// position에 new가 있는 문서에 가중치 부여
{
"filter": {
"match": { "position": "new"}
},
"weight": 3
}
],
// 기본 쿼리 점수와 함수 점수의 합산 방식 정의
"score_mode": "sum",
"boost_mode": "multiply",
"max_boost": 10
}
}
}

위 쿼리는 신입사원이 복리후생에 대해 질문했을 때의 검색 예시입니다. 이 쿼리는 먼저 팀명으로 필터링을 적용하여 관련 없는 문서를 제외한 후, 검색된 문서에 대해 날짜, 인기도, 직위를 기반으로 연관성 점수를 조정합니다. 이를 통해 사용자의 질문 의도에 보다 부합하는 높은 품질의 결과를 제공할 수 있습니다.

또한, Elasticsearch는 텍스트 뿐만 아니라 숫자, 날짜, 지리 정보 등 다양한 데이터 타입을 지원합니다. 이를 통해 데이터의 성격에 맞는 방식으로 조건을 설정할 수 있어, 복잡한 데이터 구조와 요구사항을 손쉽게 다룰 수 있습니다. 이러한 유연성과 정밀함은 고도화된 검색 요구를 충족시키는 데 매우 효과적입니다.

데이터 시각화와 관리

검색 대상 데이터는 구조적으로 잘 정리된 정형 데이터뿐만 아니라 보고서, 업무 매뉴얼, 상담 내용 등과 같은 비정형 데이터도 포함됩니다. 비정형 데이터는 대개 임의의 전처리 과정을 거쳐 데이터베이스에 적재된 후 검색에 사용됩니다. 따라서, 전처리 방식에 따라 데이터의 적재 값이 달라질 수 있고, 이러한 변화는 검색 품질에 직접적인 영향을 미칠 수 있습니다.

저희는 전처리 과정에서 데이터가 예상치 못한 형태로 적재될 가능성을 고려해야 했고 적재된 데이터가 의도한 검색 조건에 부합하는지 확인하는 작업이 필요했습니다. 이 작업은 전처리 로직이 바뀌거나 새로운 데이터가 추가 될 때 마다 수행해야해서 많은 시간이 소요 되었습니다.

서버의 상태(좌)와 적재된 데이터 시각화(우)

이 과정에서 Kibana는 큰 역할을 했습니다. Kibana는 Elasticsearch 데이터를 활용해 분석에 필요한 통계와 시각화를 제공하며, 특히 실시간 대시보드를 통해 데이터 및 서버의 상태를 즉시 확인할 수 있었습니다. 이러한 기능은 별도의 개발 작업 없이도 바로 활용 가능하다는 점에서 개발 시간을 단축시키고 효율성을 높이는 데 크게 기여했습니다.

마치며

Elasticsearch는 검색 엔진으로써 기본에도 충실하고 실제 프로덕션 운영 환경을 고려했을 때도 높은 신뢰성과 개발 및 운영의 편의성을 제공합니다. 크라우드웍스에서는 Elasticsearch를 선택하여 RAG를 구현하고 LLM의 한계를 효과적으로 보완하기 위해 효과적으로 사용하고 있습니다.

--

--

No responses yet