Amazon Web Services 한국 블로그

Amazon MemoryDB 벡터 검색 기능 정식 출시

오늘 저희는 인 메모리의 성능과 다중 AZ의 내구성을 갖춘 실시간 기계 학습(ML) 및 생성형 인공 지능(생성형 AI) 애플리케이션을 개발하기 위해 벡터를 저장하고 인덱싱하고 가져오고 검색하는 데 사용할 수 있는 새로운 기능인 Amazon MemoryDB의 벡터 검색 기능의 정식 버전을 발표합니다.

이번 출시와 함께, Amazon MemoryDB는 Amazon Web Services(AWS)에서 널리 사용되는 벡터 데이터베이스 중 재현율이 가장 높으며 가장 빠른 속도를 자랑하는 벡터 검색 성능을 제공합니다. 기존에는 서로 경합 관계였던 처리량, 재현율, 지연 시간을 더 이상 절충할 필요가 없습니다.

이제 단일 MemoryDB 데이터베이스를 사용하여 애플리케이션 데이터와 수백만 개의 벡터를 한 자릿수 밀리초의 쿼리로 저장하고 최고 수준의 재현율로 응답 업데이트 시간을 단축할 수 있습니다. 따라서 생성형 AI 애플리케이션 아키텍처가 간소화되는 것은 물론, 최고의 성능이 제공되고 라이선스 비용과 운영 부담이 적어지며 데이터에서 인사이트를 도출하는 시간이 단축됩니다.

Amazon MemoryDB의 벡터 검색에서는 기존 MemoryDB API를 사용하여 검색 증강 생성(RAG), 이상(사기) 탐지, 문서 검색, 실시간 추천 엔진 등의 생성형 AI 사용 사례를 구현할 수 있습니다. 또한 Amazon BedrockAmazon SageMaker 같은 인공 지능 및 기계 학습(AI/ML) 서비스를 사용하여 벡터 임베딩을 생성하고 이를 MemoryDB에 저장할 수도 있습니다.

MemoryDB의 벡터 검색을 사용할 때 가장 많은 이점을 얻을 수 있는 사용 사례
MemoryDB의 벡터 검색은 다음과 같은 특정 사용 사례에 사용할 수 있습니다.

1. 검색 증강 생성(RAG)을 위한 실시간 시맨틱 검색
벡터 검색을 통해 대규모 데이터 코퍼스에서 관련 구절을 검색하여 대규모 언어 모델(LLM)을 확장할 수 있습니다. 이를 위해, 문서 코퍼스를 가져와서 개별 텍스트 버킷 단위의 청크로 나누고, Amazon Titan Multimodal Embeddings G1 모델과 같은 임베딩 모델을 사용하여 각 청크의 벡터 임베딩을 생성한 다음, 이러한 벡터 임베딩을 Amazon MemoryDB에 로드합니다.

RAG와 MemoryDB를 사용하면 항목을 벡터로 표현하여 유사한 제품 또는 콘텐츠를 찾는 실시간 생성형 AI 애플리케이션을 구축하거나, 의미론적 의미를 캡처하는 밀집 벡터로 텍스트 문서를 표현하여 문서를 검색할 수 있습니다.

2. 지연 시간이 짧고 내구성이 뛰어난 시맨틱 캐싱
시맨틱 캐싱은 파운데이션 모델(FM)의 이전 결과를 메모리에 저장하여 계산 비용을 줄이는 프로세스입니다. 이전에 추론한 답변을 질문의 벡터 표현과 함께 MemoryDB에 저장하고 재사용함으로써 LLM에서 다른 답변을 추론해야 하는 필요성을 없앨 수 있습니다.

정의된 유사성 점수를 기준으로 사용자의 쿼리가 이전 질문과 의미상 유사한 경우, MemoryDB는 이전 질문의 답변을 반환합니다. 이 같은 사용 사례는 생성형 AI 애플리케이션이 FM에 새로운 요청을 보내는 데 드는 비용을 낮추고, 더 빠르게 응답하고, 고객에게 더 빠른 사용자 경험을 제공할 수 있게 해줍니다.

3. 실시간 이상(사기) 탐지
이상(사기) 탐지에 벡터 검색을 사용하면 벡터로 표시되는 거래 데이터와 해당 거래에 사기 의도가 있는지 아니면 정상적인 것인지를 나타내는 메타데이터를 저장하여 규칙 기반 및 배치 ML 프로세스를 보완할 수 있습니다.

