서가 분석: 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에서 호스팅되는 웹 앱입니다.

구현을 다음 세 가지 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 앱 빌드

빌드할 항목

다음을 만듭니다.

  • Vertex AI text-bison-32k 엔드포인트를 호출하여 테이블에서 ';'로 구분된 키워드 목록에서 도서의 장르 (또는 테마)를 식별하는 BigQuery의 원격 모델입니다.
  • 배포된 생성형 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. Google Cloud 및 필요한 API용 Gemini 사용 설정

Gemini 사용 설정

  1. Google Cloud용 Gemini 마켓플레이스로 이동하여 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 데이터 세트 만들기

이 실습에서 만들 데이터베이스 및 분석 객체를 모두 저장할 데이터 세트를 프로젝트 아래에 만들겠습니다. Gemini에게 BigQuery 데이터 세트를 만드는 방법을 물어보겠습니다. 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. 데이터 세트 만들기를 클릭합니다.

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

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

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

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 콘솔 페이지에서 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 함수를 호출하는 원격 함수 만들기

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

참고: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 Platform의 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 함수를 원격으로 호출하는 원격 함수를 BigQuery에서 만들었습니다. 이 함수는 프롬프트를 입력으로 받아 책을 5줄로 요약하는 문자열을 출력합니다.
  • 원격 모델과 함수를 사용하여 SQL 쿼리로 도서의 주제와 텍스트를 요약하고 결과를 북 셸프 데이터 세트의 새 테이블에 썼습니다.
  • 후속 과제로 Gemini를 사용하여 BigQuery에서 생성된 객체를 삭제하는 SQL을 가져와 보세요. 여기에서는 정리 단계를 다룹니다.