AI 시대의 애플리케이션 빌드

1. 개요

이 실습에서는 Google의 생성형 AI 제품을 사용하여 Gemini Cloud Assist의 도움을 받아 Google Cloud에 인프라를 구축하고, Data Canvas의 자연어-SQL 기능을 사용하여 BigQuery 데이터를 쿼리하고, Gemini Code Assist의 도움을 받아 Colab Enterprise Jupyter 노트북과 Eclipse Theia (Visual Studio Code)에서 코드를 작성하고, Vertex AI Agent Builder에서 Cloud Storage 및 BigQuery 그라운딩 소스를 기반으로 구축된 AI 검색 및 채팅 기능을 통합합니다.

목표는 AI Recipe Haven이라는 레시피 및 요리 웹사이트를 만드는 것입니다. 사이트는 Python과 Streamlit으로 빌드되며 두 개의 주요 페이지가 포함됩니다. 요리 조언에서는 Gemini와 요리책 그룹에 연결된 Vertex AI Agent Builder 그라운딩 소스를 사용하여 만든 챗봇을 호스팅하며, 요리 조언을 제공하고 요리 관련 질문에 답변합니다. 레시피 검색은 Gemini가 제공하는 검색엔진으로, 이번에는 BigQuery 레시피 데이터베이스를 기반으로 합니다.

이 연습의 코드에서 막히는 부분이 있으면 모든 코드 파일의 솔루션이 solution 브랜치의 연습 GitHub 저장소에 있습니다.

목표

이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.

  • Gemini Cloud Assist 활성화 및 사용
  • 요리 조언 챗봇을 위해 Vertex AI Agent Builder에서 검색 앱 만들기
  • Gemini Code Assist의 도움을 받아 Colab Enterprise 노트북에서 데이터 로드 및 정리
  • Vertex AI Agent Builder에서 레시피 생성기를 위한 검색 앱 만들기
  • Gemini의 도움을 받아 핵심 Python 및 Streamlit 웹 애플리케이션 프레임 구성
  • Cloud Run에 웹 애플리케이션 배포
  • 요리 조언 페이지를 Cookbook-Search Agent Builder 앱에 연결
  • (선택사항) 레시피 검색 페이지를 레시피 검색 Agent Builder 앱에 연결
  • (선택사항) 최종 애플리케이션 살펴보기

2. 기본 요건

  1. 아직 Google 계정이 없다면 Google 계정을 만들어야 합니다.
    • 직장 또는 학교 계정 대신 개인 계정을 사용하세요. 직장 및 학교 계정에는 이 실습에 필요한 API를 사용 설정하지 못하도록 하는 제한이 있을 수 있습니다.

3. 프로젝트 설정

  1. Google Cloud 콘솔에 로그인합니다.
  2. Cloud 콘솔에서 결제를 사용 설정합니다.
    • 이 실습을 완료하는 데 드는 Cloud 리소스 비용은 미화 1달러 미만입니다.
    • 이 실습이 끝나면 단계에 따라 리소스를 삭제하여 추가 요금이 발생하지 않도록 할 수 있습니다.
    • 신규 사용자는 미화$300 상당의 무료 체험판을 사용할 수 있습니다.
    • 가상 실무형 실습 이벤트에 참석하시나요? 미화 5달러 크레딧이 제공될 수 있습니다.
  3. 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다.
  4. Cloud 결제의 내 프로젝트에서 결제가 사용 설정되어 있는지 확인합니다.
    • 새 프로젝트의 Billing account 열에 Billing is disabled이 표시되는 경우:
      1. Actions 열에서 점 3개를 클릭합니다.
      2. 결제 변경을 클릭합니다.
      3. 사용할 결제 계정을 선택합니다.
    • 실시간 이벤트에 참석하는 경우 계정 이름이 Google Cloud Platform 평가판 결제 계정일 수 있습니다.

4. Gemini Cloud Assist 활성화 및 사용

이 작업에서는 Gemini Cloud Assist를 활성화하고 사용합니다. Google Cloud 콘솔에서 작업하는 동안 Gemini Cloud Assist는 조언을 제공하고, Google Cloud 인프라를 빌드, 구성, 모니터링하는 과정을 지원하며, gcloud 명령어를 제안하고 Terraform 스크립트를 작성할 수도 있습니다.

  1. 사용할 Cloud Assist를 활성화하려면 Cloud 콘솔 UI 상단의 검색창을 클릭하고 Gemini에 질문하기 또는 Gemini에 Cloud 콘솔 관련 질문하기를 선택합니다.
  2. 페이지의 필수 API 섹션으로 스크롤하여 Gemini for Google Cloud API를 사용 설정합니다.
  3. 채팅 인터페이스가 바로 표시되지 않으면 채팅 시작을 클릭합니다. 먼저 Gemini에게 Cloud Shell 편집기 사용의 이점을 설명해 달라고 요청합니다. 생성된 대답을 잠시 살펴보세요.
  4. 그런 다음 Agent Builder의 이점과 생성형 응답을 그라운딩하는 데 어떻게 도움이 되는지 묻습니다.
  5. 마지막으로 비교를 살펴보겠습니다. Google Cloud 콘솔의 Gemini 채팅 창에서 다음 질문을 합니다.
    What are the major steps to creating a search app grounded in a GCS data source using Vertex AI Agent builder?
    

5. 요리 조언 챗봇을 위해 Vertex AI Agent Builder에서 검색 앱 만들기

