이 튜토리얼에서는 자율 임베딩 생성과 AI.SEARCH 함수를 사용하여 그래프 데이터에 대한 시맨틱 검색을 실행하는 방법을 보여줍니다.
목표
이 튜토리얼에서는 다음 태스크를 다룹니다.- 사용자, 금융 계정, 계정 소유권, 계정 이전에 관한 정보를 보유하는 테이블을 만듭니다.
- 자율 임베딩 생성을 사용하여 임베딩 유지관리 워크플로를 간소화하세요.
- 표에 저장된 데이터 간의 관계를 정의하는 그래프를 만듭니다.
- 그래프 노드에서
AI.SEARCH함수를 사용하여 계정 설명에 대한 시맨틱 검색을 실행합니다. - 그래프 에지에서
AI.SEARCH함수를 사용하여 계정 이전 메모에 대한 시맨틱 검색을 실행합니다.
비용
이 문서에서는 비용이 청구될 수 있는 Cloud de Confiance by S3NS구성요소를 사용합니다.
- BigQuery: You incur costs for the data that you process in BigQuery.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
콘솔
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the BigQuery API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
프로젝트에 다음 역할이 있는지 확인하세요. BigQuery 데이터 편집자, 프로젝트 IAM 관리자
역할 확인
-
Cloud de Confiance 콘솔에서 IAM 페이지로 이동합니다.
IAM으로 이동 - 프로젝트를 선택합니다.
-
주 구성원 열에서 나 또는 내가 속한 그룹을 식별하는 모든 행을 찾습니다. 내가 속한 그룹을 알아보려면 관리자에게 문의하세요.
- 나를 지정하거나 포함하는 모든 행의 역할 열을 확인하여 역할 목록에 필요한 역할이 포함되어 있는지 확인합니다.
역할 부여
-
Cloud de Confiance 콘솔에서 IAM 페이지로 이동합니다.
IAM으로 이동 - 프로젝트를 선택합니다.
- 액세스 권한 부여를 클릭합니다.
-
새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 직원 ID 풀의 사용자 식별자입니다. 자세한 내용은 IAM 정책에서 직원 풀 사용자 표현을 참조하거나 관리자에게 문의하세요.
- 역할 선택을 클릭한 후 역할을 검색합니다.
- 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
- 저장을 클릭합니다.
-
gcloud
-
Google Cloud CLI를 설치합니다.
-
gcloud CLI에서 제휴 ID를 사용하도록 구성합니다.
자세한 내용은 제휴 ID로 gcloud CLI에 로그인을 참고하세요.
-
gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.
gcloud init -
Cloud de Confiance 프로젝트를 만들거나 선택합니다.
프로젝트를 선택하거나 만드는 데 필요한 역할
- 프로젝트 선택: 프로젝트를 선택하는 데는 특정 IAM 역할이 필요하지 않습니다. 역할이 부여된 프로젝트를 선택하면 됩니다.
-
프로젝트 만들기: 프로젝트를 만들려면
resourcemanager.projects.create권한이 포함된 프로젝트 생성자 역할(roles/resourcemanager.projectCreator)이 필요합니다. 역할 부여 방법 알아보기
-
Cloud de Confiance 프로젝트를 만듭니다.
gcloud projects create PROJECT_ID
PROJECT_ID를 만들려는 Cloud de Confiance 프로젝트의 이름으로 바꿉니다. -
만든 Cloud de Confiance 프로젝트를 선택합니다.
gcloud config set project PROJECT_ID
PROJECT_ID을 Cloud de Confiance 프로젝트 이름으로 바꿉니다.
BigQuery API를 사용 설정합니다.
API 사용 설정에 필요한 역할
API를 사용 설정하려면
serviceusage.services.enable권한이 포함된 서비스 사용량 관리자 IAM 역할 (roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기gcloud services enable bigquery.googleapis.com
-
사용자 계정에 역할을 부여합니다. 다음 IAM 역할마다 다음 명령어를 1회 실행합니다.
roles/bigquery.dataEditor, roles/resourcemanager.projectIamAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
다음을 바꿉니다.
PROJECT_ID: 프로젝트 ID입니다.USER_IDENTIFIER: 사용자 계정입니다. 예를 보려면 IAM 정책에서 직원 풀 사용자 표현을 참고하세요.ROLE: 사용자 계정에 부여하는 IAM 역할입니다.
테이블 만들기
다음 예에서 만드는 테이블과 그래프를 저장하려면 데이터 세트를 만드세요.
다음 쿼리는 graph_search라는 데이터 세트를 만듭니다.
CREATE SCHEMA IF NOT EXISTS graph_search;
다음 표에는 사용자 및 계정에 관한 정보와 이러한 항목 간의 관계가 포함되어 있습니다.
Person: 사람에 관한 정보Account: 은행 계좌 정보PersonOwnAccount: 누가 어떤 계정을 소유하는지에 관한 정보입니다.AccountTransferAccount: 계정 간 전송에 관한 정보입니다.
이러한 테이블을 만들려면 다음 CREATE TABLE 문을 실행하세요.
CREATE OR REPLACE TABLE graph_search.Person (
id INT64,
name STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_search.Account (
id INT64,
create_time TIMESTAMP,
is_blocked BOOL,
description STRING,
description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(description, model => 'embeddinggemma-300m')
) STORED OPTIONS( asynchronous = TRUE ),
PRIMARY KEY (id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_search.PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
PRIMARY KEY (id, account_id) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_search.Person(id) NOT ENFORCED,
FOREIGN KEY (account_id) REFERENCES graph_search.Account(id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_search.AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING,
notes STRING,
notes_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(notes, model => 'embeddinggemma-300m')
) STORED OPTIONS( asynchronous = TRUE ),
PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_search.Account(id) NOT ENFORCED,
FOREIGN KEY (to_id) REFERENCES graph_search.Account(id) NOT ENFORCED
);
Account 및 AccountTransferAccount 테이블은 자율 임베딩 생성을 사용하여 description 및 notes 열의 임베딩을 유지합니다.
이 튜토리얼에서는 BigQuery에서 실행되고 짧은 문자열에 적합한 embeddinggemma-300m 모델을 사용합니다. 토큰이 128개를 초과하는 긴 문자열의 경우 text-embedding-005와 같은 다른 임베딩 모델을 선택해야 합니다. 자세한 내용은 임베딩 모델 선택을 참고하세요.
데이터 삽입
다음 쿼리는 테이블에 샘플 데이터를 삽입합니다. INSERT 문은 삽입 열을 생략하고 BigQuery가 자동으로 채웁니다.
INSERT INTO graph_search.Account
(id, create_time, is_blocked, description)
VALUES
(7,"2020-01-10 06:22:20.222",false,"Fund for a refreshing tropical vacation"),
(16,"2020-01-27 17:55:09.206",true,"Fund for a rainy day!"),
(20,"2020-02-18 05:44:20.655",false,"Saving up for travel");
INSERT INTO graph_search.Person
(id, name)
VALUES
(1,"Alex"),
(2,"Dana"),
(3,"Lee");
INSERT INTO graph_search.AccountTransferAccount
(id, to_id, amount, create_time, order_number, notes)
VALUES
(7,16,300,"2020-08-29 15:28:58.647","304330008004315", "wedding present"),
(7,16,100,"2020-10-04 16:55:05.342","304120005529714", "birthday gift"),
(16,20,300,"2020-09-25 02:36:14.926","103650009791820", "for shared cost of dinner"),
(20,7,500,"2020-10-04 16:55:05.342","304120005529714", "fees for tuition"),
(20,16,200,"2020-10-17 03:59:40.247","302290001484851", "loved the lunch");
INSERT INTO graph_search.PersonOwnAccount
(id, account_id, create_time)
VALUES
(1,7,"2020-01-10 06:22:20.222"),
(2,20,"2020-01-27 17:55:09.206"),
(3,16,"2020-02-18 05:44:20.655");
그래프 만들기
다음 쿼리는 CREATE PROPERTY GRAPH 문을 사용하여 graph_search 데이터 세트에 FinGraph라는 그래프를 만듭니다.
Account 및 Person 테이블은 노드 테이블입니다. AccountTransferAccount 및 PersonOwnAccount 테이블은 노드 테이블 간의 관계를 나타내는 에지 테이블입니다.
CREATE OR REPLACE PROPERTY GRAPH graph_search.FinGraph
NODE TABLES (graph_search.Account, graph_search.Person)
EDGE TABLES (
graph_search.PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
LABEL Owns,
graph_search.AccountTransferAccount
SOURCE KEY (id) REFERENCES Account (id)
DESTINATION KEY (to_id) REFERENCES Account (id)
LABEL Transfers
);
검색 노드
다음 쿼리는 여가 여행 및 휴가 계정의 소유자를 보여줍니다. 첫 번째 쿼리는 DECLARE 문을 사용하여 similar_account라는 변수를 만듭니다. 이 변수는 accounts for leisure travel and vacation와 시맨틱 관점에서 가장 유사한 설명을 가진 계정을 찾는 AI.SEARCH 호출을 사용하여 DEFAULT 절에서 초기화됩니다. 쿼리는 AI.SEARCH 호출에서 top_k 인수를 2로 설정하여 결과 수를 제한합니다. 두 번째 쿼리는 계정 설명과 함께 계정 소유자의 이름을 반환하는 그래프 쿼리입니다.
DECLARE similar_account DEFAULT ((
SELECT ARRAY_AGG(base.id)
FROM
AI.SEARCH(
(SELECT * FROM graph_search.Account WHERE description_embedding IS NOT NULL),
'description',
'accounts for leisure travel and vacation',
top_k => 2)
));
GRAPH graph_search.FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
WHERE a.id IN UNNEST(similar_account)
RETURN p.name, a.description;
결과는 다음과 비슷합니다.
+------+-----------------------------------------+
| name | description |
+------+-----------------------------------------+
| Dana | Saving up for travel |
| Alex | Fund for a refreshing tropical vacation |
+------+-----------------------------------------+
검색 가장자리
다음 쿼리는 음식 결제와 관련된 계정 이전을 누가 수행했는지 보여줍니다.
첫 번째 쿼리는 AI.SEARCH 함수를 사용하여 food_transfers이라는 변수를 채웁니다. 이 변수는 연결된 메모가 food와 의미상 가장 유사한 트랜스퍼의 주문 번호를 보유합니다. 쿼리는 AI.SEARCH 호출에서 top_k 인수를 2로 설정하여 결과 수를 제한합니다. 두 번째 쿼리는 송금 메모와 함께 계정 소유자의 이름을 반환하는 그래프 쿼리입니다.
DECLARE food_transfers DEFAULT ((
SELECT ARRAY_AGG(base.order_number)
FROM
AI.SEARCH(
(SELECT * FROM graph_search.AccountTransferAccount WHERE notes_embedding IS NOT NULL),
'notes',
'food',
top_k => 2)
));
GRAPH graph_search.FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.order_number IN UNNEST(food_transfers)
RETURN p.name, t.notes;
결과는 다음과 비슷합니다.
+------+---------------------------+
| name | notes |
+------+---------------------------+
| Dana | loved the lunch |
| Lee | for shared cost of dinner |
+------+---------------------------+
벡터 색인 만들기
벡터 색인은 검색의 지연 시간과 컴퓨팅 비용을 줄여줍니다. 이 튜토리얼의 테이블은 벡터 색인을 사용하기에 너무 작습니다. 벡터 색인은 테이블이 큰 경우(일반적으로 수백만 개의 행이 있음) 유용합니다. BigQuery는 IVF와 TreeAH라는 두 가지 유형의 색인을 제공합니다. 색인 생성 및 유형 선택에 관한 자세한 내용은 벡터 색인 관리를 참고하세요.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
Cloud de Confiance 프로젝트를 삭제합니다.
gcloud projects delete PROJECT_ID
다음 단계
- BigQuery 그래프에 대해 자세히 알아보세요.
- 그래프를 만들고 쿼리하는 방법을 알아보세요.
- 벡터 색인을 만들고 시맨틱 검색 및 RAG를 실행하는 방법을 자세히 알아보세요.