상세 컨텐츠

본문 제목

벡터 검색을 통한 검색 혁명 Alloy DB

Dev Type

by ai developer 2024. 5. 17. 11:30

본문

 

방대한 데이터를 탐색하는 것은 상당히 어렵고 시간과 비용이 많이 드는 과정입니다.

하지만 최근 이런 문제들을 해결하는 솔루션을 발견해서 소개합니다.

 

이 솔루션의 비결은 벡터 검색에 있습니다. 벡터 검색은 단순한 키워드 일치에 의존하는 대신 텍스트를 임베딩으로 변환합니다. 이를 통해서 사용된 특정 단어 뿐 아니라 쿼리의 의미를 기반으로 검색하게 됩니다. 수 많은 문헌 및 특허를 검색할 때, 이런 검색은 획기적인 방식입니다.

예를 들어 포함된 정확한 문구로 검색하지 않고 "VR 안경" 으로 수 많은 특허 데이터베이스를 검색할 수 있게 됩니다!

 

작동 방식

데이터 저장소: 특허 데이터는 엔터프라이즈급 성능, 가용성 및 규모를 제공하는 완전 관리형 PostgreSQL 호환 데이터베이스 서비스인 AlloyDB에 저장됩니다. AlloyDB는 고성능, 가용성, 확장성, 보안 및 규정 준수를 포함하여 까다로운 트랜잭션 및 분석 워크로드에 적합한 다양한 기능을 제공합니다.

 

pgVector 확장: pgVector 확장은 AlloyDB에 강력한 벡터 조작 기능을 추가하여 텍스트 임베딩을 저장하고 검색하는 데 이상적입니다.

생성 벡터를 위한 임베딩: 특허 요약 및 사용자 검색 텍스트를 임베딩이라는 수치 표현으로 변환합니다. 이를 통해 의미론적 검색을 수행할 수 있습니다. 즉, 단순히 키워드 중복이 아닌 의미와 맥락을 기반으로 특허를 찾을 수 있습니다.

 

코사인 유사성을 통한 실시간 매칭: 두 벡터(및 두 개의 텍스트 조각)가 얼마나 유사한지를 측정하는 수학적 방법인 코사인 유사성은 관련성에 따라 검색 결과의 순위를 매기는 데 사용됩니다. 사용자가 검색어를 입력하면 이를 임베딩으로 변환한 다음 이러한 임베딩과 저장된 특허 임베딩 간의 코사인 유사성을 계산합니다. 이는 사용자의 표현이 특허 텍스트와 완벽하게 일치하지 않는 경우에도 가장 관련성이 높은 특허를 신속하게 식별합니다.

 

Cloud 기능 배포: 전체 검색 프로세스는 손쉽게 확장하고 비용을 절감하는 서버리스 솔루션인 Cloud Function에 포함됩니다. 개발자가 서버나 런타임 환경을 관리할 필요 없이 클라우드 이벤트에 응답하는 단일 목적의 독립형 기능을 생성할 수 있는 경량 컴퓨팅 솔루션입니다.

 

이 다이어그램은 구현의 상위 수준 흐름을 나타냅니다. Langchain, RAG 및 기타 신속한 엔지니어링 단계를 통해 이를 강화하고 표준화할 수 있습니다.

 

 

실습 시간

이 구현은 Cloud Function에 배포된 Alloy DB SQL DDL, DML, 간단한 선택 쿼리를 통해 수행됩니다.

간단한 5단계로 Alloy DB 및 Vertex AI 통합을 사용하여 특허 검색 애플리케이션을 구축할 수 있습니다!

설정

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택 하거나 만듭니다 .
  2. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인하세요. 프로젝트에 결제가 활성화되어 있는지 확인하는 방법을 알아보세요 .
  3. Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다. Cloud Console에서 오른쪽 상단에 있는 Cloud Shell 활성화를 클릭합니다.
  4. 아직 활성화하지 않은 경우 이 구현에 필요한 API를 활성화합니다. 먼저 AlloyDB, Vertex AI, Cloud Functions, Compute 및 Cloud Run용 API를 활성화합니다.
gcloud services enable spanner.googleapis.com,functions.googleapis.com,run.googleapis.com,compute.googleapis.com

 

API가 누락된 경우 구현 과정에서 언제든지 활성화할 수 있습니다.

 

AlloyDB 객체 생성

클러스터 ID가 "patent-cluster", 비밀번호가 "alloydb", PostgreSQL 15 호환, 지역이 "us-central1"이고 네트워킹이 "default"로 설정된 클러스터와 인스턴스를 만듭니다 . 인스턴스 ID를 "patent-instance"로 설정합니다. 클러스터 생성을 클릭합니다. AlloyDB Studio에서 아래 DDL 문을 사용하여 테이블을 만들 수 있습니다.

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT) ;

확장 기능 활성화

특허 검색 앱을 구축하기 위해 pgVector 및 google_ml_integration 확장을 사용합니다. pgVector 확장을 사용하면 벡터 임베딩을 저장하고 검색할 수 있습니다. google_ml_integration 확장 프로그램  Vertex AI 예측 엔드포인트에 액세스하여 SQL로 예측을 얻는 데 사용하는 함수를 제공합니다. 다음 DDL을 실행하여 이러한 확장을 활성화합니다 .

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

 

권한 부여

 

아래 명령문을 실행하여 "임베딩" 기능에 대한 실행 권한을 부여합니다.

GRANT EXECUTE ON FUNCTION embedding TO postgres;

임베딩을 저장하기 위한 벡터 열을 추가하도록 테이블을 변경합니다.

아래 DDL을 실행하여 방금 생성한 테이블에 abstract_embeddings 필드를 추가합니다. 이 열은 텍스트의 벡터 값을 저장할 수 있습니다.

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