빌드할 웹사이트에는 사용자가 요리 관련 질문에 대한 답변을 찾을 수 있도록 설계된 챗봇이 포함된 요리 조언 페이지가 있습니다. 70개의 공개 도메인 요리책이 포함된 소스를 기반으로 하는 Gemini가 제공됩니다. 이 레시피는 Gemini가 질문에 답변할 때 사용하는 신뢰할 수 있는 정보의 소스 역할을 합니다.

  1. Cloud 콘솔 검색창을 사용하여 Vertex AI로 이동합니다. 대시보드에서 모든 권장 API 사용 설정을 클릭합니다. 몇 분 정도 소요될 수 있습니다. Vertex AI API 자체를 사용 설정해야 한다는 팝업 상자가 표시되면 사용 설정하세요. API가 사용 설정되면 다음 단계로 이동할 수 있습니다.
  2. 검색을 사용하여 Agent Builder로 이동한 다음 계속 및 API 활성화를 클릭합니다.
  3. 앞서 조언을 구했을 때 Gemini가 제안한 것처럼 Agent Builder에서 검색 앱을 만들려면 공신력 있는 데이터 소스를 먼저 만들어야 합니다. 사용자가 검색하면 Gemini가 질문과 지능형 대답을 작성하는 방법을 이해하지만, 내장된 지식에서 가져오는 대신 그라운딩된 소스에서 대답에 사용되는 정보를 찾습니다.왼쪽 메뉴에서 데이터 스토어데이터 스토어 만들기로 이동합니다.
  4. 요리 관련 조언 페이지의 근거로 사용되는 공개 도메인 요리책은 현재 외부 프로젝트의 Cloud Storage 버킷에 있습니다. Cloud Storage 소스 유형을 선택합니다.
  5. 가져오는 정보의 유형과 관련된 기본 옵션을 검토하되 변경하지는 마세요. 가져오기 유형을 폴더로 설정한 상태로 두고 버킷 경로에 labs.roitraining.com/labs/old-cookbooks를 사용한 다음 계속을 클릭합니다.
  6. 데이터 스토어 이름을 old-cookbooks로 지정합니다. 수정을 클릭하고 ID를 old-cookbooks-id로 변경한 후 데이터 스토어를 만듭니다.

Vertex AI Agent Builder는 여러 앱 유형을 지원하며 데이터 스토어는 각 앱의 신뢰할 수 있는 소스 역할을 합니다. 검색 앱은 일반적인 용도와 검색에 적합합니다. Chat 앱은 Dataflow 기반 챗봇/보이스봇 애플리케이션의 생성 흐름을 위한 것입니다. 추천 앱은 더 나은 추천 엔진을 만드는 데 도움이 됩니다. 에이전트 앱은 생성형 AI 기반 에이전트를 만드는 데 사용됩니다. 결국 Agent가 원하는 작업을 수행하는 데 가장 적합할 수 있지만, 현재 제품이 미리보기 상태이므로 검색 앱 유형을 고수할 것입니다.

  1. 왼쪽 메뉴를 사용하여 으로 이동한 다음 새 앱 만들기를 클릭합니다.
  2. 웹사이트 검색 카드에서 만들기를 클릭합니다. 앱 이름을 cookbook-search로 지정합니다. 수정을 클릭하고 앱 ID를 cookbook-search-id로 설정합니다. 회사를 Google로 설정하고 계속을 클릭합니다.
  3. 몇 단계 전에 만든 old-cookbooks 데이터 스토어를 확인하고 검색 앱을 만듭니다.

활동 탭을 살펴보면 쿡북이 아직 가져오기 및 색인 생성 중인 것을 확인할 수 있습니다. 에이전트 빌더가 제공된 70개의 쿡북에 포함된 수천 개의 페이지를 색인하는 데 5분 이상 걸립니다. 작업이 진행되는 동안 레시피 생성기를 위해 레시피 데이터베이스 데이터를 로드하고 정리해 보겠습니다.

6. Gemini Code Assist의 도움을 받아 Colab Enterprise 노트북에서 데이터 로드 및 정리

Google Cloud에서는 Jupyter 노트북을 사용할 수 있는 몇 가지 주요 방법을 제공합니다. Google의 최신 제품인 Colab Enterprise를 사용하겠습니다. 무료 환경에서 Jupyter 노트북을 실험하려는 개인 및 조직에서 일반적으로 사용하는 Google의 Colab 제품을 잘 아는 분도 계실 것입니다. Colab Enterprise는 Google의 다른 클라우드 제품과 완전히 통합되고 GCP 환경의 보안 및 규정 준수 기능을 최대한 활용하는 상업용 Google Cloud 제품입니다.

