서가 분석: Gemini를 사용하여 BigQuery와 생성형 AI로 SQL 애플리케이션 빌드

1. 소개

책을 자세히 살펴보는 것을 좋아하지만 너무 많은 선택지에 압도 당하시나요? 완벽한 읽을거리를 추천할 뿐만 아니라 선택한 장르에 따라 간결한 요약을 제공하여 책의 본질을 엿볼 수 있는 AI 기반 앱이 있다고 상상해 보세요. 이 Codelab에서는 Gemini가 지원하는 BigQuery, Gemini, Cloud Functions를 사용하여 이러한 앱을 빌드하는 방법을 알아봅니다.

프로젝트 개요

Google의 사용 사례는 다음 4가지 주요 구성요소를 중심으로 이루어집니다.

  • 도서 데이터베이스: 방대한 인터넷 자료실 도서의 BigQuery 공개 데이터 세트는 Google의 포괄적인 도서 카탈로그 역할을 합니다.
  • AI 요약 엔진: Gemini 1.0 Pro 언어 모델을 갖춘 Google Cloud Functions는 사용자 요청에 맞는 유용한 요약 정보를 생성합니다.
  • BigQuery 통합: Cloud 함수를 호출하여 주문형 도서 요약 및 테마를 전달하는 BigQuery 내의 원격 함수입니다.
  • 사용자 인터페이스: 사용자가 결과를 볼 수 있는 웹 애플리케이션을 제공하는 Cloud Run에서 호스팅되는 웹 앱입니다.

구현은 다음 3개의 Codelab으로 나뉩니다.

Codelab 1: Gemini를 사용하여 Gemini 애플리케이션용 Java Cloud 함수를 빌드합니다.

Codelab 2: Gemini를 사용하여 BigQuery 및 생성형 AI로 SQL 앱을 빌드합니다.

Codelab 3: Gemini를 사용하여 BigQuery와 상호작용하는 Java Spring Boot 웹 애플리케이션을 만듭니다.

2. Gemini를 사용하여 BigQuery 및 생성형 AI로 SQL 앱 빌드

빌드할 항목

다음과 같은

  • BigQuery에서 Vertex AI text-bison-32k 엔드포인트를 호출하여 표에 있는 ';'로 구분된 키워드 목록에서 도서의 장르 (또는 테마)를 식별하는 원격 모델
  • 배포된 생성형 AI Cloud 함수를 원격으로 호출하는 BigQuery의 원격 함수
  • 원격 모델과 함수를 사용하여 SQL 쿼리로 책의 테마와 텍스트를 요약하고 결과를 책장 데이터 세트의 새 테이블에 작성합니다.
  • 이 단계는 Gemini를 사용하여 구현합니다.

3. 요구사항

프로젝트 만들기

이미 결제 계정을 활성화하고 위의 조건부 단계에서 언급된 링크를 사용하여 프로젝트를 만든 경우 아래 단계를 건너뛰어도 됩니다.

  1. Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
  2. Cloud 프로젝트에 결제가 사용 설정되어 있어야 하므로 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

Cloud Shell 활성화

  1. bq가 미리 로드되어 제공되는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.

Cloud 콘솔에서 오른쪽 상단에 있는 Cloud Shell 활성화를 클릭합니다. 6757b2fb50ddcc2d.png

  1. Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.

gcloud auth list

  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.

gcloud config list project

  1. 프로젝트가 설정되지 않은 경우 다음 명령어를 사용하여 설정합니다.

gcloud config set project <YOUR_PROJECT_ID>

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

4. Gemini for Google Cloud 및 필요한 API 사용 설정

Gemini 사용 설정

  1. Gemini for Google Cloud Marketplace로 이동하여 API를 사용 설정합니다. 다음 명령어를 사용할 수도 있습니다.

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. Gemini 페이지를 방문하여 '채팅 시작'을 클릭합니다.

기타 필요한 API 사용 설정

어떻게 하면 좋을까요? Gemini에 물어볼까요? 하지만 그 전에 다음 사항을 기억하세요.

참고: LLM은 비결정적입니다. 따라서 이러한 프롬프트를 입력하는 동안 수신하는 대답이 스크린샷과 다르게 보일 수 있습니다.

Google Cloud 콘솔의 검색창 옆에 있는 오른쪽 상단의 'Gemini 열기' 아이콘을 클릭하여 Gemini 채팅 콘솔로 이동합니다.

