Redis vector sets
Redis vector sets (Redis vector sets)
텍스트 임베딩 같은 벡터를 저장하고, 그중에서 특정 벡터와 가장 유사한 항목을 찾아야 할 때가 있어요. Redis의 vector sets는 Sorted Sets와 비슷하지만, score 대신 벡터의 문자열 표현을 가진다는 점이 달라요. 이 페이지에서는 vector sets의 기본 개념과 사용법을 설명해 드릴게요.
vector sets란?
Vector sets는 Sorted Sets와 비슷한 데이터 타입이에요. 하지만 score 대신, 벡터 셋 요소는 벡터의 문자열 표현을 가져요. Vector sets에 항목을 추가한 뒤 다음 중 하나를 할 수 있어요.
- 지정한 벡터와 가장 유사한 항목의 부분 집합을 검색하거나
- 이미 벡터 셋에 포함된 요소의 벡터와 가장 유사한 항목의 부분 집합을 검색
그리고 vector sets는 선택적인 필터링 검색(filtered search) 도 제공해요. 벡터 셋의 전체 또는 일부 요소에 attributes를 연결하고, VSIM 명령의 FILTER 옵션을 사용해 주어진 벡터와 유사한 항목을 찾으면서 attributes에 간단한 수학적 필터를 적용할 수 있어요. 필터 예시: ".year > 1950".
Vector set 명령 요약은 여기에서 확인할 수 있어요 (109개 명령).
FP32 형식의 엔디언(endianness) 고려사항
VADD나 VSIM 같은 vector set 명령에서 FP32 blob 형식을 사용할 때는, 바이너리 데이터가 리틀엔디언(little-endian) 바이트 순서로 인코딩되어야 해요. 일부 ARM 변형이나 다른 아키텍처는 엔디언이 다를 수 있으므로, 크로스 플랫폼 호환성에 중요해요.
플랫폼이 빅엔디언(big-endian)이나 혼합 엔디언을 쓴다면 두 가지 선택지가 있어요.
- Redis에 blob을 넘기기 전에 바이트 순서를 수동으로 리틀엔디언으로 변환
- 대신
VALUES문법 사용 – 문자열로 부동소수점 숫자를 받는 방식이라 플랫폼 독립적이에요
예제 (Examples)
예시에서는 이차원 벡터를 사용할게요. 실제 사용에서는 벡터가 보통 텍스트 임베딩(text embeddings) 이고 수백 차원이에요. 텍스트 임베딩 사용에 대한 자세한 내용은 Redis for AI를 참고하세요.
사용할 점들은 다음과 같아요. A: (1.0, 1.0), B: (-1.0, -1.0), C: (-1.0, 1.0), D: (1.0, -1.0), E: (1.0, 0).
기본 연산 (Basic operations)
먼저 VADD를 사용해 점 벡터들을 points라는 셋에 추가해요. 이 명령이 vector set 객체도 만들어요. TYPE 명령은 이 객체에 대해 vectorset 타입을 반환해요.
res1 = r.vset().vadd("points", [1.0, 1.0], "pt:A")
print(res1) # >>> 1
res2 = r.vset().vadd("points", [-1.0, -1.0], "pt:B")
print(res2) # >>> 1
res3 = r.vset().vadd("points", [-1.0, 1.0], "pt:C")
print(res3) # >>> 1
res4 = r.vset().vadd("points", [1.0, -1.0], "pt:D")
print(res4) # >>> 1
res5 = r.vset().vadd("points", [1.0, 0], "pt:E")
print(res5) # >>> 1
res6 = r.type("points")
print(res6) # >>> vectorset
필터링된 유사도 검색 (Filtered similarity search)
attributes를 추가하고 검색에 포함시킬 수 있어요.
res24 = r.vset().vsetattr("points", "pt:A", {"size": "large", "price": 18.99})
print(res24) # >>> 1
res25 = r.vset().vsetattr("points", "pt:B", {"size": "large", "price": 35.99})
print(res25) # >>> 1
VSIM과 FILTER 옵션을 함께 쓰면, 벡터 유사도와 attribute 필터링을 결합할 수 있어요. 예를 들어 "가격이 어떤 값 이상이면서 벡터가 가장 유사한 항목" 같은 질의가 가능해요.