Colab Enterprise에서 제공하는 기능 중 하나는 Google의 Gemini Code Assist와의 통합입니다. Code Assist는 다양한 코드 편집기에서 사용할 수 있으며, 코딩하는 동안 원활한 인라인 추천뿐만 아니라 조언도 제공할 수 있습니다. 레시피 데이터를 정리하는 동안 이 생성형 어시스턴트를 활용할 것입니다.

  1. 검색을 사용하여 Colab Enterprise로 이동한 후 노트북 만들기를 클릭합니다. 새 Colab 기능을 실험하라는 메시지가 표시되면 닫습니다. 노트북을 지원하는 컴퓨팅 성능을 가동하려면 새 노트북의 오른쪽 상단에 있는 연결을 클릭합니다.연결
  2. 파일 > 이름 바꾸기를 클릭하여 노트북 이름을 Data Wrangling.점 3개 이름 바꾸기로 바꿉니다.
  3. + 텍스트를 클릭하여 새 텍스트 상자를 만들고 위쪽 화살표를 사용하여 페이지의 첫 번째 셀로 이동합니다.+ 텍스트 및 위쪽 화살표
  4. 텍스트 상자를 수정하고 다음을 입력합니다.
    # Data Wrangling
    
    Import the Pandas library
    
  5. 방금 만든 텍스트 블록 아래의 코드 블록에서 imp를 입력하기 시작하면 Gemini Code Assist가 나머지 가져오기를 회색으로 제안합니다. tab 키를 눌러 제안을 수락합니다.
    import pandas as pd
    
  6. 가져오기 코드 상자 아래에 다른 텍스트 상자를 만들고 다음을 입력합니다.
    Create a Pandas DataFrame from: gs://labs.roitraining.com/labs/recipes/recipe_dataset.csv. View the first few records.
    
  7. 다른 코드 블록을 만들고 수정합니다. 다시 df =를 입력하고 Gemini Code Assistant에서 생성된 코드를 검토합니다. 생성된 추천 위에 Python 키워드의 자동 완성 드롭다운 목록이 표시되면 Esc 키를 눌러 밝은 회색의 추천 코드를 확인하세요. 다시 Tab 키를 눌러 제안을 수락합니다. 추천에 head() 함수 호출이 포함되지 않은 경우 추가합니다.
    df = pd.read_csv('gs://labs.roitraining.com/labs/recipes/recipe_dataset.csv')
    df.head()
    
  8. Pandas를 가져온 첫 번째 코드 셀을 클릭하고 명령어 메뉴나 키보드를 사용하여 선택한 셀을 실행합니다. 키보드에서 shift+enter를 누르면 셀이 실행되고 포커스가 다음 셀로 이동하며 필요한 경우 셀이 생성됩니다. 셀이 실행될 때까지 기다린 후 다음 단계로 이동합니다.참고: 셀이 실행되지 않은 경우 왼쪽의 [ ] 가 표시됩니다. 셀이 실행되는 동안 회전하는 작업 애니메이션이 표시됩니다. 셀이 완료되면 [13]과 같은 숫자가 표시됩니다.
  9. CSV를 DataFrame에 로드하는 셀을 실행합니다. 파일이 로드될 때까지 기다린 후 데이터의 처음 5개 행을 검토합니다. 이것이 BigQuery에 로드할 레시피 데이터이며, 결국 레시피 생성기를 그라운딩하는 데 사용됩니다.
  10. 새 코드 블록을 만들고 아래 주석을 입력합니다. 댓글을 입력한 후 다음 코드 줄로 이동하면 df.columns라는 제안이 표시됩니다. 그런 다음 셀을 실행합니다.
    # List the current DataFrame column names
    
    Jupyter 노트북에서 Gemini Code Assist의 도움을 받는 방법에는 코드 셀 위의 텍스트 셀과 코드 셀 자체 내의 주석이라는 두 가지 선택지가 있다는 것을 방금 보여드렸습니다. 코드 셀 내부의 주석은 Jupyter 노트북에서 잘 작동하지만 이 방법은 Google의 Gemini Code Assist를 지원하는 다른 IDE에서도 작동합니다.
  11. 열을 정리해 보겠습니다. Unnamed: 0 열 이름을 id로, linkuri로 바꿉니다. 원하는 프롬프트 > 코드 기법을 사용하여 코드를 만든 다음 만족스러우면 셀을 실행합니다.
    # Rename the column 'Unnamed: 0' to 'id' and 'link' to 'uri'
    df.rename(columns={'Unnamed: 0': 'id', 'link': 'uri'}, inplace=True)
    
  12. sourceNER 열을 삭제하고 head()를 사용하여 처음 몇 행을 확인합니다. Gemini의 도움을 받아 보세요. 마지막 두 줄을 실행하고 결과를 검토합니다.
    # Remove the source and NER columns
    df.drop(columns=['source', 'NER'], inplace=True)
    df.head()
    
  13. 데이터 세트에 레코드가 몇 개 있는지 확인해 보겠습니다. 다시 한번 원하는 프롬프트 기법을 선택하여 Gemini가 코드를 생성하도록 도울 수 있는지 확인합니다.
    # Count the records in the DataFrame
    df.shape # count() will also work
    
  14. 230만 개의 레코드는 아마 우리가 사용할 수 있는 시간보다 많은 레시피일 것입니다. 오늘 실습에서는 에이전트 빌더의 색인 생성 프로세스가 너무 오래 걸릴 수 있습니다. 절충안으로 150,000개의 레시피를 샘플링하여 사용해 보겠습니다. 프롬프트 > 코드 접근 방식을 사용하여 샘플을 가져와 dfs (s는 small을 의미)라는 새 DataFrame에 저장합니다.
    # Sample out 150,000 records into a DataFrame named dfs
    dfs = df.sample(n=150000)
    
  15. 레시피 소스 데이터를 BigQuery에 로드할 준비가 되었습니다. 로드하기 전에 BigQuery로 이동하여 테이블을 저장할 데이터 세트를 준비해 보겠습니다. Google Cloud 콘솔에서 검색창을 사용하여 BigQuery로 이동합니다. BigQuery를 마우스 오른쪽 버튼으로 클릭하고 새 브라우저 탭에서 열 수도 있습니다.
  16. 아직 표시되지 않은 경우 Cloud 콘솔 오른쪽 상단의 Gemini 로고를 사용하여 Gemini AI Chat 패널을 엽니다. API를 다시 사용 설정하라는 메시지가 표시되면 사용 설정을 누르거나 페이지를 새로고침합니다. 프롬프트를 실행합니다. What is a dataset used for in BigQuery? 대답을 살펴본 후 How can I create a dataset named recipe_data using the Cloud Console? 결과를 다음 단계와 비교합니다.Gemini Cloud Assist 열기
  17. BigQuery 탐색기 창에서 프로젝트 ID 옆에 있는 점 3개 작업 보기 메뉴를 클릭합니다. 그런 다음 데이터 세트 만들기를 선택합니다.보기 작업 살펴보기
  18. recipe_data의 데이터 세트와 ID를 제공합니다. 위치 유형을 미국으로 두고 데이터 세트 만들기를 클릭합니다. 데이터 세트가 이미 있다는 오류가 표시되면 그냥 넘어가세요.BigQuery에서 데이터 세트를 만들었으므로 노트북으로 다시 전환하여 삽입을 실행합니다.
  19. Colab Enterprise에서 데이터 랭글링 노트북으로 다시 전환합니다. 새 코드 셀에서 project_id라는 변수를 만들고 이를 사용하여 현재 프로젝트 ID를 저장합니다. 이 안내의 왼쪽 상단에 있는 '실습 종료' 버튼 아래에서 현재 프로젝트 ID를 확인할 수 있습니다. 원하는 경우 Cloud 콘솔 홈페이지에서도 확인할 수 있습니다. project_id 변수에 값을 할당하고 셀을 실행합니다.
    # Create a variable to hold the current project_id
    project_id='YOUR_PROJECT_ID'
    
  20. 프롬프트 > 코드 접근 방식을 사용하여 방금 만든 데이터 세트 recipe_datarecipes이라는 테이블에 DataFrame dfs를 삽입하는 코드 블록을 만드세요. 셀을 실행합니다.
    dfs.to_gbq(destination_table='recipe_data.recipes', project_id=project_id, if_exists='replace')
    

7. Vertex AI Agent Builder에서 레시피 생성기를 위한 검색 앱 만들기

좋습니다. 레시피 데이터 테이블이 생성되었으니 이를 사용하여 레시피 생성기의 그라운딩된 데이터 소스를 빌드해 보겠습니다. 사용할 접근 방식은 요리 챗봇에서 사용한 방식과 유사합니다. Vertex AI Agent Builder를 사용하여 데이터 스토어를 만든 다음 이를 검색 앱의 신뢰할 수 있는 소스로 사용합니다.