'여기에 프롬프트 입력' 섹션에 다음 질문을 입력합니다.

gcloud 명령어를 사용하여 BigQuery 및 Vertex AI API를 사용 설정하려면 어떻게 해야 하나요?

다음 이미지와 같이 대답을 받게 됩니다.

19c3fd78530794d9.png

이를 복사하고(명령어 스니펫 상단의 복사 아이콘 사용) Cloud Shell 터미널에서 실행하여 각 서비스를 사용 설정합니다.

  • bigquery.googleapis.com
  • aiplatform.googleapis.com

5. 도서 데이터의 BigQuery 공개 데이터 세트 살펴보기

먼저 수많은 인터넷 자료실 도서에 관한 정보가 담긴 BigQuery 공개 데이터 세트에 익숙해지세요.

BigQuery 탐색기 창에서 이 공개 데이터 세트를 찾을 수 있습니다. BigQuery 콘솔로 이동하면 왼쪽에 있습니다.

39e2ac03cc99cbac.png

검색창에 'gdelt-bq' 또는 'internetarchivebooks'를 입력하고 'SEARCH ALL PROJECTS'(모든 프로젝트 검색)을 클릭합니다. 결과를 펼치고 아래 이미지와 같이 인터넷 자료실 도서에 별표 표시합니다.

68dba68a79cddfc9.png

데이터 세트를 확장하고 gdelt-bq.internetarchivebooks를 클릭한 후 1920년 표의 데이터를 미리 봅니다. 이 표에는 보관처리된 1920년도의 도서가 포함됩니다.

후속 섹션에서 사용할 스키마를 살펴보려면 다음 쿼리를 실행합니다.

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

Codelab에서는 다음 세 가지 필드를 사용합니다.

  • BookMeta_Title(제목)
  • Themes(';'로 구분된 테마)
  • BookMeta_FullText(도서의 전체 텍스트)

6. bookshelf라는 새 BigQuery 데이터 세트 만들기

이 실습에서 만들 모든 데이터베이스 및 분석 객체를 저장할 데이터 세트를 프로젝트 아래에 만들려고 합니다. BigQuery 데이터 세트를 만드는 방법을 Gemini에 물어보겠습니다. API 사용 설정 단계에서 브라우저의 다른 탭에 Gemini 채팅을 이미 열어 두었어야 합니다. 아직 설정하지 않았다면 지금 설정하세요. https://console.cloud.google.com으로 이동하여 Google Cloud 콘솔로 이동하면 상단의 검색창 바로 옆에 Gemini 아이콘이 표시됩니다. 이 아이콘을 클릭하면 채팅이 열립니다.

26e1491322855614.png

아래와 같이 프롬프트를 입력합니다.

프롬프트는 다음과 같습니다.

How to create a BigQuery dataset?

다음은 대답입니다.

f7a989cc9a01009.png

대답에 설명된 단계에 따라 활성 프로젝트에 'bookshelf'라는 데이터 세트를 만들어 보겠습니다.

BigQuery 데이터 세트를 만들려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
  2. 탐색기 패널에서 프로젝트 ID를 클릭합니다.
  3. 데이터 세트 만들기를 클릭합니다 (프로젝트 ID 옆에 있는 점 3개를 클릭하면 표시되는 옵션에 있음).
  4. 데이터 세트 이름을 'bookshelf'로 입력합니다.
  5. 위치를 '미국(멀티 리전)'으로 설정합니다.
  6. 대답의 3, 4, 5, 6단계에서는 기본 옵션을 그대로 둡니다.
  7. '데이터 세트 만들기'를 클릭합니다.

데이터 세트가 생성되어 탐색기 패널에 표시됩니다. 'bookshelf' 데이터 세트는 다음과 같이 표시됩니다.

7. Vertex AI LLM (text-bison-32k)을 호출하는 원격 모델 만들기

다음으로 'text-bison-32k' Vertex AI 모델을 호출하는 BigQuery 모델을 만들어야 합니다. 모델은 데이터 세트의 각 책에 대한 키워드 목록에서 공통 주제, 책의 맥락을 식별하는 데 도움이 됩니다.

Gemini에게 이 질문을 해 보겠습니다. 이렇게 하려면 Gemini 채팅 콘솔이 열려 있는 탭으로 이동하여 아래 프롬프트를 입력하세요.