기계 학습 프로세스는 신규 거래가 사기 거래를 나타내는 벡터와 매우 유사할 경우에 이를 사용자의 사기 거래로 탐지해낼 수 있습니다. MemoryDB의 벡터 검색을 사용하면 배치 ML 모델을 기반으로 사기 거래를 모델링한 다음, 정상 거래와 사기 겨래를 MemoryDB에 로드하여 주성분 분석(PCA)과 같은 통계학적 분해 기법을 통해 벡터 표현을 생성함으로써 사기를 탐지할 수 있습니다.

인바운드 거래가 프런트엔드 애플리케이션을 통과하여 흐르면 PCA를 통해 거래의 벡터 표현을 생성함으로써 MemoryDB에 대해 벡터 검색을 실행할 수 있습니다. 그리고 거래가 과거에 탐지된 사기 거래와 매우 유사한 경우 한 자릿수 밀리초 이내에 거래를 거부하여 사기 피해의 리스크를 최소화할 수 있습니다.

Amazon MemoryDB의 벡터 검색 시작하기
MemoryDB의 벡터 검색을 사용하여 간단한 시맨틱 검색 애플리케이션을 구현하는 방법을 살펴봅니다.

1단계. 벡터 검색을 지원할 클러스터 생성
MemoryDB 클러스터를 생성하여 MemoryDB 콘솔 내에서 벡터 검색을 활성화할 수 있습니다. 클러스터를 생성하거나 업데이트할 때 클러스터 설정에서 벡터 검색 활성화를 선택합니다. 벡터 검색은 MemoryDB 버전 7.1 및 단일 샤드 구성에 사용할 수 있습니다.

2단계. Amazon Titan 임베딩 모델을 사용하여 벡터 임베딩 생성
Amazon Titan Text Embeddings 또는 기타 임베딩 모델을 사용하여 벡터 임베딩을 생성할 수 있습니다. 생성한 벡터 임베딩은 Amazon Bedrock에서 사용할 수 있습니다. 단일 API를 통해 AWS 서비스와 통합된 LangChain 라이브러리를 사용하여 PDF 파일을 로드하고, 텍스트를 청크로 분할하고, 벡터 데이터를 가져올 수 있습니다.

import redis
import numpy as np
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import BedrockEmbeddings

# PDF 파일을 로드하고 문서를 분할합니다.
loader = PyPDFLoader(file_path=pdf_path)
        pages = loader.load_and_split()
        text_splitter = RecursiveCharacterTextSplitter(
            separators=["\n\n", "\n", ".", " "],
            chunk_size=1000,
            chunk_overlap=200,
        )
        chunks = loader.load_and_split(text_splitter)

# 청크 및 임베딩 세부 정보를 저장하는 MemoryDB 벡터를 생성합니다.
client = RedisCluster(
        host=' mycluster.memorydb.us-east-1.amazonaws.com',
        port=6379,
        ssl=True,
        ssl_cert_reqs="none",
        decode_responses=True,
    )

embedding =  BedrockEmbeddings (
           region_name="us-east-1",
 endpoint_url=" https://bedrock-runtime.us-east-1.amazonaws.com",
    )

#MemoryDB 클러스터로의 hset을 사용하여 임베딩 및 메타데이터를 저장합니다.
for id, dd in enumerate(chucks*):
     y = embeddings.embed_documents([dd])
     j = np.array(y, dtype=np.float32).tobytes()
     client.hset(f'oakDoc:{id}', mapping={'embed': j, 'text': chunks[id] } )

Amazon Titan Text Embeddings 모델을 사용하여 벡터 임베딩을 생성한 후에는 MemoryDB 클러스터에 연결하고 MemoryDB HSET 명령을 사용하여 이러한 임베딩을 저장할 수 있습니다.

3단계. 벡터 인덱스 생성
벡터 데이터를 쿼리하기 위해, FT.CREATE 명령을 사용하여 벡터 인덱스를 생성합니다. 벡터 인덱스는 MemoryDB 키스페이스의 하위 집합에서 구성되고 유지 관리됩니다. 벡터는 JSON 또는 HASH 데이터 유형으로 저장할 수 있으며, 벡터 데이터에 대한 모든 수정 사항은 벡터 인덱스의 키스페이스에서 자동으로 업데이트됩니다.

from redis.commands.search.field import TextField, VectorField

