AlloyDB용으로 맞춤설정된 표준 pgvector
PostgreSQL 확장 프로그램인 vector
확장 프로그램을 사용하여 텍스트 검색, 키워드 일치, 벡터 검색, 시맨틱 유사성을 결합하는 PostgreSQL용 AlloyDB에서 하이브리드 검색을 실행합니다.
검색 관련성을 개선하려면 벡터 유사성 검색과 텍스트 검색을 결합한 하이브리드 검색을 실행하면 됩니다. AlloyDB를 사용하면 텍스트 검색을 위한 일반화된 역색인 (GIN)과 벡터 검색을 위한 확장 가능한 최근접 이웃 (ScaNN) 색인을 만들 수 있습니다. 그런 다음 두 검색의 결과를 결합하고 상호 순위 융합 (RRF)을 사용하여 순위를 다시 지정할 수 있습니다. RRF는 여러 검색 결과 목록을 순위가 지정된 단일 목록으로 결합하는 알고리즘으로, 정확한 키워드 일치와 시맨틱 유사성을 모두 기반으로 관련성이 높은 결과를 검색합니다.
텍스트 및 벡터 입력으로 유사성 검색 실행
PostgreSQL용 AlloyDB에서 하이브리드 검색을 실행하려면 테이블에 벡터 색인과 텍스트 검색 색인을 모두 만들어야 합니다. 그런 다음 두 검색의 결과를 결합하고 순위를 다시 매겨 가장 관련성 높은 정보를 표시합니다.
GIN 색인 만들기
일반화된 역색인 (GIN) 색인은 배열, JSONB, 전체 텍스트 검색 데이터와 같은 복합 값 내에서 검색하도록 최적화된 특수 색인 유형입니다.
전체 텍스트 검색을 실행하기 위해 텍스트 데이터에 GIN 색인을 만들려면 다음을 실행하세요.
CREATE INDEX INDEX_NAME ON TABLE USING GIN (to_tsvector('english', COLUMN_NAME));
다음을 바꿉니다.
INDEX_NAME
: 만들려는 색인의 이름입니다(예:my-gin-index
).TABLE
: 색인을 추가할 테이블입니다.COLUMN_NAME
: 검색할 텍스트 데이터를 저장하는 열입니다.
ScaNN 색인 만들기
ScaNN 알고리즘을 사용하여 저장된 벡터 임베딩이 포함된 열에 2단계 트리 색인을 적용하려면 다음 DDL 쿼리를 실행하세요.
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
다음을 바꿉니다.
INDEX_NAME
: 만들려는 색인의 이름입니다(예:my-scann-index
). 색인 이름은 데이터베이스 전체에서 공유됩니다. 각 색인 이름이 데이터베이스의 각 테이블에 고유해야 합니다.TABLE
: 색인을 추가할 테이블입니다.EMBEDDING_COLUMN
:vector
데이터를 저장하는 열DISTANCE_FUNCTION
: 이 색인과 함께 사용할 거리 함수입니다. 다음 중 하나를 선택합니다.L2 거리:
l2
내적:
dot_product
코사인 거리:
cosine
NUM_LEAVES_VALUE
: 이 색인에 적용할 파티션 수입니다. 1~1048576 사이의 값으로 설정합니다. 이 값을 결정하는 방법에 관한 자세한 내용은ScaNN
색인 조정을 참고하세요.
다양한 ScaNN 색인 구성에 대해 자세히 알아보려면 ScaNN
색인 만들기를 참고하세요. HNSW 색인을 만들 수도 있습니다.
상호 순위 융합을 사용하여 하이브리드 검색 실행
하이브리드 검색은 별도의 벡터 검색과 텍스트 검색을 수행한 다음 상호 순위 융합 (RRF)을 사용하여 결과를 결합하고 순위를 다시 지정하는 방식으로 작동합니다. RRF는 각 문서에 점수를 할당하여 여러 순위가 지정된 검색 결과 목록을 단일 순위가 지정된 목록으로 결합하는 순위 기반 알고리즘입니다. 이 점수는 모든 기여 목록에서 RRF의 역수 순위를 기반으로 하며, 순위가 높은 문서가 더 많이 기여합니다. 다음 SQL 쿼리를 사용하여 전체 텍스트 검색과 하이브리드 검색을 결합하고 결과를 다시 순위 지정합니다.
WITH vector_search AS (
SELECT id,
RANK () OVER (ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT')) AS rank
FROM TABLE
ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT') LIMIT 10
),
text_search AS (
SELECT id,
RANK () OVER (ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc)
FROM TABLE
WHERE to_tsvector('english', COLUMN_NAME) @@ to_tsquery(KEYWORD)
ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc
LIMIT 10
)
SELECT
COALESCE(vector_search.id, text_search.id) AS id,
COALESCE(1.0 / (60 + vector_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
FROM vector_search FULL OUTER JOIN text_search ON vector_search.id = text_search.id
ORDER BY rrf_score DESC
LIMIT 5;
다음을 바꿉니다.
MODEL_ID
: 쿼리할 모델의 ID.Vertex AI Model Garden을 사용하는 경우
text-embedding-005
를 모델 ID로 지정합니다. 이는 AlloyDB가 텍스트 임베딩에 사용할 수 있는 클라우드 기반 모델입니다. 자세한 내용은 텍스트 임베딩을 참조하세요.TABLE
: 데이터가 포함된 테이블입니다.TEXT
: 벡터 임베딩으로 변환할 텍스트입니다.KEYWORD
: 검색할 키워드입니다.COLUMN_NAME
: 검색할 텍스트 데이터가 포함된 열
하이브리드 검색 쿼리 및 관련 공통 테이블 표현식 (CTE)에 대한 설명:
vector_search
CTE: 표준 벡터 유사성 검색을 수행하고, 코사인 거리로 결과를 정렬하고, 순위를 할당합니다. 시맨틱 관점에서 가장 유사한 제품 10개를 가져옵니다.text_search
CTE:to_tsvector
및to_tsquery
를 사용하여 텍스트 검색을 실행하고,ts_rank
로 관련성을 계산하고, 가장 관련성이 높은 텍스트 일치 항목 10개를 가져옵니다.Final SELECT Statement
CTE:FULL OUTER JOIN
을 사용하여 벡터 및 텍스트 검색 결과를 조인하고, 제품 ID를 선택하고, RRF 점수를 계산하고, 점수별로 정렬하고, 상위 5개 결과를 가져옵니다.
LangChain을 사용하여 하이브리드 검색 실행
AlloyDB 벡터 저장소를 사용한 하이브리드 검색은 밀집 임베딩 벡터 검색과 키워드 기반 검색이라는 두 가지 조회 전략을 결합하여 검색 정확도를 향상합니다. AlloyDBVectorStore
은 LangChain의 VectorStore
클래스의 특정 구현으로 작동하여 LangChain을 사용하는 LangChain 벡터 스토어 클래스입니다. AlloyDBVectorStore 클래스를 사용하여 AlloyDB에 벡터 임베딩을 저장하는 방법을 알아봅니다.
AlloyDBVectorStore
을 설정할 때 HybridSearchConfig
클래스를 사용하여 이 하이브리드 검색을 사용 설정하고 구성할 수 있습니다.
AlloyDB 벡터 저장소를 사용하는 하이브리드 검색은 쿼리의 의미와 컨텍스트를 이해하기 위한 시맨틱 검색과 정확한 어휘 일치를 찾기 위한 키워드 검색을 동시에 실행합니다. 그런 다음 두 검색의 결과를 병합하여 더 포괄적인 결과 집합을 제공합니다.