BigQuery에서 LLM 엔드포인트 (text-bison-32k)를 호출하기 위해 BigQuery와 Vertex AI를 어떻게 연결하나요?

응답은 다음과 같습니다.

41904e30ce92b436.png

대답에는 CREATE MODEL 문 사용, BigQuery 연결 사용, 엔드포인트 정의를 포함한 단계와 같은 정확한 정보가 포함됩니다. 질문 문장이 정확하더라도 대규모 언어 모델이므로 형식, 양, 깊이가 다른 대답을 받을 수 있습니다. 제가 받은 세부정보가 모두 표시되지 않으면 후속 질문으로 채팅을 조사해 보세요. 예: 연결 리소스를 만드는 방법, 연결 속성이 누락된 이유, BigQuery에서 Vertex AI에 연결하는 방법 등에 대한 자세한 내용을 제공합니다.

다음은 샘플 후속 프롬프트입니다. 후속 조치가 필요한 경우에만 사용하세요. 받은 첫 번째 대답이 충분한 경우 이를 사용하세요.

What about the connection? How will I connect from BigQuery to Vertex AI?

응답은 다음과 같습니다.

2ed9b3ed96b11bc9.png

대답의 단계에 따라 BigQuery 연결을 만들어 보겠습니다.

  1. BigQuery 콘솔로 이동합니다.
  2. BigQuery 탐색기 창에서 '+추가' 버튼을 클릭하고 '외부 데이터 소스에 연결'을 클릭합니다.
  3. 이때 BigQuery Connection API를 사용 설정하라는 메시지가 표시됩니다. API 사용 설정을 클릭합니다.

ded96126495ffe9.png

  1. '외부 데이터 소스에 연결'을 클릭하면 아래와 같이 외부 데이터 소스 슬라이드가 표시됩니다 . 외부 소스 목록에서 'Vertex AI' 소스를 선택합니다.

434cdbbb3a9436f2.png

  1. 연결 ID를 입력합니다. 원하는 ID를 입력해도 되지만 지금은 'bq-vx' 및 리전(멀티 리전 'US')으로 설정합니다.
  2. '연결 만들기'를 클릭합니다.

d3a2aeebc3ecdfae.png

  1. 연결을 만든 후 '연결로 이동'을 클릭합니다.
  2. 연결 정보 페이지에서 서비스 계정 ID를 복사합니다. 이 ID는 이후 단계에서 사용됩니다.
  3. 이제 연결이 생성되었으므로 복사한 이 서비스 계정 ID에 Vertex AI를 사용할 수 있는 권한을 할당해 보겠습니다.
  4. Google Cloud Console 페이지에서 Google Cloud IAM을 열거나 링크로 이동합니다.
  5. 주 구성원별로 보기 섹션에서 액세스 권한 부여를 클릭합니다.

5317eed5da0bb8c5.png

  1. 액세스 권한 부여 대화상자의 새 주 구성원 텍스트 상자에 앞에서 기록한 서비스 계정 ID를 입력합니다.
  2. 역할을 'Vertex AI 사용자'로 설정합니다.

f213db33d220aa5f.png

필수 연결이 생성됩니다. 주 구성원 (연결의 서비스 계정)이 BigQuery에서 Vertex AI를 사용할 수 있도록 필요한 권한이 부여됩니다.

BigQuery 쿼리 편집기에서 DB 객체(이 경우 MODEL) 생성을 나타내는 다음 DDL(데이터 정의 언어) 문을 실행합니다.

CREATE OR REPLACE MODEL bookshelf.llm_model
  REMOTE WITH CONNECTION `us.bq-vx`
  OPTIONS (ENDPOINT = 'text-bison-32k');

위 단계의 대안으로 Gemini에게 'text-bison-32k' 모델을 호출하는 모델을 생성하기 위한 쿼리를 제안해 달라고 요청할 수 있습니다.

참고: 연결에 다른 이름을 사용한 경우 이전 DDL 문에서 'us.bq-vx'를 해당 이름으로 바꿉니다. 이 쿼리는 앞에서 만든 데이터 세트 'bookshelf'에 원격 모델을 만듭니다.

8. Java Cloud 함수를 호출하는 원격 함수 만들기

