AlloyDB, 벡터 검색 등을 사용하여 특허 검색 앱 빌드 Vertex AI입니다.

1. 개요

다양한 업계에서 특허 조사는 경쟁 환경을 파악하고, 잠재적인 라이선스 구매 또는 획득 기회를 파악하고, 기존 특허를 침해하지 않기 위한 중요한 도구입니다.

특허 조사는 방대하고 복잡합니다. 수많은 기술 개요를 검토하여 관련 혁신을 찾는 것은 쉽지 않은 작업입니다. 기존의 키워드 기반 검색은 부정확하고 시간이 많이 소요되는 경우가 많습니다. 초록이 길고 기술적이어서 핵심 아이디어를 빠르게 파악하기 어렵습니다. 이로 인해 연구원이 중요한 특허를 놓치거나 관련 없는 결과에 시간을 낭비할 수 있습니다.

이 혁신의 비결은 벡터 검색에 있습니다. 벡터 검색은 간단한 키워드 일치를 사용하는 대신 텍스트를 수치적 표현 (임베딩)으로 변환합니다. 이를 통해 사용된 특정 단어뿐만 아니라 검색어의 의미를 기반으로 검색할 수 있습니다. 이는 문헌 검색의 판도를 바꿀 수 있는 혁명적인 변화입니다. 문서에 정확한 구문이 사용되지 않더라도 '웨어러블 심박수 모니터'에 대한 특허를 찾는 경우를 가정해 보겠습니다.

목표

이 Codelab에서는 AlloyDB, pgvector 확장 프로그램, 인플레이스 Gemini 1.5 Pro, 임베딩, 벡터 검색을 활용하여 특허 검색 프로세스를 더 빠르고 직관적이며 매우 정확하게 만드는 방법을 알아봅니다.

빌드할 항목

이 실습에서는 다음을 수행합니다.

  1. AlloyDB 인스턴스를 만들고 특허 공개 데이터 세트 데이터를 로드합니다.
  2. AlloyDB에서 pgvector 및 생성형 AI 모델 확장 프로그램 사용 설정
  3. 통계에서 임베딩 생성
  4. 사용자 검색 텍스트에 대한 실시간 코사인 유사성 검색 실행
  5. 서버리스 Cloud Functions에 솔루션 배포

다음 다이어그램은 데이터 흐름과 구현에 포함된 단계를 나타냅니다.

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

요구사항

  • 브라우저(Chrome 또는 Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트.

2. 시작하기 전에

프로젝트 만들기

  1. Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
  2. Cloud 프로젝트에 결제가 사용 설정되어 있어야 하므로 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요 .
  3. bq가 미리 로드되어 제공되는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다. Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다.

Cloud Shell 활성화 버튼 이미지

  1. Cloud Shell에 연결되면 다음 명령어를 사용하여 이미 인증되었는지, 프로젝트가 프로젝트 ID로 설정되어 있는지 확인합니다.
gcloud auth list
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
  1. 프로젝트가 설정되지 않은 경우 다음 명령어를 사용하여 설정합니다.
gcloud config set project <YOUR_PROJECT_ID>
  1. 필요한 API를 사용 설정합니다. Cloud Shell 터미널에서 gcloud 명령어를 사용할 수 있습니다.
gcloud services enable alloydb.googleapis.com \ 
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

gcloud 명령어의 대안은 콘솔을 통해 각 제품을 검색하거나 이 링크를 사용하는 것입니다.

gcloud 명령어 및 사용법은 문서를 참조하세요.

3. AlloyDB 데이터베이스 준비

특허 데이터 세트가 로드될 AlloyDB 클러스터, 인스턴스, 테이블을 만들어 보겠습니다.

AlloyDB 객체 만들기

클러스터 ID가 'patent-cluster', 비밀번호가 'alloydb', PostgreSQL 15 호환, 리전이 'us-central1', 네트워킹이 'default'로 설정된 클러스터 및 인스턴스를 만듭니다. 인스턴스 ID를 'patent-instance'로 설정합니다. 클러스터 만들기를 클릭합니다. 클러스터를 만드는 방법에 관한 자세한 내용은 https://cloud.google.com/alloydb/docs/cluster-create 링크를 참고하세요.

테이블 만들기

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;

AlloyDB 서비스 계정에 Vertex AI 사용자 역할 부여하기

Google Cloud IAM 콘솔에서 AlloyDB 서비스 계정 (service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com 형식)에 'Vertex AI 사용자' 역할에 대한 액세스 권한을 부여합니다. PROJECT_NUMBER에는 프로젝트 번호가 포함됩니다.

또는 gcloud 명령어를 사용하여 액세스 권한을 부여할 수도 있습니다.

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

임베딩을 저장할 벡터 열을 추가하도록 테이블 변경

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

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. 데이터베이스에 특허 데이터 로드

BigQuery의 Google 특허 공개 데이터 세트가 데이터 세트로 사용됩니다. AlloyDB 스튜디오를 사용하여 쿼리를 실행합니다. alloydb-pgvector 저장소에는 특허 데이터를 로드하기 위해 실행할 insert_into_patents_data.sql 스크립트가 포함되어 있습니다.

  1. Google Cloud 콘솔에서 AlloyDB 페이지를 엽니다.
  2. 새로 만든 클러스터를 선택하고 인스턴스를 클릭합니다.
  3. AlloyDB 탐색 메뉴에서 AlloyDB 스튜디오를 클릭합니다. 사용자 인증 정보로 로그인합니다.
  4. 오른쪽에 있는 새 탭 아이콘을 클릭하여 새 탭을 엽니다.
  5. 위에 언급된 insert_into_patents_data.sql 스크립트에서 insert 쿼리 문을 편집기에 복사합니다. 이 사용 사례를 빠르게 데모하려면 50~100개의 삽입 문을 복사하면 됩니다.
  6. 실행을 클릭합니다. 쿼리 결과가 결과 테이블에 표시됩니다.

5. 특허 데이터의 임베딩 만들기

먼저 다음 샘플 쿼리를 실행하여 임베딩 함수를 테스트해 보겠습니다.

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

그러면 쿼리의 샘플 텍스트에 대한 임베딩 벡터(부동 소수점 배열처럼 보임)가 반환됩니다. 다음과 같이 표시됩니다.

25a1d7ef0e49e91e.png

abstract_embeddings 벡터 필드 업데이트

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

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

6. 벡터 검색 실행

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

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개를 선택한다는 것을 나타냅니다.

결과는 다음과 같습니다.

8e77af965fc787ae.png

검색 결과에서 볼 수 있듯이 검색어와 상당히 유사한 검색 결과가 표시됩니다.

7. 애플리케이션을 웹으로 가져가기

앱을 웹으로 가져갈 준비가 되셨나요? 다음 단계를 따르세요.

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

a800ee1eb6cb8a5b.png

새 애플리케이션 만들기 팝업의 2/2 페이지에서 Java: Hello World를 선택하고 원하는 위치에 프로젝트 이름을 'alloydb-pgvector'로 입력한 후 확인을 클릭합니다.

5b09446ecf7d4f8d.png

  1. 결과로 생성된 프로젝트 구조에서 pom.xml을 검색하여 저장소 파일의 콘텐츠로 바꿉니다. 몇 가지 종속 항목 외에도 다음 종속 항목이 있어야 합니다.

2b3a3cdd75a57711.png

  1. 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

이 함수는 'search' 키를 사용하여 검색 텍스트를 입력 매개변수로 예상하며 이 구현에서는 데이터베이스에서 가장 근접한 항목 하나만 반환합니다.

// 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);
}
  1. 방금 만든 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

