Spanner Graph에서 벡터 검색 사용

이 페이지에서는 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 설정 및 쿼리 단계에 따라 다음을 수행해야 합니다.

  1. 인스턴스 만들기
  2. Spanner Graph 스키마로 데이터베이스 만들기
  3. 필수 그래프 데이터 삽입

필수 그래프 데이터를 삽입한 후 데이터베이스를 다음과 같이 업데이트합니다.

그래프 데이터베이스에 벡터 데이터 추가 삽입

그래프 데이터베이스를 업데이트하려면 다음 단계를 따르세요.

  1. Account 입력 테이블에 새 열 nick_name_embeddings를 추가합니다.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. 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;
    
  4. AccountTransferAccount 입력 테이블에 notesnotes_embeddings라는 두 개의 새 열을 추가합니다.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. 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;
    
  6. AccountAccountTransferAccount 입력 테이블에 새 열을 추가한 후 다음 문을 사용하여 속성 그래프 정의를 업데이트합니다. 자세한 내용은 기존 노드 또는 에지 정의 업데이트를 참고하세요.

    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 여행을 위해 저축

다음 단계