이제 이 시리즈의 Codelab 1에서 만든 Java Cloud 함수를 사용하여 BigQuery에서 원격 함수를 만들어 Gemini 모델을 구현합니다. 이 원격 함수는 책 콘텐츠를 요약하는 데 사용됩니다.

참고:Codelab을 놓쳤거나 이 Cloud Functions를 배포하지 않은 경우 이 단계를 건너뛰고 다음 주제 (원격 모델을 사용하여 책의 주제 요약)로 이동하면 됩니다.

BigQuery 콘솔로 이동하여 쿼리 편집기에 다음 DDL 문을 붙여넣습니다 (+ 버튼을 클릭하여 새 쿼리 편집기 탭을 만들 수 있음).

a54c0b0014666cac.png

복사할 수 있는 DDL은 다음과 같습니다. 엔드포인트를 배포된 Cloud 함수 엔드포인트 (codelab 1에서 생성됨)로 바꿔야 합니다. 엔드포인트가 없는 경우 데모 목적으로 아래 DDL에서 마스크 처리된 문자를 'abis-345004'로 대체할 수 있습니다.

CREATE OR REPLACE FUNCTION
  `bookshelf.GEMINI_REMOTE_CALL` (context STRING) RETURNS STRING
  REMOTE WITH CONNECTION `us.bq-vx`
  OPTIONS (
    endpoint = 'https://us-central1-****-******.cloudfunctions.net/remote-gemini-call'  );

Google Cloud 플랫폼에서 BigQuery 콘솔로 이동하여 새 쿼리 편집기 탭을 엽니다. BigQuery 쿼리 편집기에 위의 DDL 문을 붙여넣습니다. 쿼리를 실행하면 다음과 같은 응답이 표시됩니다.

a023d5691acf6f.png

이제 모델과 함수가 생성되었으므로 SELECT 쿼리에서 실행하여 이 두 BigQuery 객체를 테스트해 보겠습니다.

9. 원격 모델을 사용하여 테마 요약

생성한 원격 모델 'bookshelf.llm_model'을 사용하여 제공된 테마 목록에서 책의 통합 키워드를 생성해 보겠습니다.

