-
알고리즘 [검색] OpenSearch 데이터 저장 구조 대규모 데이터를 다루는 검색 시스템에서 데이터를 어떻게 저장하고 검색할지는 성능과 안정성에 직결되는 중요한 문제이다. OpenSearch는 이를 해결하기 위해 논리적 구조와 물리적 구조를 계층적으로 나누어 데이터를 관리한다. 논리적 데이터 구조오픈서치의 데이터 저장은 가장 작은 단위인 Document 부터 시작한다. Document 사용자가 입력한 데이터의 최소 단위를 말하며, 보통 JSON 포맷으로 저장된다. 관계형 DB의 row 와 유사하며, 여러 필드로 구성되어있고 모든 도큐먼트는 고유한 id를 가진다. Index도큐먼트가 모여있는 논리적 집합을 말한다. 인덱스를 먼저 만들고 그 안에 도큐먼트를 넣을 수 있으며, 관계형 DB의 Table과 유사하다. 요약하면, Document = row, index.. -
프로젝트 [검색] OpenSearch 검색엔진은 데이터를 미리 구조화하고, 사용자 질의에 빠르게 대응하는 시스템이다.OpenSearch는 AWS가 Elasticsearch를 오픈소스로 포크해 발전시킨 검색엔진이다. OpenSearch 동작 방식OpenSearch도 기본적으로 “인덱싱”과 “검색”이라는 두 분류로 나눌 수 있다.1. 인덱싱 (Indexing)데이터를 JSON 문서 형태로 저장역색인(Inverted Index) 구조로 단어와 문서의 관계를 맵핑필요한 경우 Analyzer(토크나이저·필터)로 텍스트를 전처리이 단계가 끝나면, OpenSearch는 문서의 각 토큰(단어)을 빠르게 찾아낼 수 있는 색인을 보유하게 된다.2. 검색 (Querying)사용자가 검색어를 입력하면 같은 Analyzer로 토큰화역색인을 이용해 해당 토큰이 들어.. -
문제 해결 [검색] HNSW/IVF 하이퍼파라미터 튜닝 오픈서치의 Efficient K-NN Filtering을 몰랐을 때, 현재 사용하고 있는 ANN의 한계라고 생각하고 하이퍼파라미터 튜닝 테스트를 진행했다. 단순히 벡터를 인덱싱하고 검색하는 것에서 끝나는 것이 아니라, 하이퍼파라미터를 어떻게 조정하느냐에 따라 검색 속도, 메모리, 정확도가 크게 달라진다는 것을 직접 체감했다.HNSWHNSW 는 그래프 기반 ANN 알고리즘으로 노드를 여러 레벨로 구성해 가까운 점들끼리 연결해놓고 탐색하는 방식이다. 주요 하이퍼파라미터M : 한 노드가 연결할 최대 이웃의 수 M 값이 커지면 그래프의 밀집도가 올라가기 때문에 메모리 사용량이 높아지며, 인덱싱 시간이 증가한다.ef_construction : 인덱싱 단계에서 후보 풀 크기값이 높을수록 더 많은 후보를 탐색해서 더.. -
문제 해결 [검색] 벡터 검색의 누락된 결과 되찾기 최근 사내 서비스의 검색 기능을 개선하면서 오픈서치를 통한 벡터 검색을 도입하게 되었다. 기존 렉시컬 검색 쿼리만 생각하고 bool 필터를 통한 선필터링 후 벡터 검색을 기대했으나 기대한 결과가 나오지 않는 문제가 있었다. 기존 구현 : bool 쿼리 + knn 쿼리처음 구현한 방식은 아래와 같았다. { "size": 200, "query": { "bool": { "filter": [ { "term": { "category": "electronics" } }, { "range": { "price": { "lte": 50000 } } } ], "must": [ { "knn": { "vector_.. -
알고리즘 [검색] 유사도 란? 벡터 검색에서는 "가장 가까운 이웃" 을 찾는다고 했다. 가깝다라는 기준을 유사도라고 하며, 유사도 측정 방식에 따라 검색 결과가 달라질 수 있기 때문에 어떤 방식을 선택하느냐가 매우 중요하다. 코사인 유사도 (방향 기반 유사도)두 벡터 사이의 방향이 얼마나 유사한지를 측정하는 방식으로 상대적인 비율이나 패턴이 더 중요할 때 사용한다.예를 들어, 문서 유사도 분석과 같이 의미가 비슷한 문장이면 점수 차이가 많이 나더라도 같은 방향쪽에 있다면 두 문서가 매우 유사하다고 판단한다.유클리드 거리 (거리 기반 유사도)벡터 공간에서 두 점 사이의 직선 거리를 계산하는 방식으로 데이터의 절대값이나 크기 자체가 중요한 의미를 가질 때 사용한다. 예를 들어, 이미지 색상 분석과 같이 R,G,B 채널의 절대 값이 비슷.. -
알고리즘 [검색] 벡터 검색 KNN / ANN 벡터 검색을 하기 위한 방법에는 뭐가 있을까? 브루트 포스 KNN (K-Nearest Neighbors)유사도를 검색할 때 가장 단순한 방법은 모든 데이터를 탐색하는 것이다. KNN 알고리즘은 주어진 쿼리 벡터와 데이터베이스 내의 모든 벡터 간의 거리르 계산하여, 가장 가까운 K개의 이웃을 찾는 방법을 말한다. 장점모든 벡터를 비교하기 때문에 정확도가 높고 구현과 이해가 쉽다. 단점벡터가 많아질수록 계산해야하는 벡터가 많아지므로 성능이 저하되고 메모리 사용량이 급증한다. 수십억 개의 벡터 중에서 가장 유사한 벡터를 찾기 위해 모든 벡터와 일일이 거리를 계산하는 것은 현실적으로 불가능하다.이를 해결하기 위해 등장한 알고리즘이 바로 ANN 알고리즘이다. ANN (Approximate Nearest Neigh.. -
알고리즘 [검색] 벡터 검색 과정 그럼 벡터 검색은 어떤 과정을 거칠까? 벡터 검색은 총 4단계로 구성되어 있고 크게 인덱싱과 검색으로 나눠서 설명해보려고 한다.인덱싱 (Indexing)인덱싱은 미리 여러 벡터를 빠르게 찾을 수 있도록 구조화해두는 과정을 말한다. 1. 데이터 임베딩사전 학습된 임베딩 모델로 각 데이터를 벡터로 변환하는 작업이다. 벡터는 데이터의 의미를 담고 있는 숫자 배열을 의미한다.이 과정에서 임베딩 모델을 배포하고 추론하는 과정도 필요한데 그 부분은 다음에 sagemaker에 대한 글을 작성해보겠다. 2. 벡터 인덱싱변환된 벡터를 단순 저장만하는 것이 아니라 엄청 많은 벡터 속에서 빠르게 유사한 벡터를 찾을 수 있도록 특별한 자료구조로 인덱스에 저장한다. 이 때, HNSW나 IVF와 같은 알고리즘을 사용한다. 검색.. -
알고리즘 [검색] 벡터 검색 벡터 검색을 도입해야한다. 벡터 검색이 정확히 무엇인지 알아보자. 벡터 검색이 생기기 전? 전통적으로 사용하던 검색 방식은 "키워드 매칭"을 이용한 방식을 사용했다. 사용자가 입력한 단어가 문서에 정확히 포함되어있는지를 찾아 결과를 보여주는 방식이다. 예를 들어, "고양이"를 검색했을 때 -> "고양이"라는 단어가 포함된 문서만 찾아준다. 따라서 얌전한 고양이는 나오지만, 귀여운 야옹이는 "고양이" 키워드가 없어서 찾지 못하고, 아무 설명 없는 고양이 사진도 찾지 못해 검색 결과에 나오지 않았다.물론, 요즘은 동의어처리나 유사어 단어 검색 등 기능을 제공하지만 지속적인 관리가 필요하거나 이마저도 검색의 범위는 한계가 있다. 이런 문제를 해결하기 위해 탄생 것이 바로 벡터 검색이다. 벡터 검색벡터 검색은..