이 페이지에서는 Spanner 그래프에서 벡터 검색을 사용하여 K-최근접 이웃 (KNN) 및 근사 최근접 이웃 (ANN)을 찾는 방법을 설명합니다. 벡터 거리 함수를 사용하여 생성형 AI 애플리케이션의 유사성 검색이나 검색 증강 생성과 같은 사용 사례에 KNN 및 ANN 벡터 검색을 수행할 수 있습니다.
Spanner Graph는 KNN 벡터 유사성 검색을 실행하기 위해 다음과 같은 거리 함수를 지원합니다.
COSINE_DISTANCE()
: 두 벡터 간의 최단 거리를 측정합니다.EUCLIDEAN_DISTANCE()
: 두 벡터 간의 각도 코사인을 측정합니다.DOT_PRODUCT()
: 각도에 해당 벡터 크기의 곱을 곱하여 코사인을 계산합니다. 데이터 세트의 모든 벡터 임베딩이 정규화된 경우DOT_PRODUCT()
를 거리 함수로 사용할 수 있습니다.
자세한 내용은 K-최근접 이웃을 찾아 Spanner에서 벡터 유사성 검색 수행을 참고하세요.
Spanner Graph는 다음과 같은 근사 거리 함수를 지원하여 ANN 벡터 유사성 검색을 실행합니다.
APPROX_COSINE_DISTANCE
: 두 벡터 간의 대략적인 최단 거리를 측정합니다.APPROX_EUCLIDEAN_DISTANCE
: 두 벡터 간의 각도의 대략적인 코사인을 측정합니다.APPROX_DOT_PRODUCT
: 각도에 해당 벡터 크기의 곱을 곱하여 근사치 코사인을 계산합니다. 데이터 세트의 모든 벡터 임베딩이 정규화된 경우DOT_PRODUCT()
를 거리 함수로 사용할 수 있습니다.
자세한 내용은 근사 최근접 이웃 찾기, 벡터 색인 생성, 벡터 임베딩 쿼리를 참고하세요.
시작하기 전에
이 문서의 예시를 실행하려면 먼저 Spanner Graph 설정 및 쿼리 단계에 따라 다음을 수행해야 합니다.
필수 그래프 데이터를 삽입한 후 데이터베이스를 다음과 같이 업데이트합니다.
그래프 데이터베이스에 벡터 데이터 추가 삽입
그래프 데이터베이스를 업데이트하려면 다음 단계를 따르세요.
Account
입력 테이블에 새 열nick_name_embeddings
를 추가합니다.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
nick_name
열에 데이터를 추가합니다.UPDATE Account SET nick_name = "Fund for a refreshing tropical vacation" WHERE id = 7; UPDATE Account SET nick_name = "Fund for a rainy day!" WHERE id = 16; UPDATE Account SET nick_name = "Saving up for travel" WHERE id = 20;
nick_name
열의 텍스트에 대한 임베딩을 만들고 새nick_name_embeddings
열에 채웁니다.Spanner 그래프에서 운영 데이터의 Vertex AI 임베딩을 생성하려면 Vertex AI 텍스트 임베딩 가져오기를 참고하세요.
설명을 위해 이 예에서는 인공적인 저차원 벡터 값을 사용합니다.
UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 7; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.4, 0.9, 0.7, 0.1] WHERE id = 16; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.2, 0.5, 0.6, 0.6] WHERE id = 20;
AccountTransferAccount
입력 테이블에notes
및notes_embeddings
라는 두 개의 새 열을 추가합니다.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
notes
열에 텍스트의 임베딩을 만들고notes_embeddings
열에 채웁니다.Spanner 그래프에서 운영 데이터의 Vertex AI 임베딩을 생성하려면 Vertex AI 텍스트 임베딩 가져오기를 참고하세요.
설명을 위해 이 예에서는 인공적인 저차원 벡터 값을 사용합니다.
UPDATE AccountTransferAccount SET notes = "for shared cost of dinner", notes_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 16 AND to_id = 20; UPDATE AccountTransferAccount SET notes = "fees for tuition", notes_embeddings = ARRAY<FLOAT32>[0.1, 0.9, 0.1, 0.7] WHERE id = 20 AND to_id = 7; UPDATE AccountTransferAccount SET notes = 'loved the lunch', notes_embeddings = ARRAY<FLOAT32>[0.4, 0.5, 0.7, 0.9] WHERE id = 20 AND to_id = 16;
Account
및AccountTransferAccount
입력 테이블에 새 열을 추가한 후 다음 문을 사용하여 속성 그래프 정의를 업데이트합니다. 자세한 내용은 기존 노드 또는 에지 정의 업데이트를 참고하세요.CREATE OR REPLACE PROPERTY GRAPH FinGraph NODE TABLES (Account, Person) EDGE TABLES ( PersonOwnAccount SOURCE KEY (id) REFERENCES Person (id) DESTINATION KEY (account_id) REFERENCES Account (id) LABEL Owns, AccountTransferAccount SOURCE KEY (id) REFERENCES Account (id) DESTINATION KEY (to_id) REFERENCES Account (id) LABEL Transfers );
K-최근접 이웃 찾기
다음 예에서는 EUCLIDEAN_DISTANCE()
함수를 사용하여 그래프 데이터베이스의 노드와 에지에 KNN 벡터 검색을 실행합니다.
그래프 노드에서 KNN 벡터 검색 수행
Account
노드의 nick_name_embeddings
속성에서 KNN 벡터 검색을 실행할 수 있습니다. 이 KNN 벡터 검색은 계정 소유자의 name
및 계정의 nick_name
를 반환합니다. 다음 예에서는 [0.2, 0.4, 0.9, 0.6]
벡터 임베딩으로 표현되는 여가 여행 및 휴가 계정의 상위 K개 근접 이웃을 보여줍니다.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
RETURN p.name, a.nick_name
ORDER BY EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
결과
name | nick_name |
---|---|
Alex | 상쾌한 열대 휴가를 위한 기금 마련 |
Dana | 여행을 위해 저축 |
그래프 에지에 KNN 벡터 검색 수행
Owns
에지의 notes_embeddings
속성에서 KNN 벡터 검색을 실행할 수 있습니다. 이 KNN 벡터 검색은 계정 소유자의 name
및 이전의 notes
를 반환합니다. 다음 예에서는 [0.2, 0.4, 0.9, 0.6]
벡터 임베딩으로 표현되는 식비의 상위 K개 근접 이웃을 보여줍니다.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.notes_embeddings IS NOT NULL
RETURN p.name, t.notes
ORDER BY EUCLIDEAN_DISTANCE(t.notes_embeddings,
-- An illustrative vector embedding for 'food expenses'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
결과
name | 메모 |
---|---|
Lee | 저녁 식사 비용 공유 |
Dana | 점심이 좋았음 |
벡터 색인 만들기 및 근사 최근접 이웃 찾기
ANN 검색을 실행하려면 Spanner Graph에서 벡터 검색을 가속하는 데 사용하는 특수 벡터 색인을 만들어야 합니다. 벡터 색인은 특정 거리 측정항목을 사용해야 합니다. distance_type
매개변수를 COSINE
, DOT_PRODUCT
, EUCLIDEAN
중 하나로 설정하여 사용 사례에 가장 적합한 거리 측정항목을 선택할 수 있습니다. 자세한 내용은 VECTOR INDEX 문을 참고하세요.
다음 예에서는 Account
입력 테이블의 nick_name_embedding
열에 유클리드 거리 유형을 사용하여 벡터 색인을 만듭니다.
CREATE VECTOR INDEX NickNameEmbeddingIndex
ON Account(nick_name_embeddings)
WHERE nick_name_embeddings IS NOT NULL
OPTIONS (distance_type = 'EUCLIDEAN', tree_depth = 2, num_leaves = 1000);
그래프 노드에서 ANN 벡터 검색 수행
벡터 색인을 만든 후 Account
노드의 nick_name
속성에서 ANN 벡터 검색을 실행할 수 있습니다. ANN 벡터 검색은 계정 소유자의 name
및 계정의 nick_name
를 반환합니다. 다음 예에서 결과는 [0.2, 0.4, 0.9, 0.6]
벡터 임베딩으로 표현되는 여가 여행 및 휴가 계정의 근사 최근접 이웃 2개를 보여줍니다.
그래프 힌트는 쿼리 최적화 도구가 쿼리 실행 계획에서 지정된 벡터 색인을 사용하도록 강제합니다.
GRAPH FinGraph
MATCH (@{FORCE_INDEX=NickNameEmbeddingIndex} a:Account)
WHERE a.nick_name_embeddings IS NOT NULL
RETURN a, APPROX_EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6],
options => JSON '{"num_leaves_to_search": 10}') AS distance
ORDER BY distance
LIMIT 2
NEXT
MATCH (p:Person)-[:Owns]->(a)
RETURN p.name, a.nick_name;
결과
name | nick_name |
---|---|
Alex | 상쾌한 열대 휴가를 위한 기금 마련 |
Dana | 여행을 위해 저축 |
다음 단계
- K-최근접 이웃을 찾아 Spanner에서 벡터 유사성 검색을 수행합니다.
- 근사 최근접 이웃을 찾고, 벡터 색인을 만들고, 벡터 임베딩을 쿼리합니다.
- Vertex AI 텍스트 임베딩 가져오기
- Spanner Graph 쿼리에 대해 자세히 알아보기
- 쿼리 조정을 위한 권장사항 알아보기