index = client.ft(idx:testIndex).create_index([
        VectorField(
            "embed",
            "FLAT",
            {
                "TYPE": "FLOAT32",
                "DIM": 1536,
                "DISTANCE_METRIC": "COSINE",
            }
        ),
        TextField("text")
        ]
    )

MemoryDB에서는 숫자 필드, 태그 필드, 텍스트 필드, 벡터 필드 등 네 가지 유형의 필드를 사용할 수 있습니다. 벡터 필드는 플랫 검색(FLAT) 및 Hierarchical Navigable Small Worlds(HNSW) 알고리즘을 사용하여 고정 크기 벡터의 K-최근접 이웃 검색(KNN)을 지원합니다. 이 기능은 유클리드, 코사인, 내적 등, 다양한 거리 지표를 지원합니다. 벡터 스페이스에서 두 지점 사이의 각 거리를 측정한 유클리드 거리를 사용할 것입니다. 유클리드 거리가 짧을수록 벡터는 서로 가깝습니다.

4단계. 벡터 스페이스 검색
FT.SEARCH 명령과 FT.AGGREGATE 명령을 사용하여 벡터 데이터를 쿼리할 수 있습니다. 각 연산자는 인덱스의 필드 중 하나를 사용하여 인덱스에 있는 키의 하위 집합을 식별합니다. MemoryDB의 벡터 필드와 사전 정의된 임계값에 따른 쿼리 벡터 간의 거리(RADIUS)를 기준으로 필터링된 결과를 쿼리하고 찾을 수 있습니다.

from redis.commands.search.query import Query

# Query vector data
query = (
    Query("@vector:[VECTOR_RANGE $radius $vec]=>{$YIELD_DISTANCE_AS: score}")
     .paging(0, 3)
     .sort_by("vector score")
     .return_fields("id", "score")     
     .dialect(2)
)

# 쿼리 벡터로부터 반경 0.8 이내에 있는 모든 벡터를 찾습니다.
query_params = {
    "radius": 0.8,
    "vec": np.random.rand(VECTOR_DIMENSIONS).astype(np.float32).tobytes()
}

results = client.ft(index).search(query, query_params).docs

예를 들어 코사인 유사성을 사용하는 경우 RADIUS 값의 범위는 0~1입니다. 여기서 값이 1에 가까울수록 검색 중심과 유사한 벡터를 찾을 수 있습니다.

다음은 쿼리 벡터로부터 반경 0.8 내에 있는 모든 벡터를 찾는 결과의 예입니다.

[Document {'id': 'doc:a', 'payload': None, 'score': '0.243115246296'},
 Document {'id': 'doc:c', 'payload': None, 'score': '0.24981123209'},
 Document {'id': 'doc:b', 'payload': None, 'score': '0.251443207264'}]

자세히 알아보려면 RAG with MemoryDB를 벡터 저장소로 사용하는 샘플 생성형 AI 애플리케이션을 살펴보세요.

정식 버전의 새로운 기능
AWS는 re:Invent 2023에서 MemoryDB의 벡터 검색을 평가판으로 릴리스했습니다. 고객의 피드백에 따라, 현재 새롭게 제공되는 기능과 개선 사항은 다음과 같습니다.

  • MemoryDB가 지연 시간이 짧고 내구성이 뛰어난 시맨틱 캐시로 작동하여 생성형 AI 애플리케이션의 비용을 최적화하고 성능을 개선할 수 있게 해주는 VECTOR_RANGE.
  • 벡터 검색을 수행할 때 유사성을 보다 효과적으로 필터링할 수 있는 SCORE.
  • 메모리의 벡터를 복제할 필요가 없도록 하는 공유 메모리. MemoryDB 키스페이스에 벡터가 저장되고, 벡터 인덱스에 벡터에 대한 포인터가 저장됩니다.
  • 가장 성능 집약적인 생성형 AI 애플리케이션까지 지원할 수 있도록 높은 필터링 속도로 성능 개선

정식 출시
벡터 검색은 현재 MemoryDB를 사용할 수 있는 모든 리전에서 제공됩니다. AWS 설명서에서 Amazon MemoryDB의 벡터 검색에 대해 자세히 알아보세요.

MemoryDB 콘솔에서 사용해보고 AWS re:Post for Amazon MemoryDB로 피드백을 보내거나 통상적인 AWS Support 담당자를 통해 피드백을 보내주세요.

Channy