원하는 경우 Google Cloud 콘솔에서 Gemini에게 Agent Builder 검색 앱을 만드는 단계를 알려 달라고 요청하거나 아래 단계를 따르세요.

  1. 검색을 사용하여 Agent Builder로 이동합니다. 데이터 스토어데이터 스토어 만들기를 엽니다. 이번에는 BigQuery 데이터 스토어 유형을 선택합니다.
  2. 표 선택 셀에서 찾아보기를 누르고 recipes을 검색합니다. 표 옆에 있는 라디오 버튼을 선택합니다. 다른 qwiklabs-gcp-... 프로젝트의 레시피가 표시되면 내 프로젝트에 속한 레시피를 선택해야 합니다.참고: 옆에 있는 라디오 버튼을 선택하지 않고 recipes를 클릭하면 브라우저에서 새 탭이 열리고 BigQuery의 테이블 개요 페이지로 이동합니다. 브라우저 탭을 닫고 에이전트 빌더에서 라디오 버튼을 선택하면 됩니다.
  3. 나머지 기본 옵션은 검토하되 변경하지 않고 계속을 클릭합니다.
  4. 스키마 검토 페이지에서 초기 기본 구성을 검토하되 아무것도 변경하지 마세요. 계속
  5. 데이터 스토어 이름을 recipe-data로 지정합니다. 데이터 스토어 ID를 수정하고 recipe-data-id로 설정합니다. 데이터 스토어를 만듭니다.
  6. 왼쪽 탐색 메뉴를 사용하여 으로 이동하고 새 앱 만들기를 클릭합니다.
  7. 웹사이트 검색 카드에서 만들기를 클릭합니다. 앱 이름을 recipe-search로 지정하고 수정을 클릭하여 ID를 recipe-search-id로 설정합니다. 회사 이름을 Google로 설정하고 계속을 클릭합니다.
  8. 이번에는 recipe-data 데이터 소스를 확인합니다. 앱을 만듭니다.

데이터베이스 테이블이 색인을 생성하는 데 시간이 걸립니다. 그동안 BigQuery의 새로운 데이터 캔버스를 실험하여 흥미로운 레시피를 찾아보겠습니다.

  1. 검색창을 사용하여 BigQuery로 이동합니다. BigQuery Studio 상단에서 가장 오른쪽에 있는 탭 옆의 아래쪽 화살표를 클릭하고 데이터 캔버스를 선택합니다. 리전을 us-central1로 설정합니다.데이터 캔버스 열기
  2. 데이터 검색을 클릭합니다. 데이터 캔버스 검색창에서 recipes를 검색하고 Enter/Return를 눌러 검색한 다음 테이블 이름 옆에 있는 캔버스에 추가 버튼을 클릭합니다.
  3. 레시피 테이블의 시각적 표현이 BigQuery 데이터 캔버스에 로드됩니다. 테이블의 스키마를 탐색하고, 테이블의 데이터를 미리 보고, 기타 세부정보를 살펴볼 수 있습니다. 표 표현 아래에서 쿼리를 클릭합니다.
  4. 캔버스에는 일반적인 BigQuery 쿼리 대화상자가 로드되는데, 쿼리 창 위에 Gemini에 도움을 요청하는 데 사용할 수 있는 텍스트 상자가 추가되어 있습니다. 샘플에서 케이크 레시피를 찾을 수 있는지 확인해 보겠습니다. 다음 프롬프트를 실행합니다 (텍스트를 입력하고 Enter/Return을 눌러 SQL 생성을 트리거).
    Please select the title and ingredients for all the recipes with a title that contains the word cake.
    
  5. 생성된 SQL을 확인합니다. 만족스러우면 쿼리를 실행합니다.
  6. 나쁘지 않죠? 계속 진행하기 전에 다른 프롬프트와 쿼리를 몇 개 실험해 보세요. 실험할 때는 덜 구체적인 프롬프트를 사용하여 효과가 있는 것과 없는 것을 확인하세요. 예를 들어 다음 프롬프트의 경우
    Do I have any chili recipes?
    
    (새 쿼리를 실행해야 함) 칠리 레시피 목록을 반환했지만 재료는 빠져 있었습니다. 다음으로 수정할 때까지는요.
    Do I have any chili recipes?  Please include their title and ingredients.
    
    (네, 프롬프트할 때 '해 줘'라고 말합니다. 엄마가 정말 좋아하실 텐데.) 한 칠리 레시피에 버섯이 들어 있는 것을 봤는데, 칠리에 버섯이 들어가는 걸 누가 좋아하겠어요? Gemini에게 이러한 레시피를 제외해 달라고 요청했습니다.
    Do I have any chili recipes?  Please include their title and ingredients, and ignore any recipes with mushrooms as an ingredient.
    

8. Cloud Shell 편집기 열기

  1. Cloud Shell 편집기로 이동합니다.
  2. 터미널이 화면 하단에 표시되지 않으면 다음을 실행하여 엽니다.
    • 햄버거 메뉴 햄버거 메뉴 아이콘를 클릭합니다.
    • 터미널을 클릭합니다.
    • 새 터미널을 클릭합니다.Cloud Shell 편집기에서 새 터미널 열기
  3. 터미널에서 다음 명령어를 사용하여 프로젝트를 설정합니다.
    • 형식:
      gcloud config set project [PROJECT_ID]
      
    • 예:
      gcloud config set project lab-project-id-example
      
    • 프로젝트 ID를 기억할 수 없는 경우 다음 단계를 따르세요.
      • 다음 명령어를 사용하여 모든 프로젝트 ID를 나열할 수 있습니다.
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Cloud Shell 편집기 터미널에서 프로젝트 ID 설정
  4. 승인하라는 메시지가 표시되면 승인을 클릭하여 계속합니다. 클릭하여 Cloud Shell 승인
  5. 다음 메시지가 표시되어야 합니다.
    Updated property [core/project].
    
    WARNING이 표시되고 Do you want to continue (Y/N)?라는 메시지가 표시되면 프로젝트 ID를 잘못 입력한 것일 수 있습니다. N를 누르고 Enter를 누른 후 gcloud config set project 명령어를 다시 실행해 보세요.

9. API 사용 설정

터미널에서 API를 사용 설정합니다.

gcloud services enable \
  compute.googleapis.com \
  sqladmin.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  networkconnectivity.googleapis.com \
  servicenetworking.googleapis.com \
  cloudaicompanion.googleapis.com

