이 페이지에서는 PostgreSQL용 AlloyDB의 필터링된 벡터 검색을 간략하게 설명합니다.
필터링된 벡터 검색은 쿼리 벡터와 특정 필드의 필터로 구성됩니다. AlloyDB는 PostgreSQL의 다양한 쿼리 기능을 사용하여 단일 SQL 인터페이스에서 벡터 검색을 실행하고 정형 및 비정형 데이터를 모두 쿼리할 수 있습니다.
필터링 옵션
AlloyDB 쿼리 옵티마이저는 벡터 검색에 가장 효율적인 필터링 전략을 결정하는 데 중요한 역할을 합니다.
다양한 실행 계획의 비용을 추정하기 위해 쿼리 옵티마이저는 쿼리를 분석하고 필터 선택성, 데이터 분포, 색인 사용 가능 여부와 같은 요소를 고려합니다.
예상 비용을 기반으로 옵티마이저는 다음 중에서 최적의 필터링 전략을 선택합니다.
사전 필터링
사전 필터링은 AlloyDB가 전체 데이터 세트를 검색하는 대신 필터를 사용하여 기준과 일치하는 더 작은 항목 그룹을 찾는 쿼리 최적화 전략입니다. 그러면 AlloyDB가 더 작은 그룹에서 벡터 검색을 실행합니다.
예를 들어 유사한 파란색 셔츠를 찾고 있다면 AlloyDB는 먼저 모든 파란색 셔츠를 찾은 다음 해당 그룹 내에서 유사한 항목을 검색합니다.
이 전략은 컴퓨팅 집약적인 벡터 유사성 검색을 축소된 데이터 세트에서 실행하므로 성능이 개선됩니다.
사후 필터링
사후 필터링은 필터로 결과를 크게 좁히지 못할 때 AlloyDB에서 사용하는 전략입니다. AlloyDB는 먼저 필터링하는 대신 벡터 검색을 기반으로 유사한 항목의 광범위한 목록을 찾는 것으로 시작합니다. 그런 다음 필터 조건에 따라 결과를 확인하여 최종 목록을 생성합니다.
예를 들어 유사한 영화를 검색하며 genre = drama
같은 매우 광범위한 필터가 있는 경우 AlloyDB는 먼저 검색어와 유사한 영화를 많이 찾은 다음 대부분의 영화가 드라마일 수 있으므로 장르별로 필터링합니다.
이 전략은 필터와 일치하는 결과가 많을 것으로 예상되는 경우에 효율적입니다.
인라인 필터링
인라인 필터링은 AlloyDB가 벡터와 기타 보조 색인을 모두 사용하여 벡터 검색과 필터 평가를 동시에 실행하는 쿼리 최적화 전략입니다. AlloyDB는 벡터 색인을 검색하여 유사한 벡터를 찾고 각 벡터가 메타데이터 필터 조건과 일치하는지 확인합니다. 이러한 조건을 빠르게 평가하기 위해 B-트리, GIN, GiST와 같은 색인을 활용합니다.
예를 들어 유사한 신발을 검색하며 color = black
으로 필터링하는 경우 인라인 필터링은 AlloyDB가 이미 검은색인 신발의 유사성만 확인한다는 의미입니다. 모든 신발의 유사성을 확인한 다음 색상별로 필터링하거나, 모든 신발을 색상별로 필터링한 다음 유사성을 확인하는 것보다 효율적입니다.
인라인 필터링은 필터가 결과 범위를 적당히 좁힐 때 유용합니다.
쿼리 계획 이해
쿼리 계획은 쿼리 실행 프로세스를 포괄적으로 보여주며, 실행 전략 필드에서 AlloyDB가 벡터 스캔 작업에 선택한 필터링 전략을 보여줍니다.
인라인 필터링 쿼리 계획
인라인 필터링의 경우 AlloyDB는 비트맵 색인 스캔 계획 노드를 사용하여 필터 절의 비트맵을 제공하는 커스텀 스캔 계획 노드(벡터 스캔이라고도 함)를 사용합니다.
벡터 스캔은 필터 기준을 충족하는 행에 대해서만 거리를 계산합니다.
다음 쿼리는 color = black
으로 필터링된 shoes
검색의 인라인 필터링을 보여줍니다.
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
다음 예시 쿼리 계획은 인라인 필터링을 사용하는 최적화된 벡터 검색을 보여줍니다.
Limit (actual rows=10)
-> Custom Scan (vector scan) on products
Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
Order By: (embedding <=> '[...]')::vector)
Limit: 10
-> Bitmap Index Scan on products (color_index)
Index Cond: (color = 'black')
예시 쿼리 계획에서 Limit (actual rows=10)
은 쿼리가 SQL LIMIT 10;
절을 사용하여 출력을 제한했음을 보여줍니다. actual rows=10
은 이 노드가 쿼리 실행 중에 10개 행을 반환했음을 의미합니다.
-> Custom Scan (vector scan) on products
노드는 벡터 검색 작업을 나타냅니다. 벡터 데이터를 위한 특수 스캔이며 products
테이블에서 작동하므로 커스텀 스캔입니다.
인라인 필터링의 예시 쿼리 계획에는 실행 전략 필드에 Bitmap assisted vector Scan on products_embedding_index
가 표시되어 있습니다. 이는 벡터 스캔이 비트맵을 사용하여 유사성 검색을 수행해야 하는 행의 관심 목록을 생성함을 나타냅니다. 비트맵 색인 스캔은 color = 'black'
조건을 기반으로 데이터를 필터링하는 데 사용됩니다.
Order By: (embedding <=> '[...]')::vector
속성은 (embedding <=> '[...]')::vector
표현식을 사용하여 계산된 벡터 유사성을 기반으로 결과가 정렬됨을 나타냅니다. 여기서 embedding
은 벡터 열을, <=>
는 최근접 이웃 연산자를, [...]
은 쿼리 벡터를, ::vector
는 벡터 데이터 유형으로의 Cast 변환을 나타냅니다.
-> Bitmap Index Scan on products (color_index)
노드는 colors_index
에 대한 비트맵 색인 스캔을 나타냅니다. 비트맵 색인 스캔은 비트맵을 사용하여 필터 조건과 일치하는 행을 선택하고 필터링에 color_index
를 사용합니다.
Index Cond: (color = 'black')
속성은 쿼리의 WHERE
절에서 color = 'black'
색인 스캔이 사용하는 필터 조건을 지정합니다.