방대한 데이터를 탐색하는 것은 상당히 어렵고 시간과 비용이 많이 드는 과정입니다.
하지만 최근 이런 문제들을 해결하는 솔루션을 발견해서 소개합니다.
이 솔루션의 비결은 벡터 검색에 있습니다. 벡터 검색은 단순한 키워드 일치에 의존하는 대신 텍스트를 임베딩으로 변환합니다. 이를 통해서 사용된 특정 단어 뿐 아니라 쿼리의 의미를 기반으로 검색하게 됩니다. 수 많은 문헌 및 특허를 검색할 때, 이런 검색은 획기적인 방식입니다.
예를 들어 포함된 정확한 문구로 검색하지 않고 "VR 안경" 으로 수 많은 특허 데이터베이스를 검색할 수 있게 됩니다!
데이터 저장소: 특허 데이터는 엔터프라이즈급 성능, 가용성 및 규모를 제공하는 완전 관리형 PostgreSQL 호환 데이터베이스 서비스인 AlloyDB에 저장됩니다. AlloyDB는 고성능, 가용성, 확장성, 보안 및 규정 준수를 포함하여 까다로운 트랜잭션 및 분석 워크로드에 적합한 다양한 기능을 제공합니다.
pgVector 확장: pgVector 확장은 AlloyDB에 강력한 벡터 조작 기능을 추가하여 텍스트 임베딩을 저장하고 검색하는 데 이상적입니다.
생성 벡터를 위한 임베딩: 특허 요약 및 사용자 검색 텍스트를 임베딩이라는 수치 표현으로 변환합니다. 이를 통해 의미론적 검색을 수행할 수 있습니다. 즉, 단순히 키워드 중복이 아닌 의미와 맥락을 기반으로 특허를 찾을 수 있습니다.
코사인 유사성을 통한 실시간 매칭: 두 벡터(및 두 개의 텍스트 조각)가 얼마나 유사한지를 측정하는 수학적 방법인 코사인 유사성은 관련성에 따라 검색 결과의 순위를 매기는 데 사용됩니다. 사용자가 검색어를 입력하면 이를 임베딩으로 변환한 다음 이러한 임베딩과 저장된 특허 임베딩 간의 코사인 유사성을 계산합니다. 이는 사용자의 표현이 특허 텍스트와 완벽하게 일치하지 않는 경우에도 가장 관련성이 높은 특허를 신속하게 식별합니다.
Cloud 기능 배포: 전체 검색 프로세스는 손쉽게 확장하고 비용을 절감하는 서버리스 솔루션인 Cloud Function에 포함됩니다. 개발자가 서버나 런타임 환경을 관리할 필요 없이 클라우드 이벤트에 응답하는 단일 목적의 독립형 기능을 생성할 수 있는 경량 컴퓨팅 솔루션입니다.
이 다이어그램은 구현의 상위 수준 흐름을 나타냅니다. Langchain, RAG 및 기타 신속한 엔지니어링 단계를 통해 이를 강화하고 표준화할 수 있습니다.
이 구현은 Cloud Function에 배포된 Alloy DB SQL DDL, DML, 간단한 선택 쿼리를 통해 수행됩니다.
간단한 5단계로 Alloy DB 및 Vertex AI 통합을 사용하여 특허 검색 애플리케이션을 구축할 수 있습니다!
gcloud services enable spanner.googleapis.com,functions.googleapis.com,run.googleapis.com,compute.googleapis.com
API가 누락된 경우 구현 과정에서 언제든지 활성화할 수 있습니다.
클러스터 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 문을 실행하여 새로 생성된 테이블에 특허 데이터를 생성합니다.
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.');
그러면 쿼리의 샘플 텍스트에 대해 부동 소수점 배열처럼 보이는 임베딩 벡터가 반환되어야 합니다. 다음과 같습니다.
아래 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;
이 쿼리에서는
결과는 다음과 같습니다.
결과에서 볼 수 있듯이 일치 항목이 검색 텍스트와 매우 유사합니다.
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 데이터에 대한 임베딩 모델을 사용하여 유사성 벡터 검색을 수행하는 것은 매우 간단합니다.
NestJS, Fastify, Apollo GraphQL & NextJS를 사용해 채팅 앱 구축(클라이언트편) (0) | 2024.05.21 |
---|---|
NestJS, Fastify, Apollo GraphQL & NextJS를 사용해 채팅 앱 구축(서버편) (0) | 2024.05.21 |
MSSQL(SQL Server) 2022 설치 및 구성 방법 (0) | 2024.05.04 |
2024 Mac Book 앱! NeoVim & Ollama & ... (0) | 2024.05.03 |
BigQuery DataFrames를 통해 Gemini로 텍스트 데이터를 보강하는 방법 (0) | 2024.04.29 |
댓글 영역