Similarity Search (유사도 검색)

5단 분석법

순서
분석
단어
내용
1
일반 명사
유사도
어떤 대상과 비슷한 정도
검색
책이나 컴퓨터에서, 목적에 따라 필요한 자료들을 찾아내는 일
유사도 검색
어떤 대상과 비슷한 정도를 책이나 컴퓨터에서 목적에 따라 필요한 자료들을 찾아내는 일
2
고유 명사
유사도 검색
언어 모델을 활용해 텍스트 데이터 간의 유사도를 계산하고, 이를 바탕으로 유사한 텍스트를 검색하는 기능
3
사용 이유
유사도 검색
대규모 데이터셋에서 특정 데이터와 유사한 항목을 빠르고 정확하게 찾기 위해서
4
사용 방법
유사도 검색
벡터로 변환된 텍스트 데이터를 유사도 계산 모델에 입력해 유사한 항목을 검색
5
다른 기술과의 비교
유사도 검색
-

정의

일반 명사

유사도
어떤 대상과 비슷한 정도
검색
책이나 컴퓨터에서, 목적에 따라 필요한 자료들을 찾아내는 일
유사도 검색
어떤 대상과 비슷한 정도를 책이나 컴퓨터에서 목적에 따라 필요한 자료들을 찾아내는 일
유사도는 어떤 대상과 비슷한 정도를 말합니다.
검색은 책이나 컴퓨터에서 목적에 따라 필요한 자료들을 찾아내는 일을 말합니다.
그래서, 유사도 검색은 어떤 대상과 비슷한 정도를 책이나 컴퓨터에서 목적에 따라 필요한 자료들을 찾아내는 일이라고 생각해 볼 수 있습니다.
고유 명사를 한 번 살펴볼까요?

고유 명사

유사도 검색
언어 모델을 활용해 텍스트 데이터 간의 유사도를 계산하고, 이를 바탕으로 유사한 텍스트를 검색하는 기능
유사도 검색은 언어 모델을 활용해 텍스트 데이터 간의 유사도를 계산하고, 이를 바탕으로 유사한 텍스트를 검색하는 기능을 말합니다.
유사도 검색(Similarity Search)은 데이터베이스나 데이터셋 내에서 특정 데이터 포인트와 유사한 항목을 찾는 기술입니다.
주로 벡터 간의 거리 계산을 통해 수행 됩니다.
유사도 검색은 텍스트, 이미지, 오디오 등 다양한 형태의 데이터에 적용될 수 있으며, 특히 추천 시스템, 정보 검색, 데이터 분류 등의 분야에서 중요하게 활용됩니다.
랭체인(LangChain)에서의 유사도 검색은 언어 모델을 활용하여 텍스트 데이터 간의 유사도를 계산하고, 이를 바탕으로 유사한 텍스트를 검색하는 기능을 말합니다.
랭체인은 자연어 처리(NLP) 기술을 기반으로 하여 텍스트 데이터를 벡터로 변환하고, 이 벡터를 통해 텍스트 간의 유사도를 빠르고 정확하게 계산합니다.
이를 통해 랭체인은 대규모 텍스트 데이터셋에서 특정 쿼리에 대해 가장 유사한 텍스트를 빠르고 정확하게 검색할 수 있습니다.

사용 이유

유사도 검색
대규모 데이터셋에서 특정 데이터와 유사한 항목을 빠르고 정확하게 찾기 위해서
이유
설명
정확성
고도화된 언어 모델을 사용하여 텍스트 간의 유사도를 높은 정확도로 계산할 수 있어, 검색 결과의 신뢰성이 높습니다.
편의성
랭체인의 API와 라이브러리는 사용하기 쉽고 직관적이며, 다양한 언어 모델과의 통합이 용이하여 개발자가 쉽게 활용할 수 있습니다.
확장성
랭체인의 유사도 검색 기능은 FAISS와 같은 고성능 라이브러리를 활용하여 대규모 데이터셋에서도 높은 성능을 유지할 수 있으며, 확장이 용이합니다.
다양성
문서 검색, 챗봇 응답 생성, 추천 시스템 등 다양한 응용 분야에서 활용될 수 있어 범용성이 뛰어납니다.