SELECT * FROM ML.GENERATE_TEXT(MODEL `bookshelf.llm_model`,
(
SELECT
     CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` LIMIT 1
));

선택사항: LLM 생성 결과 필드의 결과가 중첩됩니다. LLM 매개변수와 'flatten_json_output' 속성을 쿼리에 추가해 보겠습니다. 'flatten_json_output' 속성을 사용하면 LLM 생성 결과 필드에서 중첩된 구조를 삭제할 수 있습니다.

SELECT * FROM ML.GENERATE_TEXT ( MODEL `bookshelf.llm_model`, (
 SELECT CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt FROM `gdelt-bq.internetarchivebooks.1920` limit 1),
    STRUCT( 0.2 AS temperature, 100 AS max_output_tokens, TRUE AS flatten_json_output));

이제 BigQuery 편집기에서 SELECT 쿼리를 실행하고 결과를 확인합니다. 테스트를 위해 쿼리 결과를 1로 제한했습니다. 결과는 다음과 같이 표시됩니다.

9b0d33eca61a73d2.png

10. 원격 함수를 사용하여 책의 전체 텍스트 요약

이제 앞에서 만든 bookshelf.GEMINI_REMOTE_CALL Cloud 함수를 실행하여 책을 요약해 보겠습니다.

참고: 원격 함수 생성 (이 Codelab의 이전 주제)을 건너뛴 경우 SELECT 쿼리에서도 bookshelf.GEMINI_REMOTE_CALL 함수 호출을 건너뛰어야 합니다.

이전에 만든 원격 함수 (GEMINI_REMOTE_CALL)를 호출하는 SELECT 쿼리를 사용합니다. 이 함수(GEMINI_REMOTE_CALL) 호출에는 도서 텍스트의 요약을 요청하는 프롬프트가 포함됩니다.

select BookMeta_Title, `bookshelf.GEMINI_REMOTE_CALL` (
  CONCAT('This is about a book. The title of the book is this: ', BookMeta_Title,  ' . The theme of the book is as follows: ', Themes, 'The following text contains an excerpt from the book. Summarize it in less than 5 lines to create the gist. If you do not have a summary, use the title and themes to make up a short summary. DO NOT RETURN EMPTY RESPONSE. ', SUBSTR(BookMeta_FullText, 5000, 10000))) Summary 
  from `gdelt-bq.internetarchivebooks.1920` where Themes like '%EDUCATION%' limit 1;

요약을 생성하기 위해 책의 전체 텍스트에서 하위 문자열을 가져왔습니다.

쿼리 결과는 다음과 같습니다.

658bb0a9c9cf0938.png

11. 테이블에 도서 데이터 저장

이제 SQL 쿼리만 사용하여 BigQuery에서 LLM 호출 (원격 모델 및 함수)을 모두 테스트했으므로 원격 모델 및 함수와 동일한 데이터 세트에 테마 통계가 포함된 '책장' 데이터를 저장할 BigQuery 테이블을 만들어 보겠습니다.

이 단계에서 LLM 모델 호출과 원격 함수 호출을 모두 포함할 수 있습니다. 하지만 Cloud Functions를 호출하는 원격 함수 호출을 선택사항으로 표시했으므로 원격 모델의 통계만 사용합니다.

사용할 쿼리는 다음과 같습니다.

SELECT
  BookMeta_Title, Themes, ml_generate_text_llm_result Context 
   FROM
  ML.GENERATE_TEXT (
    MODEL `bookshelf.llm_model`,
    (
 SELECT
      BookMeta_Title,
      Themes,BookMeta_FullText,
      CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

BigQuery 편집기에서 쿼리를 실행하면 결과는 다음과 같습니다.

2c6e08e75a680867.png

이제 Gemini에게 위의 쿼리에서 'bookshelf.books'라는 테이블을 만들어 달라고 요청해 보겠습니다. Google Cloud 콘솔에서 Gemini 채팅 콘솔로 이동하여 다음 프롬프트를 입력합니다.

사용할 프롬프트는 다음과 같습니다.

Create a BigQuery table named bookshelf.books from this SELECT query: 
SELECT
  BookMeta_Title, Themes, ml_generate_text_llm_result Context 
   FROM
  ML.GENERATE_TEXT (
    MODEL `bookshelf.llm_model`,
    (
 SELECT
      BookMeta_Title,
      Themes,BookMeta_FullText,
      CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

Gemini 채팅의 대답은 다음과 같습니다.

df6595a4b14f7b9.png

여기에서 직접 복사하려는 경우를 위해 쿼리를 제공해 드립니다.

CREATE TABLE bookshelf.books (
  BookMeta_Title STRING,
  Themes STRING,
  ml_generate_text_llm_result STRING
) AS (
  SELECT
    BookMeta_Title,
    Themes,
    ml_generate_text_llm_result Context
  FROM
    ML.GENERATE_TEXT (
      MODEL `bookshelf.llm_model`,
      (
        SELECT
          BookMeta_Title,
          Themes,
          BookMeta_FullText,
          CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
        FROM `gdelt-bq.internetarchivebooks.1920`
        LIMIT 5
      ),
      STRUCT(
        0.2 AS temperature,
        100 AS max_output_tokens,
        TRUE AS flatten_json_output
      )
    )
);

BigQuery 편집기에서 쿼리를 실행하면 결과는 다음과 같습니다.

2d1ce716f844b7ad.png

작업이 끝났습니다. 이제 테이블을 쿼리하고 데이터를 가지고 놀면서 더 많은 유용한 정보를 얻으세요.

12. 축하합니다

축하합니다. 다음 작업을 완료했으며 프로세스의 일부 단계에서 Gemini를 사용했습니다.

  • BigQuery에서 Vertex AI 'text-bison-32k' 엔드포인트를 호출하여 테이블에 있는 ';'로 구분된 키워드 목록에서 책의 장르 (또는 테마)를 식별하는 원격 모델을 만들었습니다.
  • 배포된 생성형 AI Cloud Functions를 원격으로 호출하는 BigQuery의 원격 함수를 만들었습니다. 이 함수는 프롬프트를 입력으로 사용하고 책을 5줄로 요약하는 문자열을 출력합니다.
  • 원격 모델과 함수를 사용하여 SQL 쿼리로 책의 테마와 텍스트를 요약하고 결과를 책장 데이터 세트의 새 테이블에 작성했습니다.
  • 후속 과제로 Gemini를 사용하여 BigQuery에서 생성된 객체를 삭제하는 SQL을 가져와 보세요. 이렇게 하면 정리 단계가 완료됩니다.