중요 단계:

배포를 설정하면 Google Cloud Run Functions 콘솔에 함수가 표시됩니다. 새로 만든 함수를 검색하여 열고 구성을 수정한 다음 다음을 변경합니다.

  1. 런타임, 빌드, 연결, 보안 설정으로 이동
  2. 시간 제한을 180초로 늘립니다.
  3. '연결' 탭으로 이동합니다.

4e83ec8a339cda08.png

  1. 인그레스 설정에서 '모든 트래픽 허용'이 선택되어 있는지 확인합니다.
  2. 이그레스 설정에서 네트워크 드롭다운을 클릭하고 '새 VPC 커넥터 추가' 옵션을 선택한 다음 표시되는 대화상자의 안내를 따릅니다.

8126ec78c343f199.png

  1. VPC 커넥터의 이름을 지정하고 리전이 인스턴스와 동일한지 확인합니다. 네트워크 값은 기본값으로 두고 서브넷을 맞춤 IP 범위로 설정하여 IP 범위를 10.8.0.0으로 설정하거나 사용 가능한 유사한 값을 설정합니다.
  2. '확장 설정 표시'를 펼치고 구성이 다음과 정확히 일치하는지 확인합니다.

7baf980463a86a5c.png

  1. '만들기'를 클릭하면 이 커넥터가 이그레스 설정에 표시됩니다.
  2. 새로 만든 커넥터를 선택합니다.
  3. 모든 트래픽이 이 VPC 커넥터를 통해 라우팅되도록 선택합니다.

8. 애플리케이션 테스트

배포가 완료되면 다음과 같은 형식으로 엔드포인트가 표시됩니다.

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"}'

결과:

da3dcfac7d024031.png

Cloud Functions 목록에서 테스트할 수도 있습니다. 배포된 함수를 선택하고 'TESTING' 탭으로 이동합니다. 요청 JSON의 트리거 이벤트 구성 섹션 텍스트 상자에 다음을 입력합니다.

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

'함수 테스트' 버튼을 클릭하면 페이지 오른쪽에 결과가 표시됩니다.

e21f806d661996ff.png

작업이 끝났습니다. AlloyDB 데이터에서 임베딩 모델을 사용하여 유사성 벡터 검색을 실행하는 방법은 간단합니다.

9. 삭제

이 게시물에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 관리 로 이동합니다.
  2. 리소스 페이지를 참고하세요.
  3. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  4. 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.

10. 축하합니다

축하합니다. AlloyDB, pgvector, 벡터 검색을 사용하여 유사성 검색을 실행했습니다. AlloyDB, Vertex AI, 벡터 검색의 기능을 결합하여 Google은 문헌 검색을 접근성, 효율성, 의미 중심적으로 개선하는 데 큰 진전을 이루었습니다.