사용 방법

유사도 검색
벡터로 변환된 텍스트 데이터를 유사도 계산 모델에 입력해 유사한 항목을 검색

1. 라이브러리 설치 및 데이터 준비

!pip install langchain openai langchain-openai langchain-community faiss-cpu
Bash
복사
# OpenAI API 키 설정 (환경 변수로 설정) import os os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
Bash
복사
os: 환경 변수를 설정하기 위한 표준 라이브러리입니다.
os.environ: 환경 변수를 설정하는 방법입니다. "OPENAI_API_KEY"는 OpenAI API 키를 저장하는 환경 변수입니다.
"your-openai-api-key": OpenAI API 키로, 실제 OpenAI 계정에서 발급받은 API 키로 대체해야 합니다.
from langchain_openai import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.schema import Document
Python
복사
documents = [ "사과는 빨갛고 맛있는 과일이다.", "바나나는 노랗고 부드러운 과일이다.", "오렌지는 주황색 과일로 비타민 C가 풍부하다." ]
Python
복사
documents: 검색에 사용할 텍스트 문서의 리스트입니다. 각 문서는 과일에 대한 간단한 설명입니다.

2. 임베딩 모델 초기화

# 임베딩 모델 초기화 # 벡터화 embedding_model = OpenAIEmbeddings()
Python
복사
OpenAIEmbeddings: OpenAI의 임베딩 모델을 초기화합니다. 이 모델은 텍스트를 벡터 형태로 변환합니다.

3. 문서 임베딩 생성

# 문서 임베딩 생성 doc_embeddings = embedding_model.embed_documents(documents)
Python
복사
embedding_model: 임베딩 모델 인스턴스 (OpenAIEmbeddings 클래스의 객체)
embed_documents(documents): 문서 리스트를 입력으로 받아 각 문서를 벡터로 변환합니다. 결과는 각 문서에 대한 임베딩 벡터의 리스트입니다.
매개변수 documents: 텍스트 문서의 리스트, 각 문서는 문자열 형식 입니다.

4. 벡터 저장소 생성

# 문서와 임베딩을 포함하는 Document 객체 생성 docs_with_embeddings = [Document(page_content=doc, metadata={"embedding": emb}) for doc, emb in zip(documents, doc_embeddings)] # 벡터 저장소 생성 vector_store = FAISS.from_documents(docs_with_embeddings, embedding_model)
Python
복사
Document 객체 생성: 각 문서와 해당 임베딩 벡터를 포함하는 Document 객체를 생성합니다.
page_content: 문서의 내용.
metadata: 임베딩 벡터를 포함하는 메타데이터.
문서와 관련된 추가 정보를 의미하며, 이 예제에서는 문서의 임베딩 벡터를 포함 합니다.
docs_with_embeddings 리스트 컴프리헨션 설명
FAISS 벡터 저장소: FAISS를 사용하여 벡터 저장소를 생성합니다. 이 저장소는 문서 임베딩을 저장하고, 유사도 검색을 수행합니다.

5. 쿼리 임베딩 생성

# 검색할 쿼리 query = "빨간 과일" # 쿼리 임베딩 생성 query_embedding = embedding_model.embed_query(query)
Python
복사
query: 검색에 사용할 쿼리 문장입니다.
embed_query: 쿼리 문장을 임베딩 벡터로 변환합니다.

6. 유사도 검색

# 유사도 검색 results = vector_store.similarity_search_by_vector(query_embedding, k=1) # 상위 1개 결과 반환
Python
복사
similarity_search_by_vector: 쿼리 임베딩을 사용하여 벡터 저장소에서 가장 유사한문서를 검색합니다.
k=1: 상위 1개의 결과를 반환합니다.

7. 결과 출력

# 결과 출력 for result in results: print(result.page_content)
Python
복사
결과 출력: 검색된 문서의 내용을 출력합니다.

