비공개 서비스 액세스 (VPC 네트워크 피어링) 또는 Private Service Connect 색인 쿼리

VPC 네트워크 피어링 또는 Private Service Connect 색인 엔드포인트를 배포한 후 쿼리는 배포 방법에 따라 약간 다릅니다.

Private Service Connect 자동화로 배포됨

Private Service Connect 자동화로 배포된 IndexEndpoints의 경우 Python SDK가 Private Service Connect 네트워크를 적절한 엔드포인트에 자동으로 매핑합니다. Python SDK를 사용하지 않는 경우 Private Service Connect 수동 배포 쿼리 안내에 따라 생성된 엔드포인트의 IP 주소에 직접 연결해야 합니다.

Python

Vertex AI SDK for Python을 설치하거나 업데이트하는 방법은 Vertex AI SDK for Python 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

def vector_search_match_psc_automation(
    project: str,
    location: str,
    index_endpoint_name: str,
    deployed_index_id: str,
    queries: List[List[float]],
    num_neighbors: int,
    psc_network: str,
) -> List[List[aiplatform.matching_engine.matching_engine_index_endpoint.MatchNeighbor]]:
    """Query the vector search index deployed with PSC automation.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_endpoint_name (str): Required. Index endpoint to run the query
        against. The endpoint must be a private endpoint.
        deployed_index_id (str): Required. The ID of the DeployedIndex to run
        the queries against.
        queries (List[List[float]]): Required. A list of queries. Each query is
        a list of floats, representing a single embedding.
        num_neighbors (int): Required. The number of neighbors to return.
        ip_address (str): Required. The IP address of the PSC endpoint. Obtained
        from the created compute address used in the fordwarding rule to the
        endpoint's service attachment.
        psc_network (str): The network the endpoint was deployed to via PSC
        automation configuration. The format is
        projects/{project_id}/global/networks/{network_name}.

    Returns:
        List[List[aiplatform.matching_engine.matching_engine_index_endpoint.MatchNeighbor]] - A list of nearest neighbors for each query.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index endpoint instance from an existing endpoint.
    my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(
        index_endpoint_name=index_endpoint_name
    )

    # Query the index endpoint for matches.
    resp = my_index_endpoint.match(
        deployed_index_id=deployed_index_id,
        queries=queries,
        num_neighbors=num_neighbors,
        psc_network=psc_network
    )
    return resp

Private Service Connect 수동 구성으로 배포됨

수동으로 구성된 연결을 사용하여 배포된 Private Service Connect IndexEndpoints의 경우 엔드포인트의 Private Service Connect 서비스 연결에 전달된 컴퓨팅 주소의 IP 주소를 사용하여 엔드포인트에 액세스합니다.

아직 알 수 없는 경우 gcloud ai index-endpoints describegcloud compute forwarding-rules list 명령어를 사용하여 서비스 첨부파일 URI로 전달된 IP 주소를 가져올 수 있습니다.

다음을 바꿉니다.

  • INDEX_ENDPOINT_ID: 정규화된 색인 엔드포인트 ID입니다.
  • REGION: 색인 엔드포인트가 배포된 리전입니다.
SERVICE_ATTACHMENT_URI=`gcloud ai index-endpoints describe INDEX_ENDPOINT_ID \
  --region=REGION \
  --format="value(deployedIndexes.privateEndpoints.serviceAttachment)"`

gcloud compute forwarding-rules list --filter="TARGET:${SERVICE_ATTACHMENT_URI}"

출력에는 IndexEndpoint를 쿼리할 때 사용할 내부 IP 주소가 포함됩니다.

Python

Vertex AI SDK for Python을 설치하거나 업데이트하는 방법은 Vertex AI SDK for Python 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

def vector_search_match_psc_manual(
    project: str,
    location: str,
    index_endpoint_name: str,
    deployed_index_id: str,
    queries: List[List[float]],
    num_neighbors: int,
    ip_address: str,
) -> List[List[aiplatform.matching_engine.matching_engine_index_endpoint.MatchNeighbor]]:
    """Query the vector search index deployed with PSC manual configuration.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_endpoint_name (str): Required. Index endpoint to run the query
        against. The endpoint must be a private endpoint.
        deployed_index_id (str): Required. The ID of the DeployedIndex to run
        the queries against.
        queries (List[List[float]]): Required. A list of queries. Each query is
        a list of floats, representing a single embedding.
        num_neighbors (int): Required. The number of neighbors to return.
        ip_address (str): Required. The IP address of the PSC endpoint. Obtained
        from the created compute address used in the forwarding rule to the
        endpoint's service attachment.

    Returns:
        List[List[aiplatform.matching_engine.matching_engine_index_endpoint.MatchNeighbor]] - A list of nearest neighbors for each query.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index endpoint instance from an existing endpoint.
    my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(
        index_endpoint_name=index_endpoint_name
    )

    # Set the IP address of the PSC endpoint.
    my_index_endpoint.private_service_connect_ip_address = ip_address

    # Query the index endpoint for matches.
    resp = my_index_endpoint.match(
        deployed_index_id=deployed_index_id,
        queries=queries,
        num_neighbors=num_neighbors
    )
    return resp