승인하라는 메시지가 표시되면 승인을 클릭하여 계속합니다. 클릭하여 Cloud Shell 승인

이 명령어를 완료하는 데 몇 분이 걸릴 수 있지만 결국 다음과 비슷한 성공 메시지가 표시됩니다.

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

10. Gemini의 도움을 받아 핵심 Python 및 Streamlit 웹 애플리케이션 프레임 구성

Vertex AI Agent Builder 데이터 스토어의 색인이 생성되고 검색 앱이 거의 준비되었으므로 웹 애플리케이션을 빌드해 보겠습니다.

작업하는 동안 Gemini Code Assist를 활용할 예정입니다. Visual Studio Code에서 Gemini Code Assist를 사용하는 방법에 대한 자세한 내용은 여기의 문서를 참고하세요.

  1. Cloud Shell 편집기 터미널에서 다음 명령어를 실행하여 레시피 앱 저장소를 클론합니다.
    git clone https://github.com/haggman/recipe-app
    
  2. 이 명령어를 실행하여 Cloud Shell 편집기에서 애플리케이션 폴더를 엽니다.
    cloudshell open-workspace recipe-app/
    
  3. 클론된 폴더를 살펴보고 웹 애플리케이션 작업을 시작하기 전에 편집기의 Cloud Code 플러그인이 Google Cloud에 로그인되어 있어야 하고 Gemini를 사용 설정해야 합니다. 그럼 시작하겠습니다. 편집기의 왼쪽 하단에서 Cloud Code - 로그인을 클릭합니다. 링크가 표시되지 않으면 잠시 기다렸다가 다시 확인하세요.Cloud Code - Sign In
  4. 터미널 창에 긴 URL이 표시됩니다. 브라우저에서 URL을 열고 단계에 따라 Cloud Code에 Google Cloud 환경 액세스 권한을 부여합니다. 마지막 대화상자에서 인증 코드를 복사하고 Cloud Shell 편집기 브라우저 탭의 대기 중인 터미널 창에 다시 붙여넣습니다.
  5. 잠시 후 편집기 왼쪽 하단의 Cloud Code 링크가 Cloud Code - 프로젝트 없음으로 변경됩니다. 새 링크를 클릭하여 프로젝트를 선택합니다. 명령어 팔레트가 편집기 상단에 열립니다. Google Cloud 프로젝트 선택을 클릭하고 프로젝트를 선택합니다. 잠시 후 편집기 왼쪽 하단의 링크가 업데이트되어 프로젝트 ID가 표시됩니다. 이는 Cloud Code가 작업 프로젝트에 성공적으로 연결되었음을 나타냅니다.
  6. 이제 프로젝트에 연결된 Cloud Code를 사용하여 Gemini Code Assist를 활성화할 수 있습니다. 편집기 인터페이스의 오른쪽 하단에서 취소선이 그어진 Gemini 로고를 클릭합니다. Gemini Chat 창이 편집기 왼쪽에 열립니다. Google Cloud 프로젝트 선택을 클릭합니다. 명령어 팔레트가 열리면 프로젝트를 선택합니다. 단계를 올바르게 따랐고 Google에서 변경한 사항이 없다면 이제 활성 상태의 Gemini 채팅 창이 표시됩니다.Gemini 사용 중지됨
  7. 터미널, Gemini 채팅, Cloud Code 구성이 모두 설정되었으므로 탐색기 탭을 열고 몇 분 동안 현재 프로젝트의 파일을 살펴봅니다.탐색기
  8. 탐색기에서 수정할 requirements.txt 파일을 엽니다. Gemini 채팅 창으로 전환하여 다음과 같이 질문합니다.
    From the dependencies specified in the requirements.txt file, what type of application are we building?
    
  9. 따라서 Vertex AI 및 Discovery Engine과 상호작용하는 Python 및 Streamlit을 사용하여 대화형 웹 애플리케이션을 빌드하고 있습니다. 지금은 웹 애플리케이션 구성요소에 집중해 보겠습니다. Gemini에 따르면 Streamlit은 Python에서 데이터 기반 웹 애플리케이션을 빌드하기 위한 프레임워크입니다. 이제 다음과 같이 질문합니다.
    Does the current project's folder structure seem appropriate for a Streamlit app?
    
    이 부분에서 Gemini에 문제가 발생하는 경향이 있습니다. Gemini는 현재 편집기에서 열려 있는 파일에 액세스할 수 있지만 전체 프로젝트를 실제로 볼 수는 없습니다. 다음과 같이 질문해 보세요.
    Given the below, does the current project's file and folder structure seem appropriate for a Streamlit app?
    - build.sh
    - Home.py
    - requirements.txt
    - pages
    -- Cooking_Advice.py
    -- Recipe_Search.py
    
    더 나은 답변을 얻으셨나요?
  10. Streamlit에 대해 자세히 알아보겠습니다.
    What can you tell me about Streamlit?
    
    좋습니다. Gemini가 장단점을 포함한 멋진 개요를 제공하는 것을 확인할 수 있습니다.
  11. 단점을 살펴보고 싶다면 다음과 같이 질문할 수 있습니다.
    What are the major downsides or shortcomings?
    
    Gemini Chat은 대화형 (멀티턴)이므로 'Streamlit'이라고 말하지 않아도 됩니다. 채팅 세션에 참여하고 있기 때문에 Gemini는 대화 내용을 알고 있습니다. 언제든지 Gemini 채팅 기록을 완전히 삭제하려면 Gemini 코드 채팅 창 상단의 휴지통 아이콘을 사용하세요.

11. Cloud Run에 웹 애플리케이션 배포