Google Colab

알아 두면 좋은 정보

벡터화

유사도 검색의 핵심은 텍스트 데이터를 벡터로 변환하는 것입니다.
벡터화된 텍스트는 수학적 거리 계산을 통해 유사성을 평가할 수 있습니다.
벡터화 과정에서는 자연어 처리(NLP) 모델이 텍스트를 고차원 벡터로 변환합니다.
이를 통해 텍스트 간의 관계를 수치적으로 표현할 수 있습니다. 랭체인은 다양한 임베딩 모델을 지원합니다.
OpenAI
GPT 계열 모델을 사용하여 텍스트를 벡터화할 수 있으며, 높은 수준의 문맥 이해와 유사도 계산이 가능합니다.
BERT (Bidirectional Encoder Representations from Transformers)
구글이 개발한 BERT는 문맥 내에서 단어의 의미를 양방향으로 이해할 수 있는 모델로, 매우 정교한 벡터화를 제공합니다.
Sentence Transformers
BERT와 같은 트랜스포머 모델을 기반으로 하며, 문장을 벡터로 변환하는 데 최적화되어 있어 문장 간 유사도 검색에 유리합니다.
벡터화된 텍스트는 벡터 간의 유사도를 계산하여 유사도 검색을 수행할 수 있습니다.
대표적인 방법으로는 코사인 유사도, 유클리드 거리, 맨하탄 거리 등이 있습니다.

다양한 응용

유사도 검색은 다양한 분야에서 활용될 수 있습니다.
응용 사례
설명
문서 검색
대규모 문서 데이터베이스에서 특정 쿼리에 가장 유사한 문서를 검색할 수 있습니다. 예를 들어, 학술 논문 검색, 법률 문서 검색 등에 활용됩니다.
추천 시스템
사용자 행동 데이터를 기반으로 개인화된 추천을 제공할 수 있습니다. 예를 들어, 영화 추천, 상품 추천, 음악 추천 등에 유사도 검색이 활용됩니다.
챗봇 응답 생성
사용자의 질문과 유사한 이전 대화나 문서를 찾아 적절한 응답을 생성할 수 있습니다. 이는 자연스럽고 유용한 대화를 가능하게 합니다.
중복 문서 제거
데이터베이스 내에서 중복된 문서를 찾아 제거하여 데이터의 품질을 높일 수 있습니다. 이는 데이터 클리닝 과정에서 중요합니다.
데이터 클러스터링
유사한 데이터를 그룹화하여 데이터 분석과 인사이트 도출을 용이하게 합니다. 예를 들어, 고객 세그먼테이션, 주제 분류 등에 활용됩니다.

최적화 전략

유사도 검색의 성능을 향상시키기 위해 다양한 최적화 전략을 사용할 수 있습니다.
전략
설명
인덱싱
벡터 데이터를 효율적으로 관리하기 위해 인덱스를 생성합니다. 인덱싱 기법에는 KD 트리, Ball 트리, 해싱 기법 등이 있으며, 이를 통해 검색 속도를 향상시킬 수 있습니다.
파티셔닝
벡터 공간을 여러 개의 부분으로 나누어 검색 범위를 줄이는 방법입니다. 파티셔닝을 통해 검색 시간을 단축하고 메모리 사용을 최적화할 수 있습니다.
클러스터링
유사한 벡터들을 그룹화하여 검색을 효율적으로 수행할 수 있습니다. 대표적인 클러스터링 기법으로 K-means, 하이브리드 클러스터링 등이 있습니다.
압축 기법
벡터의 크기를 줄여 메모리 사용량을 줄이고 검색 속도를 높이는 방법입니다. 이를 위해 양자화(Quantization), 해싱(Hashing) 등의 기법을 사용할 수 있습니다.
병렬 처리
멀티스레딩, 멀티프로세싱, GPU 병렬 처리를 통해 대규모 데이터셋에 대한 검색을 가속화할 수 있습니다. 이는 실시간 처리 요구가 높은 시스템에서 특히 유용합니다.