명령줄

DeployedIndex를 쿼리하려면 포트 10000에서 TARGET_IP에 연결하고 Match 또는 BatchMatch 메서드를 호출합니다. 또한 특정 임베딩 ID를 사용하여 쿼리할 수 있습니다.

다음 예시에서는 오픈소스 도구인 grpc_cli를 사용하여 배포된 색인 서버로 gRPC 요청을 보냅니다.

첫 번째 예시에서는 Match 메서드를 사용하여 단일 쿼리를 보냅니다.

./grpc_cli call ${TARGET_IP}:10000 google.cloud.aiplatform.container.v1.MatchService.Match 'deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [-0.1,..]'

두 번째 예시에서는 두 개의 개별 쿼리를 동일한 BatchMatch 요청으로 결합합니다.

./grpc_cli call ${TARGET_IP}:10000 google.cloud.aiplatform.container.v1.MatchService.BatchMatch 'requests: [{deployed_index_id: "${DEPLOYED_INDEX_ID}", requests: [{deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [-0.1,..]}, {deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [-0.2,..]}]}]'

[서비스가 피어링된 동일한 VPC](#vpc-network-peering-setup)에서 실행 중인 클라이언트에서 이러한 API를 호출해야 합니다.

embedding_id를 사용하여 쿼리를 실행하려면 다음 예시를 사용하세요.

./grpc_cli call ${TARGET_IP}:10000  google.cloud.aiplatform.container.v1.MatchService.Match "deployed_index_id:'"test_index1"',embedding_id: '"606431"'"

이 예에서는 토큰 및 숫자 제한을 사용하여 쿼리를 전송합니다.

./grpc_cli call ${TARGET_IP}:10000 google.cloud.aiplatform.container.v1.MatchService.Match 'deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [1, 1], "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}, numeric_restricts: [{name: "double-ns", value_double: 0.3, op: LESS_EQUAL}, {name: "double-ns", value_double: -1.2, op: GREATER}, {name: "double-ns", value_double: 0., op: NOT_EQUAL}], restricts: [{name: "color", allow_tokens: ["red"]}]'

자세한 내용은 클라이언트 라이브러리 설명을 참조하세요.

콘솔

다음 안내에 따라 콘솔에서 VPC 색인을 쿼리합니다.

  1. Google Cloud 콘솔의 Vertex AI 섹션에서 배포 및 사용 섹션으로 이동합니다. 벡터 검색을 선택합니다.

    벡터 검색으로 이동

  2. 쿼리할 VPC 색인을 선택합니다. 색인 정보 페이지가 열립니다.
  3. 배포된 색인 섹션까지 아래로 스크롤하고 쿼리할 배포된 색인을 선택합니다. 배포된 색인 정보 페이지가 열립니다.
  4. 쿼리 색인 섹션에서 쿼리 매개변수를 선택합니다. 벡터 또는 특정 데이터 포인트로 쿼리하도록 선택할 수 있습니다.
  5. 오픈소스 도구인 grpc_cli를 사용하거나 Vertex AI SDK for Python을 사용하여 쿼리를 실행합니다.

VPC 네트워크 피어링으로 배포됨

Python

Vertex AI SDK for Python을 설치하거나 업데이트하는 방법은 Vertex AI SDK for Python 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

참고: Python SDK는 VPC 네트워크 피어링으로 배포된 IndexEndpoint의 IP 주소를 자동으로 조회합니다.

def vector_search_match_hybrid_queries(
    project: str,
    location: str,
    index_endpoint_name: str,
    deployed_index_id: str,
    num_neighbors: int,
) -> List[List[aiplatform.matching_engine.matching_engine_index_endpoint.MatchNeighbor]]:
    """Query the vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_endpoint_name (str): Required. Index endpoint to run the query
        against. The endpoint must be a private endpoint.
        deployed_index_id (str): Required. The ID of the DeployedIndex to run
        the queries against.
        num_neighbors (int): Required. The number of neighbors to return.

    Returns:
        List[List[aiplatform.matching_engine.matching_engine_index_endpoint.MatchNeighbor]] - A list of nearest neighbors for each query.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index endpoint instance from an existing endpoint.
    my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(
        index_endpoint_name=index_endpoint_name
    )

    # Example queries containing hybrid datapoints, sparse-only datapoints, and
    # dense-only datapoints.
    hybrid_queries = [
        aiplatform.matching_engine.matching_engine_index_endpoint.HybridQuery(
            dense_embedding=[1, 2, 3],
            sparse_embedding_dimensions=[10, 20, 30],
            sparse_embedding_values=[1.0, 1.0, 1.0],
            rrf_ranking_alpha=0.5,
        ),
        aiplatform.matching_engine.matching_engine_index_endpoint.HybridQuery(
            dense_embedding=[1, 2, 3],
            sparse_embedding_dimensions=[10, 20, 30],
            sparse_embedding_values=[0.1, 0.2, 0.3],
        ),
        aiplatform.matching_engine.matching_engine_index_endpoint.HybridQuery(
            sparse_embedding_dimensions=[10, 20, 30],
            sparse_embedding_values=[0.1, 0.2, 0.3],
        ),
        aiplatform.matching_engine.matching_engine_index_endpoint.HybridQuery(
            dense_embedding=[1, 2, 3]
        ),
    ]

    # Query the index endpoint for matches.
    resp = my_index_endpoint.match(
        deployed_index_id=deployed_index_id,
        queries=hybrid_queries,
        num_neighbors=num_neighbors,
    )
    return resp

명령줄

DeployedIndex에는 TARGET_IP가 있으며, 이는 IndexEndpoints 목록에서 검색할 수 있습니다.

DeployedIndex를 쿼리하려면 포트 10000에서 TARGET_IP에 연결하고 Match 또는 BatchMatch 메서드를 호출합니다. 또한 특정 임베딩 ID를 사용하여 쿼리할 수 있습니다.

다음 예시에서는 오픈소스 도구인 grpc_cli를 사용하여 배포된 색인 서버로 gRPC 요청을 보냅니다.

첫 번째 예시에서는 Match 메서드를 사용하여 단일 쿼리를 보냅니다.

./grpc_cli call ${TARGET_IP}:10000 google.cloud.aiplatform.container.v1.MatchService.Match 'deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [-0.1,..]'

두 번째 예시에서는 두 개의 개별 쿼리를 동일한 BatchMatch 요청으로 결합합니다.

./grpc_cli call ${TARGET_IP}:10000 google.cloud.aiplatform.container.v1.MatchService.BatchMatch 'requests: [{deployed_index_id: "${DEPLOYED_INDEX_ID}", requests: [{deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [-0.1,..]}, {deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [-0.2,..]}]}]'

[서비스가 피어링된 동일한 VPC](#vpc-network-peering-setup)에서 실행 중인 클라이언트에서 이러한 API를 호출해야 합니다.

embedding_id를 사용하여 쿼리를 실행하려면 다음 예시를 사용하세요.

./grpc_cli call ${TARGET_IP}:10000  google.cloud.aiplatform.container.v1.MatchService.Match "deployed_index_id:'"test_index1"',embedding_id: '"606431"'"

이 예에서는 토큰 및 숫자 제한을 사용하여 쿼리를 전송합니다.

./grpc_cli call ${TARGET_IP}:10000 google.cloud.aiplatform.container.v1.MatchService.Match 'deployed_index_id: "${DEPLOYED_INDEX_ID}", float_val: [1, 1], "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}, numeric_restricts: [{name: "double-ns", value_double: 0.3, op: LESS_EQUAL}, {name: "double-ns", value_double: -1.2, op: GREATER}, {name: "double-ns", value_double: 0., op: NOT_EQUAL}], restricts: [{name: "color", allow_tokens: ["red"]}]'

자세한 내용은 클라이언트 라이브러리 설명을 참조하세요.

콘솔

다음 안내에 따라 콘솔에서 VPC 색인을 쿼리합니다.

  1. Google Cloud 콘솔의 Vertex AI 섹션에서 배포 및 사용 섹션으로 이동합니다. 벡터 검색을 선택합니다.

    벡터 검색으로 이동

  2. 쿼리할 VPC 색인을 선택합니다. 색인 정보 페이지가 열립니다.
  3. 배포된 색인 섹션까지 아래로 스크롤하고 쿼리할 배포된 색인을 선택합니다. 배포된 색인 정보 페이지가 열립니다.
  4. 쿼리 색인 섹션에서 쿼리 매개변수를 선택합니다. 벡터 또는 특정 데이터 포인트로 쿼리하도록 선택할 수 있습니다.
  5. 오픈소스 도구인 grpc_cli를 사용하거나 Vertex AI SDK for Python을 사용하여 쿼리를 실행합니다.

성능에 영향을 주는 쿼리 시간 설정

다음 쿼리 시간 매개변수는 벡터 검색을 사용할 때 지연 시간, 가용성, 비용에 영향을 미칠 수 있습니다. 이 가이드는 대부분의 케이스에 적용됩니다. 하지만 항상 구성으로 실험하여 사용 사례에 적합한지 확인해야 합니다.

매개변수 정의는 색인 구성 매개변수를 참조하세요.

매개변수 정보 성능 영향
approximateNeighborsCount

각 샤드에서 검색할 적합한 결과 수를 알고리즘에 알려줍니다.

approximateNeighborsCount 값은 항상 setNeighborsCount 값보다 커야 합니다. setNeighborsCount 값이 작으면 approximateNeighborsCount에 이 값의 10배가 권장됩니다. setNeighborsCount 값이 크면 더 작은 배수를 사용할 수 있습니다.

approximateNeighborsCount 값을 늘리면 다음과 같이 성능이 영향을 받을 수 있습니다.

  • 재현율: 증가
  • 지연 시간: 잠재적으로 증가
  • 가용성: 영향 없음
  • 비용: 검색 중에 더 많은 데이터가 처리되므로 증가할 수 있음

approximateNeighborsCount 값을 줄이면 다음과 같이 성능이 영향을 받을 수 있습니다.

  • 재현율: 감소
  • 지연 시간: 잠재적으로 감소
  • 가용성: 영향 없음
  • 비용: 검색 중에 더 적은 데이터가 처리되므로 비용이 감소할 수 있음
setNeighborCount 쿼리에서 반환할 결과 수를 지정합니다.

값이 300이하면 대부분의 사용 사례에서 성능이 유지됩니다. 값이 더 크면 특정 사용 사례에 맞게 테스트합니다.

fractionLeafNodesToSearch 최근접 이웃을 검색할 때 방문할 리프 노드 비율을 제어합니다. 이는 리프 노드당 임베딩이 많을수록 리프당 더 많은 데이터가 검사된다는 점에서 leafNodeEmbeddingCount와 관련이 있습니다.

fractionLeafNodesToSearch 값을 늘리면 다음과 같이 성능이 영향을 받을 수 있습니다.

  • 재현율: 증가
  • 지연 시간: 증가
  • 가용성: 영향 없음
  • 비용: 지연 시간이 높을수록 머신 리소스를 더 많이 점유하므로 증가할 수 있음

fractionLeafNodesToSearch 값을 줄이면 다음과 같이 성능이 영향을 받을 수 있습니다.

  • 재현율: 감소
  • 지연 시간: 감소
  • 가용성: 영향 없음
  • 비용: 지연 시간이 낮을수록 머신 리소스를 더 적게 점유하므로 감소할 수 있음

다음 단계