좋습니다. 핵심 애플리케이션 구조가 마련되었지만 모두 작동할까요? 더 나아가 Google Cloud에서 어디에 호스팅해야 할까요?

  1. Gemini 채팅 창에서 다음을 질문합니다.
    If I containerize this application, what compute technologies in Google Cloud would be best for hosting it?
    
  2. IDE에서 아직 작업하지 않은 경우 Google Cloud 어시스턴트를 사용할 수도 있습니다. Google Cloud 콘솔을 열고 Gemini Cloud Assist를 연 다음 다음 질문을 합니다.
    If I have a containerized web application, where would be the best place to run it in Google Cloud?
    
    두 가지 조언이 동일했나요? 이 조언에 동의하시나요? Gemini는 생성형 AI 어시스턴트이며, 사람 어시스턴트와 마찬가지로 Gemini의 모든 말에 동의하지 않을 수도 있습니다. 하지만 Google Cloud와 코드 편집기에서 작업하는 동안 항상 지원을 받을 수 있다면 훨씬 더 효율적으로 작업할 수 있습니다.
  3. 스테이트리스(Stateless) 단기 컨테이너화된 웹 애플리케이션의 경우 Cloud Run이 적합합니다. 코드 편집기의 Gemini 채팅 창에서 다음 프롬프트를 사용해 보세요.
    What steps would be required to run this application in Cloud Run?
    
  4. 가장 먼저 해야 할 일은 Dockerfile을 만드는 것입니다. 편집기를 사용하여 프로젝트 폴더의 루트에 Dockerfile 파일을 만듭니다. 실수로 pages 폴더에 배치하지 않도록 주의하세요. 수정할 파일을 엽니다.
  5. 측면 Gemini 채팅 패널을 사용하여 Dockerfile을 만들어 보겠습니다. 아래와 같은 프롬프트를 사용합니다. 결과가 채팅에 표시되면 추천 Dockerfile 바로 위에 있는 복사 아이콘 옆의 +를 사용하여 추천 코드를 Dockerfile에 삽입합니다.
    Create a Dockerfile for the application in the current folder. The dependencies are defined in requirements.txt and I want you to use the Python 3 slim bookworm base image.
    
    Gemini는 동일한 프롬프트에 항상 동일한 대답을 반환하지 않습니다. Gemini에게 Dockerfile을 처음 요청했을 때 제가 여러분에게 사용을 제안할 정확한 파일을 받았습니다. 방금 다음과 같은 제안을 받았습니다.
    # Base image
    FROM python:3-bookworm-slim
    
    # Set working directory
    WORKDIR /app
    
    # Install dependencies
    RUN apt-get update && apt-get install -y \
        build-essential \
        libpq-dev \
        gcc \
        python3-dev \
        && rm -rf /var/lib/apt/lists/*
    
    # Install pip and virtualenv
    RUN pip install --upgrade pip virtualenv
    
    # Create virtual environment
    RUN python3 -m venv venv
    
    # Activate virtual environment
    WORKDIR /app/venv/bin
    RUN . activate
    
    # Install Streamlit and libraries from requirements.txt
    RUN pip install -r requirements.txt
    
    # Copy application files
    COPY . /app
    
    # Expose port 8501 for Streamlit
    EXPOSE 8501
    
    # Start Streamlit app
    CMD ["streamlit", "run", "main.py"]
    
    정말 멋진 Dockerfile입니다. 조금 단순화할게요. Python에 필요한 모든 항목이 이미 기본 이미지에 있으므로 apt-get 섹션은 필요하지 않습니다. 또한 Python 컨테이너에서 가상 환경을 사용하는 것은 공간 낭비이므로 삭제하는 것이 좋습니다. expose 명령어가 반드시 필요한 것은 아니지만 괜찮습니다. 또한 main.py를 시작하려고 하는데, main.py가 없습니다.
  6. recipe-app 폴더에서 Dockerfile이라는 파일을 만들고 다음 콘텐츠를 붙여넣습니다.
    FROM python:3.11-slim-bookworm
    
    WORKDIR /app
    
    COPY requirements.txt .
    RUN pip install --no-cache-dir --upgrade pip && \
        pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    CMD ["streamlit", "run", "Home.py"]
    
  7. Gemini는 채팅 창을 통해 작동할 수 있지만 데이터 랭글링 노트북에서 사용한 것처럼 주석을 사용하여 코드 파일에서 직접 작동할 수도 있으며 Windows에서는 Control+i, Mac에서는 Command+i를 사용하여 호출할 수도 있습니다. Dockerfile의 아무 곳이나 클릭하고 적절한 Command+i / Control+i 명령어를 사용하여 Gemini를 활성화합니다.
  8. 프롬프트에 아래 내용을 입력합니다. 변경사항을 검토하고 수락합니다.
    Please comment the current file.
    
    정말 멋지지 않나요? 다른 사람의 코드를 사용해야 하는데 변경을 시작하기도 전에 주석이 없는 작업에 대한 기본 이해를 얻느라 시간을 낭비한 적이 얼마나 많았나요? Gemini가 도와드릴게요.
  9. 이제 Gemini에게 Cloud Run을 사용하여 현재 폴더의 Dockerfile에서 recipe-web-app라는 새 이미지를 빌드하고 배포하는 방법을 물어보세요.
    How could I use gcloud to build a new Cloud Run service named recipe-web-app from the current directory?
    
  10. 애플리케이션을 빌드하고 배포해 보겠습니다. 터미널 창에서 gcloud run deploy 명령어를 실행합니다.
    gcloud run deploy recipe-web-app \
        --allow-unauthenticated \
        --source=. \
        --region=us-central1 \
        --port=8501
    
    Artifact Registry 저장소를 만들라는 메시지가 표시되면 enter/return를 누릅니다.
    Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository
    named cloud-run-source-deploy in region us-central1 will be created.
    
    Do you want to continue (Y/n)?
    
  11. 빌드 프로세스를 살펴보면 먼저 Artifact Registry Docker 저장소가 빌드됩니다. 그런 다음 Cloud Build를 사용하여 로컬 폴더의 Dockerfile에서 컨테이너 이미지를 만듭니다. 마지막으로 Docker 이미지가 새 Cloud Run 서비스에 배포됩니다. 스크립트가 끝나면 사용할 Cloud Run 테스트 URL이 표시됩니다.

반환된 링크를 브라우저의 새 탭에서 엽니다. 잠시 시간을 내어 애플리케이션의 구조와 페이지를 살펴보세요. 좋습니다. 이제 생성형 AI 기능을 연결해야 합니다.

12. 요리 조언 페이지를 Cookbook-Search Agent Builder 앱에 연결

웹 애플리케이션을 실행하기 위한 프레임워크가 있지만 두 작업 페이지를 두 Vertex AI Agent Builder 검색 앱에 연결해야 합니다. 요리 조언부터 시작해 보겠습니다.

  1. Cloud Shell 편집기 탭을 열어 둡니다. Google Cloud 콘솔에서 검색을 사용하여 Vertex AI의 Chat으로 이동합니다.
  2. 오른쪽 설정 페이지 창에서 모델을 gemini-1.5-flash-002로 설정합니다. 필요한 경우 모델이 더 긴 대답을 반환할 수 있도록 출력 토큰 한도를 최대로 슬라이드합니다. 안전 필터 설정을 엽니다. 증오심 표현, 음란물, 괴롭힘 콘텐츠를 일부 차단으로 설정합니다. 위험한 콘텐츠를 소수 차단으로 설정하고 저장합니다. 도검류와 절단에 관한 이야기는 Gemini가 폭력으로 잘못 해석할 수 있으므로 위험한 콘텐츠의 점수를 약간 낮게 설정합니다.
  3. 전환 버튼을 슬라이드하여 그라운딩을 사용 설정한 다음 맞춤설정을 클릭합니다. 그라운딩 소스를 Vertex AI Search로 설정하고 데이터 스토어 경로에 다음을 사용합니다. YOUR_PROJECT_ID를 이 안내의 '실습 종료' 버튼 근처에 있는 프로젝트 ID로 변경한 다음 그라운딩 설정을 저장합니다.
    projects/YOUR_PROJECT_ID/locations/global/collections/default_collection/dataStores/old-cookbooks-id
    
    참고: 오류가 발생하면 프로젝트 ID를 실제 프로젝트 ID로 변경하지 않았거나, old-cookbooks Agent Builder 데이터 스토어 ID를 변경하는 단계를 누락했을 수 있습니다. Agent Builder > Data Stores > old-cookbooks에서 실제 데이터 스토어 ID를 확인합니다.
  4. 채팅 메시지를 몇 개 테스트합니다. 아래 내용으로 시작해 보세요. 원하는 경우 다른 항목도 사용해 보세요.
    How can I tell if a tomato is ripe?
    
  5. 모델이 작동하므로 이제 코드를 실험해 보겠습니다. 대화가 코드에 포함되지 않도록 Clear Conversation을 클릭한 다음 Get Code를 클릭합니다.대화 삭제 및 코드 받기
  6. 코드 창 상단에서 노트북 열기를 눌러 앱에 통합하기 전에 Colab Enterprise에서 코드를 실험하고 완성합니다.
  7. 잠시 시간을 내어 코드를 숙지하세요. 원하는 대로 조정하기 위해 몇 가지 변경사항을 적용해 보겠습니다. 시작하기 전에 첫 번째 코드 셀을 실행하여 컴퓨팅에 연결하고 AI Platform SDK를 설치합니다. 블록이 실행되면 세션을 다시 시작하라는 메시지가 표시됩니다. 메시지가 표시되면 안내를 따라 SSH 키를 생성합니다.
  8. Vertex AI Studio에서 가져온 코드로 이동합니다. 메서드 multiturn_generate_content의 이름을 start_chat_session로 변경합니다.
  9. model = GenerativeModel( 메서드 호출로 스크롤합니다. 기존 코드는 generation_configsafety_settings를 정의하지만 실제로 사용하지는 않습니다. 다음과 같이 GenerativeModel 생성을 수정합니다.
    model = GenerativeModel(
        "gemini-1.5-flash-002",
        tools=tools,
        generation_config=generation_config,
        safety_settings=safety_settings,
    )
    
  10. 마지막으로 chat = model.start_chat() 바로 아래에 메서드에 마지막 줄을 추가하여 함수가 chat 객체를 반환하도록 합니다. 완성된 함수는 아래와 같습니다.참고: 이 코드를 노트북에 복사하지 마세요. 단순히 상태를 확인하기 위해 여기에 있습니다.
    def start_chat_session():
        vertexai.init(project="qwiklabs-gcp-02-9a7298ceaaec", location="us-central1")
        tools = [
            Tool.from_retrieval(
                retrieval=grounding.Retrieval(
                    source=grounding.VertexAISearch(datastore="projects/qwiklabs-gcp-02-9a7298ceaaec/locations/global/collections/default_collection/dataStores/old-cookbooks-id"),
                )
            ),
        ]
        model = GenerativeModel(
            "gemini-1.5-flash-002",
            tools=tools,
            generation_config=generation_config,
            safety_settings=safety_settings,
        )
        chat = model.start_chat()
        return chat
    
  11. 코드 셀의 하단으로 스크롤하여 이전 함수를 호출하는 마지막 줄을 새 함수 이름을 호출하고 반환된 객체를 chat 변수에 저장하도록 변경합니다. 변경사항에 만족하면 셀을 실행합니다.
    chat = start_chat_session()
    
  12. 새 코드 셀을 만들고 # Use chat to invoke Gemini and print out the response 주석을 추가합니다. 다음 줄로 이동하여 resp를 입력하면 Gemini가 블록을 자동으로 완성합니다. 프롬프트를 How can I tell if a tomato is ripe?로 업데이트합니다. 셀 실행
    response = chat.send_message("How can I tell if a tomato is ripe?")
    print(response)
    
  13. 응답은 제대로 되었지만, 실제로 원하는 부분은 중첩된 text 필드입니다. 코드 블록을 수정하여 해당 섹션만 출력합니다.
    response = chat.send_message("How can I tell if a tomato is ripe?")
    print(response.candidates[0].content.parts[0].text)
    
  14. 좋습니다. 이제 작동하는 채팅 코드가 있으므로 웹 애플리케이션에 통합해 보겠습니다. start_chat_session 함수를 만드는 코드 셀의 모든 콘텐츠를 복사합니다 (테스트 셀은 필요하지 않음). 셀을 클릭하면 오른쪽 상단에 있는 점 3개 메뉴를 클릭하여 복사할 수 있습니다.셀 복사
  15. Cloud Shell 편집기 탭으로 전환하고 pages\Cooking_Advice.py를 열어 수정합니다.
  16. 댓글을 찾습니다.
    #
    # Add the code you copied from your notebook below this message
    #
    
  17. 복사한 코드를 Add the code 주석 바로 아래에 붙여넣습니다. 좋습니다. 이제 Gemini에 대한 그라운딩된 호출을 통해 채팅 엔진을 구동하는 섹션이 있습니다. 이제 Streamlit에 통합해 보겠습니다.
  18. 주석 바로 아래에 있는 주석 처리된 코드 섹션을 찾습니다.
    #
    # Here's the code to setup your session variables
    # Uncomment this block when instructed
    #
    
  19. 코드의 이 섹션 (다음 Setup done, let's build the page UI 섹션까지)을 주석 해제하고 살펴봅니다. 채팅 및 기록 세션 변수를 만들거나 가져옵니다.
  20. 다음으로 기록 및 채팅 기능을 UI에 통합해야 합니다. 아래 주석이 나올 때까지 코드에서 스크롤합니다.
    #
    # Here's the code to create the chat interface
    # Uncomment the below code when instructed
    #
    
  21. 주석 아래의 나머지 코드의 주석 처리를 삭제하고 잠시 시간을 내어 코드를 살펴봅니다. 원하는 경우 강조 표시하고 Gemini에게 기능을 설명해 달라고 요청하세요.
  22. 좋습니다. 이제 애플리케이션을 빌드하고 배포해 보겠습니다. URL이 다시 표시되면 애플리케이션을 실행하고 요리 어드바이저 페이지를 사용해 보세요. 잘 익은 토마토에 대해 물어보거나 브뤼셀 스프라우트를 맛있게 준비하는 방법을 알고 있을 수도 있습니다.
    gcloud run deploy recipe-web-app \
        --allow-unauthenticated \
        --source=. \
        --region=us-central1 \
        --port=8501
    

정말 멋지네요! 개인 AI 요리 어드바이저 :-)

13. (선택사항) 레시피 검색 페이지를 레시피 검색 Agent Builder 앱에 연결

요리 조언 페이지를 그라운딩된 소스에 연결할 때 Gemini API를 직접 사용했습니다. 레시피 검색의 경우 Vertex AI Agent Builder 검색 앱에 직접 연결해 보겠습니다.

  1. Cloud Shell 편집기에서 pages/Recipe_Search.py 페이지를 열어 수정합니다. 페이지 구조를 조사합니다.
  2. 파일 상단에서 프로젝트 ID를 설정합니다.
  3. search_sample 함수를 검사합니다. 이 코드는 여기에 있는 Discovery Engine 문서에서 거의 바로 가져온 것입니다. 이 노트북에서 작동하는 사본을 확인할 수 있습니다.결과를 반환하는 대신 response.results를 반환하도록 변경했습니다. 이 옵션이 없으면 반환 유형은 결과를 페이지로 나누도록 설계된 객체이며, 이는 기본 애플리케이션에 필요하지 않습니다.
  4. 파일 끝까지 스크롤하여 Here are the first 5 recipes I found 아래의 전체 섹션을 주석 해제합니다.
  5. 방금 주석 해제한 전체 섹션을 강조 표시하고 Gemini Code 채팅을 엽니다. Explain the highlighted code에게 물어보세요. 선택된 항목이 없으면 Gemini가 전체 파일을 설명할 수 있습니다. 섹션을 강조 표시하고 Gemini에게 설명, 댓글 또는 개선을 요청하면 Gemini가 이를 수행합니다.잠시 시간을 내어 설명을 읽어 보세요. Colab Enterprise 노트북을 사용하면 애플리케이션에 통합하기 전에 Gemini API를 살펴볼 수 있습니다. 특히 문서화가 잘 되어 있지 않은 최신 API를 탐색할 때 유용합니다.
  6. 편집기 터미널 창에서 build.sh를 실행하여 최종 애플리케이션을 배포합니다. 새 버전이 배포될 때까지 기다린 후 다음 단계로 이동합니다.

14. (선택사항) 최종 애플리케이션 살펴보기

몇 분 정도 시간을 내어 최종 애플리케이션을 살펴보세요.

  1. Google Cloud 콘솔에서 검색을 사용하여 Cloud Run로 이동한 다음 recipe-web-app을 클릭합니다.
  2. 애플리케이션 테스트 URL (상단)을 찾아 새 브라우저 탭에서 엽니다.
  3. 애플리케이션 홈페이지가 표시됩니다. Streamlit에서 제공하는 기본 레이아웃과 탐색을 확인합니다. pages 폴더의 Python 파일이 탐색 선택사항으로 표시되고 Home.py이 홈페이지로 로드됩니다. 요리 조언 페이지로 이동합니다.
  4. 잠시 후 채팅 인터페이스가 표시됩니다. Streamlit에서 제공하는 멋진 핵심 레이아웃을 다시 한번 확인하세요.
  5. 요리와 관련된 질문을 몇 가지 해 보고 봇이 어떻게 작동하는지 확인해 보세요. 다음과 같은 내용이 표시됩니다.
    Do you have any advice for preparing broccoli?
    
    How about a classic chicken soup recipe?
    
    Tell me about meringue.
    
  6. 이제 레시피를 찾아보겠습니다. 레시피 검색 페이지로 이동하여 몇 가지 검색을 시도해 보세요. 다음과 같은 내용이 표시됩니다.
    Chili con carne
    
    Chili, corn, rice
    
    Lemon Meringue Pie
    
    A dessert containing strawberries
    

15. 축하합니다.

Vertex AI Agent Builder 애플리케이션을 활용하는 애플리케이션을 만들었습니다. 그 과정에서 Gemini Cloud Assist, Gemini Code Assist, BigQuery 데이터 캔버스의 자연어-SQL 기능을 살펴봤습니다. 앞으로의 활동이 더욱 기대됩니다.

삭제

Cloud SQL에는 무료 등급이 없으며 계속 사용하면 요금이 청구됩니다. 추가 비용이 청구되지 않도록 Cloud 프로젝트를 삭제할 수 있습니다.

Cloud Run에서는 서비스를 사용하지 않을 때 비용이 청구되지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데 요금이 부과될 수 있습니다. Cloud 프로젝트를 삭제하면 해당 프로젝트 내에서 사용되는 모든 리소스에 대한 청구가 중단됩니다.

원하는 경우 프로젝트를 삭제합니다.

gcloud projects delete $GOOGLE_CLOUD_PROJECT

cloudshell 디스크에서 불필요한 리소스를 삭제할 수도 있습니다. 다음과 같은 작업을 할 수 있습니다.

  1. Codelab 프로젝트 디렉터리를 삭제합니다.
    rm -rf ~/task-app
    
  2. 경고 이 작업은 실행취소할 수 없습니다. 공간을 확보하기 위해 Cloud Shell의 모든 항목을 삭제하려면 전체 홈 디렉터리를 삭제하면 됩니다. 보관하려는 모든 항목이 다른 곳에 저장되어 있는지 확인하세요.
    sudo rm -rf $HOME