데이터 삽입

 리포지토리 에서 DML 문을 실행하여 새로 생성된 테이블에 특허 데이터를 생성합니다.

AlloyDB 서비스 계정 PRINCIPAL에 Vertex AI 사용자 ROLE 부여

Google Cloud IAM 콘솔에서 AlloyDB 서비스 계정( service-PROJECT_NUMBER@gcp-sa-alloydb.iam.gserviceaccount.com 형식 )에 'Vertex AI 사용자' 역할에 대한 액세스 권한을 부여합니다.

임베딩 기능 테스트

다음 샘플 쿼리를 실행하여 임베딩 기능을 테스트합니다.

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

 

그러면 쿼리의 샘플 텍스트에 대해 부동 소수점 배열처럼 보이는 임베딩 벡터가 반환되어야 합니다. 다음과 같습니다.

 

 

abstract_embeddings 벡터 필드 업데이트

아래 DML을 실행하여 테이블의 특허 요약을 해당 임베딩으로 업데이트합니다.

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

코사인 유사성을 이용한 벡터 검색

이제 테이블, 데이터, 임베딩이 모두 준비되었으므로 사용자 검색 텍스트에 대해 실시간 벡터 검색을 수행해 보겠습니다. 아래 쿼리를 실행하여 이를 테스트할 수 있습니다.

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

 

이 쿼리에서는

  1. 사용자 검색 텍스트는 "새로운 자연어 처리 관련 기계 학습 모델"입니다.
  2. textembedding-gecko@003 모델을 사용하여 embedding() 메서드에서 이를 임베딩으로 변환하고 있습니다.
  3. "<=>"는 COSINE SIMILARITY 거리 방법의 사용을 나타냅니다.
  4. 데이터베이스에 저장된 벡터와 호환되도록 임베딩 방법의 결과를 벡터 유형으로 변환하고 있습니다.
  5. LIMIT 10은 검색 텍스트와 가장 가까운 일치 항목 10개를 선택한다는 것을 나타냅니다.

결과는 다음과 같습니다.

 

 

결과에서 볼 수 있듯이 일치 항목이 검색 텍스트와 매우 유사합니다.

이 앱을 웹으로 가져올 준비가 되셨나요?

  1. Cloud Shell 편집기로 이동하여 편집기 왼쪽 하단(상태 표시줄)에 있는 'Cloud Code - 로그인' 아이콘을 클릭하세요. 결제가 활성화된 현재 Google Cloud 프로젝트를 선택하고 Gemini에서도 동일한 프로젝트에 로그인했는지 확인하세요(상태 표시줄의 오른쪽 모서리).
  2. Cloud Code 아이콘을 클릭하고 Cloud Code 대화상자가 나타날 때까지 기다립니다. 새 애플리케이션을 선택하고 새 애플리케이션 만들기 팝업에서 Cloud Functions 애플리케이션을 선택합니다.

 

Create New Application 팝업의 2/2페이지에서 Java: Hello World를 선택 하고 원하는 위치에 프로젝트 이름을 "alloydb-pgVector"로 입력한 후 확인을 클릭합니다.

 

3. 결과 프로젝트 구조에서 pom.xml을 검색하여 repo 파일 의 콘텐츠로 바꿉니다 . 여기에는 몇 가지 외에 다음과 같은 종속성이 있어야 합니다.

<!-- Add the connector with the latest version -->
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>alloydb-jdbc-connector</artifactId>
  <version>1.1.1</version>
</dependency>

<!-- Add the driver with the latest version -->
<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.6.0</version>
</dependency>

 

4. HelloWorld.java 파일을 repo 파일 의 콘텐츠로 바꿉니다 .

 

아래 값을 실제 값으로 바꿔야 합니다.

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values
Note that the function expects the search text as input parameter with key "search" and in this implementation, we are returning only one closest match from the database:

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
    //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
    try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
      ResultSet resultSet = statement.executeQuery();
      resultSet.next();
      String lit = resultSet.getString("literature");
      result = result + lit + "\n";
      System.out.println("Matching Literature: " + lit);
  }
writer.write("Here is the closest match: " + result);
}

 

5. 방금 생성한 Cloud 함수를 배포하려면 Cloud Shell 터미널에서 다음 명령을 실행합니다. 먼저 다음 명령을 사용하여 해당 프로젝트 폴더로 이동해야 합니다.

cd alloydb-pgvector

 

그런 다음 다음 명령을 실행합니다.

gcloud functions deploy patent-search - gen2 - region=us-central1 - runtime=java11 - source=. - entry-point=cloudcode.helloworld.HelloWorld - trigger-http

 

배포되면 다음 형식의 링크를 사용해야 합니다.

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

다음 명령어를 실행하여 Cloud Shell 터미널에서 테스트할 수 있습니다.

gcloud functions call patent-search - region=us-central1 - gen2 - data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

 

결과

 

특허 검색 기능의 gcloud function 호출 명령어에 대한 Cloud Shell 터미널 결과

Cloud Functions 목록 에서 테스트할 수도 있습니다 . 배포된 기능을 선택하고 "테스트" 탭으로 이동합니다. 요청 json에 대한 트리거 이벤트 구성 섹션 텍스트 상자에 다음을 입력합니다.

{"search": "A new Natural Language Processing related Machine Learning Model"}

 

TEST THE FUNCTION 버튼을 클릭하면 페이지 오른쪽에서 결과를 볼 수 있습니다.

 

그게 다야! AlloyDB 데이터에 대한 임베딩 모델을 사용하여 유사성 벡터 검색을 수행하는 것은 매우 간단합니다.

300x250

관련글 더보기

댓글 영역