├── .gitignore ├── hello_world.py ├── requirements.txt ├── FB一般廣告V1.png ├── FB一般廣告V2.png ├── FB早鳥優惠廣告V2.png.gz ├── gcp_vertex_ai ├── requirements.txt ├── 螢幕擷取畫面 2024-10-23 215526.png ├── uploads │ └── 螢幕擷取畫面 2024-10-24 151252.png ├── Dockerfile ├── templates │ └── index.html ├── README.md ├── 雲育鏈課程QA問答知識.csv ├── app.py ├── qa_converted.json └── app_with_similar_tune.py ├── flask_web_demo.py ├── cloudstorage_integrate_demo.py ├── cxcxc.html ├── app.py ├── integrate_flask_cloudstorage.py ├── gke_intro.md ├── Dockerfile ├── iam_intro.md ├── cloud_run.md ├── ai-agent.md ├── REVIEW.md ├── compute_engine.md ├── iam_master_and_ops.md ├── cloud_shell_intro.md ├── llm_intro.md ├── cloud_shell_editor_intro.md ├── compute_engine_new.md ├── README.md └── iam_adv.md /.gitignore: -------------------------------------------------------------------------------- 1 | .theia 2 | launch.json -------------------------------------------------------------------------------- /hello_world.py: -------------------------------------------------------------------------------- 1 | print("多數程式語言環境已建置") -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | google-cloud-storage 2 | Flask==3.0.0 3 | gunicorn==20.1.0 4 | Werkzeug==3.0.1 -------------------------------------------------------------------------------- /FB一般廣告V1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/FB一般廣告V1.png -------------------------------------------------------------------------------- /FB一般廣告V2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/FB一般廣告V2.png -------------------------------------------------------------------------------- /FB早鳥優惠廣告V2.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/FB早鳥優惠廣告V2.png.gz -------------------------------------------------------------------------------- /gcp_vertex_ai/requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | google-cloud-aiplatform 3 | google-cloud-storage 4 | gunicorn 5 | Werkzeug -------------------------------------------------------------------------------- /gcp_vertex_ai/螢幕擷取畫面 2024-10-23 215526.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/gcp_vertex_ai/螢幕擷取畫面 2024-10-23 215526.png -------------------------------------------------------------------------------- /gcp_vertex_ai/uploads/螢幕擷取畫面 2024-10-24 151252.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/gcp_vertex_ai/uploads/螢幕擷取畫面 2024-10-24 151252.png -------------------------------------------------------------------------------- /flask_web_demo.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | app = Flask(__name__) 3 | 4 | @app.route('/') 5 | def hello_world(): 6 | return 'Hello, World!' 7 | 8 | app.run(host="0.0.0.0", port=8081) -------------------------------------------------------------------------------- /cloudstorage_integrate_demo.py: -------------------------------------------------------------------------------- 1 | from google.cloud import storage 2 | 3 | # 啟用客戶端 4 | storage_client = storage.Client() 5 | 6 | # 調度瀏覽功能 7 | buckets = storage_client.list_buckets() 8 | 9 | # 打印桶子 10 | for bucket in buckets: 11 | print(bucket.name) -------------------------------------------------------------------------------- /cxcxc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

cxcxc雲育鏈

10 | 11 | 雲育鏈官網 12 | 13 | 14 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from flask import Flask 4 | 5 | app = Flask(__name__) 6 | 7 | 8 | @app.route("/") 9 | def hello_world(): 10 | """Example Hello World route.""" 11 | name = os.environ.get("NAME", "World") 12 | return f"Hello {name}!" 13 | 14 | 15 | if __name__ == "__main__": 16 | app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080))) -------------------------------------------------------------------------------- /integrate_flask_cloudstorage.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from google.cloud import storage 3 | app = Flask(__name__) 4 | # 啟用客戶端 5 | storage_client = storage.Client() 6 | 7 | 8 | @app.route('/') 9 | def hello_world(): 10 | # 調度瀏覽功能 11 | buckets = storage_client.list_buckets() 12 | bucket_result='' 13 | for bucket in buckets: 14 | bucket_result= bucket_result + bucket.name + " \r\n " 15 | return bucket_result 16 | 17 | app.run(host="0.0.0.0",port=8081) 18 | -------------------------------------------------------------------------------- /gke_intro.md: -------------------------------------------------------------------------------- 1 | # 課程前,得先做過Cloud Run 的Lab 2 | 3 | 4 | 5 | # 建立Cluster, 觀看幾處細節 6 | 7 | 右上角可以轉換成虛擬機版本,看到有課程說的Node Pool 8 | 9 | 網路篇,簡單說明 10 | 11 | Control Plane簡單說明 12 | 13 | DataPlane 簡單說明 14 | 15 | Security 簡單看過 16 | 17 | 18 | # 建立叢集之後,做軟體Deploy 19 | 20 | 選擇已存在的image,選擇cxcxc-demo 21 | 22 | 設定Environment variables 23 | 24 | Name aws-saa-all-architecture 25 | PORT 5000 26 | 27 | 設定環節 28 | 29 | 解釋Deployment 跟 namespace 30 | 31 | 設定Expose 32 | 33 | target port 改為5000 34 | 35 | 36 | # 切換到cloud load balancing 37 | 38 | 39 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Use the official lightweight Python image. 2 | # https://hub.docker.com/_/python 3 | FROM python:3.9-slim 4 | 5 | # Allow statements and log messages to immediately appear in the Knative logs 6 | ENV PYTHONUNBUFFERED True 7 | 8 | # Copy local code to the container image. 9 | ENV APP_HOME /app 10 | WORKDIR $APP_HOME 11 | COPY . ./ 12 | 13 | # Install production dependencies. 14 | RUN pip install -r requirements.txt 15 | 16 | # Run the web service on container startup. Here we use the gunicorn 17 | # webserver, with one worker process and 8 threads. 18 | # For environments with multiple CPU cores, increase the number of workers 19 | # to be equal to the cores available. 20 | CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app -------------------------------------------------------------------------------- /gcp_vertex_ai/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use the official lightweight Python image. 2 | # https://hub.docker.com/_/python 3 | FROM python:3.9-slim 4 | 5 | # Allow statements and log messages to immediately appear in the Knative logs 6 | ENV PYTHONUNBUFFERED True 7 | 8 | # Copy local code to the container image. 9 | ENV APP_HOME /app 10 | WORKDIR $APP_HOME 11 | COPY . ./ 12 | 13 | # Install production dependencies. 14 | RUN pip install -r requirements.txt 15 | 16 | # Run the web service on container startup. Here we use the gunicorn 17 | # webserver, with one worker process and 8 threads. 18 | # For environments with multiple CPU cores, increase the number of workers 19 | # to be equal to the cores available. 20 | CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app -------------------------------------------------------------------------------- /iam_intro.md: -------------------------------------------------------------------------------- 1 | # IAM 初探 2 | 3 | ## Step 1 4 | 5 | 在先前的Instance發現無法訪問Cloud Storage,原因在於有Service Account。 6 | 7 | #### 創建Service Account 8 | 設定如下 9 | ``` 10 | name : cxcxc-sa-operate-cs 11 | role: Storage管理員 12 | ``` 13 | 14 | 對該機器關機,並Attach Service account 至該機器上,而後開機並連入,操作下列語句 15 | 16 | ``` 17 | gsutil ls 18 | ``` 19 | 20 | 發現權限已可使用,但缺點很明顯,就是權限開得太大了。 21 | 22 | ## Step 2 23 | 24 | 參考資料: 25 | https://cloud.google.com/iam/docs/conditions-overview 26 | https://cloud.google.com/iam/docs/conditions-resource-attributes 27 | 28 | 為Service Account的權限添加Condition 29 | 30 | 將下列your-bucket-name改為 我方bucket名 31 | ``` 32 | projects/_/buckets/your-bucket-name 33 | ``` 34 | 35 | 而後連入instance內 36 | 37 | ``` 38 | # 發現被禁止 39 | gsutil ls 40 | 41 | # 發現可正常瀏覽 42 | gsutil ls gs://your-bucket-name 43 | ``` 44 | -------------------------------------------------------------------------------- /cloud_run.md: -------------------------------------------------------------------------------- 1 | # 打開cloud shell editor , 下載教材 2 | 3 | https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fcxcxc-io%2Fgcp_basic_architecture_tutorial.git&cloudshell_open_in_editor=cloud_shell_editor_intro.md&cloudshell_workspace=. 4 | 5 | # 打開terminal, 切換project 6 | 7 | ``` 8 | gcloud config set project YOUR-PROJECT-ID 9 | ``` 10 | 11 | # 確認有個Dockerfile 12 | 13 | # 確認有個app.py 14 | 15 | # (optional) 在cloud shell editor 預載執行 16 | 17 | ``` 18 | pip3 install -r requirements.txt 19 | python3 app.py 20 | ``` 21 | 22 | # 建立artifact registry 23 | 24 | ``` 25 | gcloud artifacts repositories create cxcxc-demo --location=asia-east1 --repository-format=docker 26 | ``` 27 | 28 | # 透過cloud build 打包成image, 並存放在artifact registry 29 | 30 | ``` 31 | gcloud builds submit --tag asia-east1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/cxcxc-demo/web-app:0.0.1 32 | ``` 33 | 34 | # 打開cloud run 介面,進行部屬 35 | 可設定環境變數 NAME為任意值 36 | -------------------------------------------------------------------------------- /ai-agent.md: -------------------------------------------------------------------------------- 1 | 建立Service account,權限為 2 | ``` 3 | Vertex AI User 4 | ``` 5 | 6 | 7 | 建立GCE,Service account 指定為剛剛建立的Service account,並安裝Dify 8 | ``` 9 | #!/bin/bash 10 | 11 | # 腳本名稱: startup-script 12 | 13 | echo "等待 apt-get 鎖定被釋放..." 14 | 15 | # 檢查 dpkg 和 apt 的鎖定檔案,如果發現被佔用,則等待 10 秒後重試 16 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 ; do 17 | echo "偵測到 apt-get 正在運行,等待 10 秒..." 18 | sleep 10 19 | done 20 | 21 | echo "apt-get 鎖定已釋放,繼續執行安裝..." 22 | 23 | curl -fsSL https://get.docker.com -o get-docker.sh 24 | sh get-docker.sh 25 | service docker start 26 | 27 | curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 28 | chmod +x /usr/local/bin/docker-compose 29 | git clone -b 1.8.1 https://github.com/langgenius/dify.git 30 | cd dify/docker 31 | docker-compose up -d 32 | ``` 33 | 34 | # Lab1 - AI-Agent的第一次嘗試 35 | 36 | 目標: 知曉 LLM 與 Prompt 37 | 38 | # Lab2 - Workflow的第一次嘗試 39 | 40 | # Lab3 - 透過參數抽取器 做自然語言的json處理 41 | 42 | # Lab4 - 透過問題分類器 做新型態的IF ELSE 43 | 44 | # Lab5 - 透過LLM節點,做進階回復。 45 | 46 | -------------------------------------------------------------------------------- /REVIEW.md: -------------------------------------------------------------------------------- 1 | # GCP 2 | 3 | ### Project 為基底資源管理 4 | 5 | # CloudBilling 6 | 7 | ### 建置帳單帳戶(供付款使用) 8 | 9 | ### 設置快訊(Alarm,帳單警告) 10 | 11 | # Cloud VPC 12 | 13 | ### VPC建置 14 | 15 | ### Route配置 - 僅允許特定標籤的用戶可訪問Internet Gateway 16 | 17 | ### Firewall建置 - 並考慮使用Cloud IAP,使可用GCP Console 管理私網機器 18 | 19 | #### (Optional) Private Google Access 建置 20 | #### Cloud NAT建置 21 | #### Cloud VPN 建置 22 | #### Network Peering Connection 建置 23 | 24 | # Cloud Storage 25 | 26 | ### Bucket建置 27 | 28 | ### 存取權限設置 - IAM or ACL 29 | 30 | #### 資料保護相關措施 31 | 32 | # Cloud IAM - 管理 33 | 34 | ### 建置 Service account,並給予有條件的Role 35 | 36 | ### 引入 Member account(用戶),並給予其調度Service account的權限 37 | 38 | ### 配發Service account 的 Credential 給 用戶 39 | 40 | # Cloud Shell & Editor 41 | 42 | ### 登入專案 43 | 44 | ### 以https連結,快速打造公司專案環境與程式碼,快速協作 45 | 46 | ### 將service account的credential 結合環境變數,開發者在寫程式時,可編寫安全的程式碼。 47 | 48 | ### 以命令列調度service account,將本地的程式資源,放到遠端Cloud Storage Bucket 49 | 50 | # Compute Engine 51 | 52 | ## 部署階段 53 | 54 | ### 開啟機器階段,選用機型與 Service account 55 | 56 | ### 開啟機器階段,並透過Metadata 設置 外部環境變數 57 | 58 | ### 開啟機器階段,設置Startup-script,將Storage內的程式拉取安裝部署 59 | 60 | ### 開啟機器階段,設定Network-tag,允許ssh或public-subnet訪問 61 | 62 | ## 維護管理階段 63 | 64 | ### 啟用OS Login 功能,後續人員皆能以email登入該機器管理。 65 | 66 | -------------------------------------------------------------------------------- /compute_engine.md: -------------------------------------------------------------------------------- 1 | # STEP 1 2 | 3 | 開機之後,嘗試安裝 男人的浪漫老遊戲,並把先前的網頁載入進來,發現Compute Engine也能跟GCP Resource溝通。 4 | 5 | 連入之後的指令如下 6 | ``` 7 | curl -fsSL https://get.docker.com -o get-docker.sh 8 | sudo sh get-docker.sh 9 | sudo service docker start 10 | sudo docker run -d --name dosgame -p 80:262 oldiy/dosgame-web-docker:latest 11 | ``` 12 | 13 | # STEP 2 14 | 15 | ### Startup-script 16 | 17 | ``` 18 | #!/bin/bash 19 | 20 | curl -fsSL https://get.docker.com -o get-docker.sh 21 | sh get-docker.sh 22 | service docker start 23 | docker run -d --name dosgame -p 80:262 oldiy/dosgame-web-docker:latest 24 | 25 | ``` 26 | 27 | 訪問外部IP,發現有網頁 28 | 29 | 瀏覽tmp資料夾,確認沒有cxcxc檔案 30 | ``` 31 | ls /tmp 32 | ``` 33 | 34 | # STEP 3 35 | 36 | 對機器進行關機,並更新Startup-script內容,並撤下Service account,並在console內追加meatadata 37 | 38 | ### metadata內容值 39 | 40 | ``` 41 | 欄位:內容 42 | METADATA_DEMO:cxcxc 43 | 44 | ``` 45 | 46 | ### Startup-script 47 | ``` 48 | #!/bin/bash 49 | 50 | curl -fsSL https://get.docker.com -o get-docker.sh 51 | sh get-docker.sh 52 | service docker start 53 | docker run -d --name dosgame -p 80:262 oldiy/dosgame-web-docker:latest 54 | 55 | METADATA_DEMO=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/METADATA_DEMO" -H "Metadata-Flavor: Google") 56 | touch /tmp/$METADATA_DEMO 57 | 58 | ``` 59 | 60 | 編輯完成後,再開機,並連入 61 | 62 | 連入後,觀察tmp資料夾,發現已有檔案出現 63 | ``` 64 | ls /tmp 65 | ``` 66 | 67 | # STEP4 68 | 69 | 重新以gsutil訪問桶子,發現沒有service account 不能訪問 70 | ``` 71 | gsutil ls 72 | ``` 73 | 74 | 從內部訪問Webserver,發現可行 75 | ``` 76 | curl localhost:80/cxcxc.html 77 | ``` 78 | 79 | 從外部訪問,發現無法訪問,原因是在於firewall沒開放 80 | 81 | 為該instance貼network-tag,內容如下 82 | 83 | ``` 84 | http-server 85 | ``` 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /iam_master_and_ops.md: -------------------------------------------------------------------------------- 1 | # Lab1 - Service Account的重複創建 2 | 3 | ## 建置Service Account 4 | 5 | 設定Service account 名字為 6 | 7 | `cxcxc-sa-demo` 8 | 9 | 給予 `Storage Object Viewer` 的Role 10 | *** 11 | 12 | ## 建立GCE Instance 13 | 14 | 規格選擇 e2-micro 15 | 16 | 地區選擇 台灣 17 | 18 | 服務帳戶選用先前建置的`cxcxc-sa-demo` 19 | 20 | *** 21 | 22 | ## 連入Instance 23 | 24 | 25 | 使用gsutil驗證權限 26 | ``` 27 | gsutil ls 28 | ``` 29 | *** 30 | 31 | ## 移除Service Account,並重新建立Service Account 32 | 33 | 設定Service account 名字為 34 | 35 | `cxcxc-sa-demo` 36 | 37 | 給予 `Storage Object Admin` 的Role 38 | 39 | 在Instance內,重新輸入 40 | ``` 41 | gsutil ls 42 | ``` 43 | 關機,重新設定Service account為 `cxcxc-sa-demo` 44 | 45 | 開機連入Instance,重新輸入 46 | ``` 47 | gsutil ls 48 | ```` 49 | 50 | *** 51 | 52 | # Lab2 - 客製化Role 53 | 54 | ## 創建Role,並附加至Service Account 55 | 56 | 創建Role,名為 57 | 58 | `CloudStorageReadOnly` 59 | 60 | 選用下方兩個動作 61 | 62 | ``` 63 | storage.objects.get 64 | storage.objects.list 65 | ``` 66 | 67 | 找到先前建置的cxcxc-sa-demo 服務帳戶,權限更換為此Role 68 | 69 | ## 測試Service Account的權限 70 | 71 | 為cxcxc-sa-demo 服務帳戶,追加自身Role為`Service account token creator ` 72 | 73 | ### 啟用Cloud shell,輸入下方指令 74 | 75 | ``` 76 | gsutil -i <你的服務帳戶全名> ls 77 | 78 | gsutil -i <你的服務帳戶全名> cp README.md <你的Cloud Storage Bucket名> 79 | ``` 80 | 81 | # Lab3 - 設定可設定其他權限的角色 82 | 83 | ### 切換至IAM 管理介面,添加第二用戶,賦予 84 | 85 | ``` 86 | Project IAM Admin Role 87 | ``` 88 | 89 | 設置條件,此條件為關鍵,只允許該用戶管理特定服務的權限,範例為僅允許授權Storage Admin 90 | 91 | ``` 92 | api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/storage.admin']) 93 | ``` 94 | *** 95 | ### 切換為第二用戶,透過第二用戶,添加第三用戶 96 | 97 | 權限為 Storage Viewer,發現失敗 98 | 99 | 將權限改為 Storage Admin,發現成功 100 | 101 | ### 切換為第三用戶,透過第三用戶,操作Cloud Storage 102 | 103 | ``` 104 | gcloud config set project <你的project-id> 105 | gsutil ls 106 | ``` 107 | 108 | 109 | # Lab4 OpsAgent體驗 110 | 111 | 建立Service account 112 | 113 | 建立一台GCE Instance,透過Startup-script安裝stress 114 | ``` 115 | #!/bin/bash 116 | apt-get install -y stress 117 | ``` 118 | 設置alarm與notification 119 | 120 | 安裝opt agent 121 | 122 | 連入後,進行軟體壓力測試 123 | ``` 124 | nohup stress -c 2 -m 2 --vm-bytes 512M -t 600s & 125 | ``` 126 | 收到警告 127 | 128 | 129 | 移除警告 130 | 131 | 132 | 機器刪除 133 | -------------------------------------------------------------------------------- /cloud_shell_intro.md: -------------------------------------------------------------------------------- 1 | # 本地端使用gcloud 2 | 3 | 4 | ``` 5 | # 登入aws console 6 | # 啟用aws 的cloud shell vm,充當外部筆電 7 | https://cxcxc-learning.signin.aws.amazon.com/console 8 | 9 | # 在裡面植入gcloud sdk套件庫 10 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM 11 | [google-cloud-sdk] 12 | name=Google Cloud SDK 13 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64 14 | enabled=1 15 | gpgcheck=1 16 | repo_gpgcheck=0 17 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg 18 | https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg 19 | EOM 20 | 21 | # 安裝gcloud sdk 22 | sudo yum install -y google-cloud-sdk 23 | 24 | 25 | # 登入指令,而後彈跳出一個網址,點擊後,輸入google帳號進行驗證 26 | # gcloud auth login 27 | gcloud init --console-only 28 | 29 | # 設定要操作的專案 30 | gcloud config set project {PROJECT_ID} 31 | ``` 32 | 33 | 34 | # 在Cloud Shell 內使用gcloud 35 | 36 | 省略了 gcloud auth login 這個環節,直接跳到設定操作專案的環節 37 | 38 | ``` 39 | gcloud config set project {PROJECT_ID} 40 | ``` 41 | 42 | # 使用gsutil 訪問 cloud storage 43 | 44 | 不要記指令,只需要記核心名詞,而後丟到Google去快速檢索。 45 | 46 | 比如 gsutil bucket list 就能馬上找到範例 47 | 48 | https://cloud.google.com/storage/docs/listing-buckets 49 | 50 | google goo得好, 工程師當到老。 51 | 52 | ``` 53 | # 瀏覽 當前專案下所有的bucket 54 | gsutil ls 55 | 56 | # 瀏覽 bucket內,有哪些object 57 | gsutil ls gs://your-bucket-name/folder/ 58 | 59 | # 將準備好的範例網頁,而後將該檔案上傳 至 指定的bucket內 60 | gsutil cp cxcxc.html gs://your-bucket-name/folder/ 61 | 62 | # 瀏覽 bucket內,有哪些object 63 | gsutil ls gs://your-bucket-name/folder/ 64 | 65 | # 刪除 該object,範例,先不要用 66 | # gsutil rm gs://your-bucket-name/folder/object 67 | 68 | 69 | 70 | ``` 71 | # 調度那些GCP沒放在Console上的功能 72 | ``` 73 | # 瀏覽 bucket目前的屬性 74 | gsutil ls -L -b {YOUR-BUCKET-NAME} 75 | 76 | # 對桶子設定版本號 77 | gsutil versioning set on {YOUR-BUCKET-NAME} 78 | 79 | # 瀏覽 bucket目前的屬性 80 | gsutil ls -L -b {YOUR-BUCKET-NAME} 81 | 82 | # 關閉桶子的版本號 83 | gsutil versioning set off {YOUR-BUCKET-NAME} 84 | 85 | ``` 86 | 87 | # 變更Cloud Shell的基底環境 88 | 89 | ``` 90 | # .customize_enviroment 是cloud shell預設的隱藏腳本 91 | echo touch /tmp/cxcxc_demo.txt > ~/.customize_environment 92 | 93 | # 透過網頁重新啟動cloud shell 94 | 95 | # 搜尋 /tmp 資料夾,發現已有cxcxc_demo.txt檔案 96 | ls /tmp 97 | 98 | ``` 99 | 100 | # 清除Cloud Shell環境 101 | 102 | ``` 103 | # 刪除家目錄內所有內容 104 | sudo rm -rf $HOME 105 | 106 | 107 | # 透過網頁重新啟動cloud shell 108 | 109 | ``` 110 | -------------------------------------------------------------------------------- /llm_intro.md: -------------------------------------------------------------------------------- 1 | # 理解LLM、System Prompt之間的關係 2 | 3 | ## 進入Google AI Studio網站進行註冊 4 | 5 | google 搜尋 google ai studio,或點下方網址進入 6 | ``` 7 | https://aistudio.google.com/ 8 | ``` 9 | 10 | ## 建立第一個AI-Agent 11 | 12 | 點擊 create a prompt 13 | 14 | 設定 System Instruction 15 | ``` 16 | 如果有人問 雲端證照的內容時,妳會跟她說雲端證照的用途,可作為 政府標案、補助計劃的資質證明。 17 | 18 | 並告訴他 可以google搜尋雲育鏈,得到更多資料。 19 | ``` 20 | 21 | 進行對話 22 | ``` 23 | 請問雲端證照有什麼用 24 | ``` 25 | 26 | ## 觀察介面 27 | 28 | 右上角有個Model,可以做選擇。 29 | 30 | # 理解System Prompt 與 User Prompt之間的差異 31 | 32 | ## 建立第二個AI-Agent 33 | 34 | 點擊 Create Prompt 35 | 36 | 設定System Instruction 37 | ``` 38 | 如果有人問 雲端證照的內容時,妳會跟她說雲端證照的用途,可作為 政府標案、補助計劃的資質證明。 39 | 40 | 並告訴他 可以google搜尋雲育鏈,得到更多資料。 41 | ``` 42 | 43 | 在下方對話框內,詢問 ai-agent 44 | 45 | ``` 46 | 雲端證照能有什麼用途 47 | ``` 48 | 49 | 在下方對話框內,告知ai-agent 50 | ``` 51 | 以後有人問雲端證照的時候,就告訴他有aws-saa證照、aws-ai證照、gcp-ace證照 52 | ``` 53 | 54 | 在下方對話框內,重新再詢問一次ai-agent 55 | 56 | ``` 57 | 雲端證照能有什麼用途 58 | ``` 59 | 60 | 在下方對話框內,告知ai-agent 61 | 62 | ``` 63 | 以後有人問aws-saa的時候,就告訴他 64 | https://www.cxcxc.io/aws-solution-architect-course/ 65 | 66 | 以後有人問gcp-ace的時候,就告訴他 67 | https://www.cxcxc.io/gcp-ace/ 68 | 69 | 以後有人問aws-ai的時候,就告訴他 70 | https://www.cxcxc.io/aws-certified-ai-practitioner-and-aigc-agent-course/ 71 | ``` 72 | 73 | 在下方對話框內,重新再詢問一次ai-agent 74 | 75 | ``` 76 | aws-saa證照是什麼?能有什麼用途? 77 | ``` 78 | 79 | # 資訊系統交互的核心 – API 與 Json 80 | 81 | ## 啟用 Structured output 82 | 83 | Create a prompt 84 | 85 | 啟用右方的Structured output 86 | 87 | 設定所需要的json格式, 選擇Code Editor模式 88 | ``` 89 | { 90 | "type": "object", 91 | "properties": { 92 | "cloud_type": { 93 | "type": "string" 94 | }, 95 | "certificate_name": { 96 | "type": "string" 97 | } 98 | } 99 | } 100 | ``` 101 | 102 | 設定System Instruction 103 | ``` 104 | 當用戶詢問特定雲端的相關認證時,自動調度Structure output,生成json 105 | ``` 106 | 107 | 用戶詢問 108 | ``` 109 | 我想要考aws saa 該怎麼辦? 110 | ``` 111 | 112 | # 交付給遠端系統前的資料前處理 – Code Execution 113 | 114 | 關閉 Structured output 115 | 116 | 啟用 Code execution 117 | 118 | 設定 System instruction,告知什麼時候該用 Code execution 119 | ``` 120 | aws-saa課程費用,一人為84020元 121 | 如果有人問aws-saa的課程費用多少錢時,詢問對方要上課人數,並透過code execution進行費用計算 122 | ``` 123 | 124 | # 替代傳統if else 的大武器 – Function Calling 125 | 126 | 關閉 Code execution 127 | 128 | 啟用 Function Calling,進行編輯 129 | ``` 130 | [ 131 | { 132 | "name": "aws_qa", 133 | "description": "用戶詢問的問題與aws相關" 134 | }, 135 | { 136 | "name": "gcp_qa", 137 | "description": "用戶詢問的問題與gcp相關" 138 | } 139 | ] 140 | 141 | ``` 142 | 設定 System instruction,告知什麼時候該用 Function calling 143 | ``` 144 | 當用戶詢問雲端相關問題的時候,交由Function calling 判斷,該由哪個function 回應 145 | ``` 146 | 147 | 用戶問話 148 | ``` 149 | 我aws的ec2故障了,該怎麼辦呢 150 | ``` 151 | -------------------------------------------------------------------------------- /cloud_shell_editor_intro.md: -------------------------------------------------------------------------------- 1 | # Cloud Shell Editor的大功用 2 | 3 | 讓大家的環境都給統一起來,比如建構統一的專案環境。 4 | 5 | 複製下方連結,貼回瀏覽器上。 6 | 7 | 我們會發現他把github資料夾給下載到cloud shell內了。 8 | 9 | 10 | https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fcxcxc-io%2Fgcp_basic_architecture_tutorial.git&cloudshell_open_in_editor=cloud_shell_editor_intro.md&cloudshell_workspace=. 11 | 12 | 13 | reference: 14 | https://cloud.google.com/shell/docs/open-in-cloud-shell#url_parameters 15 | 16 | 可以嘗試看看抓其他的資料夾,未來可以使用他的container image 17 | 18 | 19 | ## 設置資料夾為工作目錄(optional) 20 | 21 | 對新增的資料夾點擊右鍵,設置Workspace 22 | 23 | ## 先行安裝環境 24 | ``` 25 | sudo pip3 install -r requirements.txt 26 | ``` 27 | 28 | ## 執行 hello_world.py 29 | 30 | 啟用terminal,觀察 Cloud Shell的Python3開發環境 31 | 32 | 在terminal內,使用python3執行hello_world.py 33 | 34 | ``` 35 | python3 --version 36 | 37 | python3 hello_world.py 38 | ``` 39 | ## 執行 flask_web_demo.py 40 | 41 | 點開flask_web_demo.py,得知其內容是啟用web server 42 | 43 | 在terminal內,使用python3執行flask_web_demo.py 44 | 45 | 彈跳出網頁連結,發現我方仍可觀看網頁開發結果 46 | 47 | ``` 48 | python3 flask_web_demo.py 49 | ``` 50 | ## 執行 cloudstorage_integrate_demo.py 51 | 52 | 點開cloudstorage_integrate_demo.py,得知python調度cloudstorage的方式。 53 | 54 | 程式碼不要記,只需要記住關鍵字 55 | python list bucket cloud storage 56 | 57 | https://cloud.google.com/storage/docs/listing-buckets#storage-list-buckets-python 58 | 59 | 60 | 在terminal內,使用python3執行cloudstorage_integrate_demo.py 61 | 62 | ``` 63 | python3 cloudstorage_integrate_demo.py 64 | 65 | ``` 66 | 67 | 發現不能執行,原因在於沒有指定Project 68 | 69 | 兩種方案 70 | 71 | ### 第一種方案在當前terminal切換專案,並在當前terminal執行python腳本 72 | 73 | ``` 74 | gcloud config set project {YOUR-PROJECT-ID} 75 | python3 cloudstorage_integrate_demo.py 76 | ``` 77 | 78 | ### 第二種追加客製腳本,使自動進入專案 79 | 80 | #### 打開客製化腳本,並鍵入 i ,開始編輯 81 | 82 | https://cloud.google.com/shell/docs/configuring-cloud-shell#gcloud_command-line_tool_preferences 83 | 84 | 85 | ``` 86 | vim ~/.bashrc 87 | ``` 88 | 89 | #### 將下方Project-ID名更改後,貼入檔案內的最下方 90 | ``` 91 | gcloud config set project {YOUR-PROJECT-ID} 92 | ``` 93 | 94 | #### 重新啟用一個terminal 95 | 96 | 97 | #### 運行腳本,發現可瀏覽所有bucket 98 | 99 | 100 | # Web Server與CloudStorage整合 101 | 102 | 打開integrate_flask_cloudstorage.py,得知內容是Web server整合 cloud storage 103 | 104 | 點開terminal,以python3執行integrate_flask_cloudstorage.py 105 | 106 | 發現已可編寫一個具備GCP調度能力的WEB應用 107 | 108 | ``` 109 | python3 integrate_flask_cloudstorage.py 110 | ``` 111 | 112 | # 下一步教材準備 113 | 114 | ## 使用命令列,將 cxcxc.html放入先前建置好的Bucket(optional) 115 | 116 | ``` 117 | gsutil cp cxcxc.html gs://YOUR-BUCKET-NAME/FOLDER/ 118 | ``` 119 | 120 | ## 假裝我們已經開發完了,軟體的部屬指令如下 121 | 122 | ``` 123 | docker run -d --name dosgame -p 8080:262 oldiy/dosgame-web-docker:latest 124 | ``` 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /gcp_vertex_ai/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | AI 對話框 7 | 73 | 74 | 75 |

AI 對話框

76 |
77 | 78 |
79 |
80 | 81 | 82 | 83 |
84 | 85 | 86 | -------------------------------------------------------------------------------- /compute_engine_new.md: -------------------------------------------------------------------------------- 1 | # STEP 1 2 | 3 | 開機之後,嘗試安裝 男人的浪漫老遊戲,並把先前的網頁載入進來,發現Compute Engine也能跟GCP Resource溝通。 4 | 5 | 連入之後的指令如下 6 | ``` 7 | curl -fsSL https://get.docker.com -o get-docker.sh 8 | sudo sh get-docker.sh 9 | sudo service docker start 10 | sudo docker run -d --name dosgame -p 443:262 oldiy/dosgame-web-docker:latest 11 | sudo docker run -d -p 80:5000 -e PORT=5000 -e METADATA_DEMO=abc b97607065/gcp_metadata_demo:0.0.3 12 | ``` 13 | 14 | # STEP 2 15 | 16 | ### Startup-script 17 | 18 | ``` 19 | #!/bin/bash 20 | 21 | # 腳本名稱: startup-script 22 | 23 | echo "等待 apt-get 鎖定被釋放..." 24 | 25 | # 檢查 dpkg 和 apt 的鎖定檔案,如果發現被佔用,則等待 10 秒後重試 26 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 ; do 27 | echo "偵測到 apt-get 正在運行,等待 10 秒..." 28 | sleep 10 29 | done 30 | 31 | echo "apt-get 鎖定已釋放,繼續執行安裝..." 32 | 33 | # 1. 安裝 Docker 34 | # 下載 Docker 安裝腳本並執行 35 | curl -fsSL https://get.docker.com -o get-docker.sh 36 | sh get-docker.sh 37 | 38 | # 2. 啟動 Docker 服務 39 | # 這是必要的,否則後面的 docker 指令會失敗 40 | echo "啟動 Docker 服務..." 41 | systemctl start docker 42 | 43 | # 3. 執行第一個 Docker 容器 44 | echo "啟動 dosgame 容器..." 45 | docker run -d --name dosgame -p 443:262 oldiy/dosgame-web-docker:latest 46 | 47 | # 4. 執行第二個 Docker 容器 48 | echo "啟動 gcp_metadata_demo 容器..." 49 | docker run -d -p 80:5000 -e PORT=5000 -e METADATA_DEMO=abc b97607065/gcp_metadata_demo:0.0.3 50 | 51 | echo "所有腳本指令執行完畢!" 52 | ``` 53 | 54 | 訪問外部IP,發現有網頁 55 | 56 | 瀏覽tmp資料夾,確認沒有cxcxc檔案 57 | ``` 58 | ls /tmp 59 | ``` 60 | 61 | # STEP 3 62 | 63 | 對機器進行關機,並更新Startup-script內容,並撤下Service account,並在console內追加meatadata 64 | 65 | ### metadata內容值 66 | 67 | ``` 68 | 欄位:內容 69 | METADATA_DEMO:cxcxc 70 | 71 | ``` 72 | 73 | ### Startup-script 74 | ``` 75 | #!/bin/bash 76 | 77 | # 腳本名稱: startup-script 78 | 79 | echo "等待 apt-get 鎖定被釋放..." 80 | 81 | # 檢查 dpkg 和 apt 的鎖定檔案,如果發現被佔用,則等待 10 秒後重試 82 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 ; do 83 | echo "偵測到 apt-get 正在運行,等待 10 秒..." 84 | sleep 10 85 | done 86 | 87 | echo "apt-get 鎖定已釋放,繼續執行安裝..." 88 | 89 | 90 | curl -fsSL https://get.docker.com -o get-docker.sh 91 | sh get-docker.sh 92 | service docker start 93 | 94 | METADATA_DEMO=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/METADATA_DEMO" -H "Metadata-Flavor: Google") 95 | touch /tmp/$METADATA_DEMO 96 | docker run -d -p 80:5000 -e PORT=5000 -e METADATA_DEMO=$METADATA_DEMO b97607065/gcp_metadata_demo:0.0.3 97 | ``` 98 | 99 | 編輯完成後,再開機,並連入 100 | 101 | 連入後,觀察tmp資料夾,發現已有檔案出現 102 | ``` 103 | ls /tmp 104 | ``` 105 | 106 | # STEP4 107 | 108 | 重新以gsutil訪問桶子,發現沒有service account 不能訪問 109 | ``` 110 | gsutil ls 111 | ``` 112 | 113 | 從內部訪問Webserver,發現可行 114 | ``` 115 | curl localhost:80/cxcxc.html 116 | ``` 117 | 118 | 從外部訪問,發現無法訪問,原因是在於firewall沒開放 119 | 120 | 為該instance貼network-tag,內容如下 121 | 122 | ``` 123 | http-server 124 | ``` 125 | 126 | 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GCP經典課程Lab總覽 2 | 3 | 4 | *描述如下* 5 | 6 | 有部分實作,為瀏覽器行為操作,這種Lab請同學參照講義進行實作 7 | 還有另一部分實作,為指令或程式碼類型操作,請參照此Repo相關的檔案 8 | 9 | # Cloud Billing 10 | 11 | *參照講義,進行內容操作。* 12 | 13 | ## 1. 帳號、信用卡付費關聯與預算警告 14 | 15 | 16 | # Cloud Storage 17 | 18 | *參照講義,進行內容操作。* 19 | 20 | ## 1. 桶子建立、上下傳物件 21 | 22 | 參照講義,進行內容操作,在過程中,老師會逐步講解看到的實作環節背後的意義。 23 | 24 | ## 2. 桶子權限操作 25 | 26 | 參照講義,按實作圖進行操作,在過程中,老師將會逐步講解Cloud Storage的權限設計內容。 27 | 28 | ## 3. 利用桶子的快取進行節費 29 | 30 | 先將下面兩張圖片儲存到本地端 31 | 32 | 33 | https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/FB%E4%B8%80%E8%88%AC%E5%BB%A3%E5%91%8AV1.png 34 | 35 | 36 | https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/FB%E4%B8%80%E8%88%AC%E5%BB%A3%E5%91%8AV2.png 37 | 38 | 確認先前建立桶子的權限是對外公開 39 | 40 | 上傳第一張照片(FB一般廣告V1.png) 至先前的桶子,並點擊右方三個點,編輯中繼資料,找到Cache-Control的欄位,輸入下方欄位值 41 | ``` 42 | public, max-age=90 43 | ``` 44 | 45 | 儲存後,點擊該物件的公開連結,確認照片的模樣 46 | 47 | 將第二張照片(FB一般廣告V2.png)的名字改為(FB一般廣告V1.png), 上傳至先前的桶子,並點擊右方三個點,編輯中繼資料,找到Cache-Control的欄位,輸入下方欄位值 48 | ``` 49 | public, max-age=90 50 | ``` 51 | 儲存後,重新切換到無痕視窗,按下F12,打開Console,並點擊F5重新整理先前已下載圖片的瀏覽器頁面,發現要等一陣子才會變化 52 | 53 | ## 4. 儲存空間的優化節費 54 | 55 | 將準備好的壓縮圖檔(FB早鳥優惠廣告V2.png.gz)下載後,上傳到先前建立的bucket內,並點擊右方三個點,編輯中繼資料,找到Content-Type的欄位,輸入下方欄位值 56 | 57 | ``` 58 | image/png 59 | ``` 60 | 61 | 編輯中繼資料,找到Content-Encoding的欄位,輸入下方欄位值 62 | 63 | ``` 64 | gzip 65 | ``` 66 | 67 | 儲存後,複製該物件的公開連結,按下F12,打開Console,並貼入該連結,發現已可正常顯示為圖片。 68 | 69 | 70 | # Cloud Shell 71 | 72 | 請參照 [cloud_shell_intro.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/cloud_shell_intro.md) 內的指令 73 | 74 | 75 | ## 1. 登入驗證,操作指定專案內的資源,以命令列操作CloudStorage 76 | 77 | 78 | ## 2. 透過客製化腳本,自動化更改用戶端的Cloud Shell環境,以利公司同仁們統一環境 79 | 80 | 81 | ## 3. 將用戶端的CloudShell環境,還原至最初始狀態 82 | 83 | # Compute Shell Editor 84 | 85 | 請參照 [cloud_shell_editor_intro.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/cloud_shell_editor_intro.md) 內的流程指令 86 | 87 | ## 1. 讓CloudShell快速布建同事們需要的共同開發環境 88 | 89 | ## 2. 同事們依舊可以開發網頁應用 90 | 91 | ## 3. 同事們可以安全地調度雲端資源 92 | 93 | ## 4. 在雲端上製作整合雲端資源的網頁應用 94 | 95 | # Compute Engine 96 | 97 | 請參照 [compute_engine.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/compute_engine.md) 內的流程指令 98 | 99 | ## 1.機器建立,並連入系統內,建立網頁伺服器 100 | 101 | ## 2.重建一台機器,並設置開機腳本,自動載入網頁 102 | 103 | ## 3.關機,重設置開機腳本,引入外部metadata 104 | 105 | ## 4.防火牆設置,並觀察到Service account的重要性 106 | 107 | # IAM 初探 108 | 109 | 請參照 [iam_intro.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/iam_intro.md) 內的流程指令 110 | 111 | ## 1.Service account建置與權限配置 112 | 113 | ## 2.權限的限制條件實作 114 | 115 | ## 3.添加外部用戶進入帳號 116 | 117 | # VPC 118 | 119 | *參照講義,進行內容操作。* 120 | 121 | ## 1.建置具備經典公私網段的VPC 122 | 123 | ## 2.Cloud IAP調度使用,使內網可連線 124 | 125 | ## 3.建立Cloud NAT, 使限定的內網可連外作訪問 126 | 127 | # IAM進階探討 128 | 129 | 請參照 [iam_adv.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/iam_adv.md) 內的流程指令 130 | 131 | 132 | ## 1.在非GCP的環境內使用User Credential 進行開發 133 | 134 | ## 2.用戶可透過任一Service Account 調度雲服務資源,強化本地開發安全性 135 | 136 | ## 3.用戶僅能透過指定Service Account調度雲服務資源,具體強化雲端安全 137 | 138 | ## 4.用戶在本地端經常性調度service account的方式,並進行程式碼開發 139 | -------------------------------------------------------------------------------- /gcp_vertex_ai/README.md: -------------------------------------------------------------------------------- 1 | # GCP Vertex AI Chat Application 2 | 3 | 這個專案是一個簡單的 Flask 應用程式,允許用戶與 Vertex AI 的生成式模型進行對話,並可以上傳圖片進行處理。圖片會被儲存到 Google Cloud Storage 中。 4 | 5 | ## 專案結構 6 | 7 | ``` 8 | 9 | GCP_VERTEX_AI/ 10 | ├── templates/ 11 | │ └── index.html # 前端 HTML 頁面 12 | ├── uploads/ # 用於本地存儲上傳文件的資料夾 13 | ├── app.py # Flask 應用程式主程式碼 14 | ├── Dockerfile # Docker 建置設定 15 | ├── README.md # 專案說明文件 16 | └── requirements.txt # Python 套件需求 17 | 18 | ``` 19 | 20 | 21 | ## 環境變數 22 | 應用程式使用以下環境變數來配置: 23 | - `CLOUD_STORAGE_BUCKET`: 用於指定儲存圖片的 Google Cloud Storage bucket 名稱。 24 | - `MODEL_NAME`: 指定 Vertex AI 模型的名稱,預設為 `gemini-1.5-flash-002`。 25 | 26 | 27 | ## 在cloud shell editor 使用方式 28 | 29 | ### 1. 設定Project、安裝必要套件 30 | 31 | 32 | 首先點擊左上角Open Folder,指定gcp_vertex_ai為專案資料夾,確保你已經安裝 `google-cloud-storage` 和 `vertexai` 等 Python 套件。你可以執行以下指令來安裝: 33 | 34 | ```bash 35 | gcloud config set project 你的PROJECT-ID 36 | pip install -r requirements.txt 37 | ``` 38 | 39 | ### 1-2. 為你的模型添加記憶(Optional) 40 | 41 | 在vertex ai studio內,添加example之後,選擇Get code,複製裡面的text1,並貼回我方的app.py,替代原有的text1 42 | 43 | ### 1-3. 打造自己的example(Optional) 44 | 45 | 準備一個QA 問答知識集 csv, 把qa_converted.json的資料樣本交給gpt,並將csv也交給gpt,進行格式轉換。 46 | 47 | 或用我方已準備好的qa_converted.json 上傳給vertex,點集 Get Code,取得裏面的變數text1 48 | 49 | ### 2. 在開發環境設定環境變數 50 | 51 | 開啟terminal,並設定環境變數,例如: 52 | ``` 53 | export CLOUD_STORAGE_BUCKET=你的桶子名字 54 | export Model_NAME=如果想要換自己的模型或是其他模型 55 | ``` 56 | 57 | ### 3. 啟動應用程式 58 | ``` 59 | python app.py 60 | ``` 61 | 62 | ### 4. 推送回Artifact Registry 63 | 64 | 建立 Artifact Registry 65 | 66 | ``` 67 | gcloud artifacts repositories create cxcxc-vertex-ai-demo --location=asia-east1 --repository-format=docker 68 | ``` 69 | 70 | 推送回 Artifact Registry 71 | 72 | ``` 73 | gcloud builds submit --tag asia-east1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/cxcxc-vertex-ai-demo/ai-app:0.0.1 74 | ``` 75 | ## 在Compute Engine 部屬的方式 76 | 77 | ### 1. 建立Service account 78 | 79 | 建立service account,名字為aigc-demo-sa,並派發以下IAM Role 80 | 81 | ``` 82 | Storage Admin 83 | Vertex AI User 84 | Artifact registry reader 85 | ``` 86 | ### 2. 建立機器,選用剛建立的Service-account,並設定防火牆 87 | 88 | Service account 選擇 aigc-demo-sa 89 | 90 | Access scopes 選擇 Allow full access to all Cloud APIs 91 | 92 | 勾選 允許http訪問 93 | 94 | 95 | ### 3. 建立機器,設定Startup-script 96 | ``` 97 | #! /bin/bash 98 | 99 | # 安裝 Docker 100 | curl -fsSL https://get.docker.com -o get-docker.sh 101 | sh get-docker.sh 102 | service docker start 103 | 104 | # 獲取專案 ID 105 | PROJECT_ID=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/project/project-id") 106 | 107 | # 配置 Docker 認證 108 | gcloud auth configure-docker asia-east1-docker.pkg.dev -q 109 | 110 | # 拉取容器映像 111 | docker pull asia-east1-docker.pkg.dev/$PROJECT_ID/cxcxc-vertex-ai-demo/ai-app:0.0.1 112 | 113 | # 從元數據服務獲取 CLOUD_STORAGE_BUCKET 114 | CLOUD_STORAGE_BUCKET=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/CLOUD_STORAGE_BUCKET" -H "Metadata-Flavor: Google") 115 | 116 | # 從元數據服務獲取 MODEL_NAME,如果未設置則使用默認值 117 | MODEL_NAME=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/MODEL_NAME" -H "Metadata-Flavor: Google") 118 | 119 | 120 | # 運行容器 121 | docker run -p 80:8080 -e PORT=8080 -e MODEL_NAME=$MODEL_NAME -e CLOUD_STORAGE_BUCKET=$CLOUD_STORAGE_BUCKET -d asia-east1-docker.pkg.dev/$PROJECT_ID/cxcxc-vertex-ai-demo/ai-app:0.0.1 122 | 123 | ``` 124 | ### 4. 設定Metadata 125 | ``` 126 | CLOUD_STORAGE_BUCKET=你要存放照片的桶子 127 | MODEL_NAME=gemini-1.5-flash-002 128 | ``` 129 | 130 | 131 | ## 在cloud run 執行的方式 132 | 133 | ### 1. 建立Service account 或沿用先前的Service account 134 | 135 | 建立service account,並派發以下IAM Role 136 | 137 | ``` 138 | Storage Admin 139 | Vertex AI User 140 | Artifact registry reader 141 | ``` 142 | 143 | ### 2. 切換至cloud run 進行部屬 144 | 145 | 146 | 在建立過程中,環境變數記得要修改 147 | 148 | ``` 149 | CLOUD_STORAGE_BUCKET=your-bucket-name 150 | MODEL_NAME=gemini-1.5-flash-002 151 | ``` 152 | -------------------------------------------------------------------------------- /gcp_vertex_ai/雲育鏈課程QA問答知識.csv: -------------------------------------------------------------------------------- 1 | user_question,official_answer 2 | 考雲端證照,有什麼用呢,"可以給公司作為政府標案的能力量化依據 3 | 可以作為自身能力的證明" 4 | 我想考GCP證照,應該從哪張開始入門呢,"GCP-ACE這張證照,雖然名字上有工程師 5 | 但是考試內容涵蓋了 預算、權限、網路、開發、維運 6 | 是很適合學員們了解GCP的課程" 7 | 我想考AWS證照,應該從哪張開始入門呢,"建議先上雲育鏈的經典架構實作課,對雲端有經驗之後 8 | 再上AWS解決方案架構師認證課。" 9 | AWS-SAA 這張證照要怎麼準備呢,"自學的話,可以去買大話AWS架構。 10 | 想要節省時間的話,可以去買一些外部課程 11 | 想要有真實師傅領進門的話,就來上雲育鏈的課程吧" 12 | 你們AI課都在教些什麼呢?,"* **課程內容:** 課程內容包含: 13 | * AI、ML 和生成式 AI 的基本概念和術語 14 | * 人工智慧、機器學習和生成式人工智慧的用例 15 | * 基礎模型的設計注意事項 16 | * 模型訓練與微調 17 | * 及時工程 18 | * 基礎模型評價標準 19 | * 負責任的人工智慧 20 | * 人工智慧系統的安全性和合規性 21 | * 將業務流程打造成一個 AI-Agent 22 | * 利用多重 AI-Agent 完成複雜任務流,強化 AI 產出品質 23 | * 引導同仁資料共享與上雲的 – Google Sheet 24 | * 打造 AI 分身的必要關鍵 – Appscript 25 | * 台灣最火爆的 Line 官方號運維 – Line Official Account" 26 | AI的課程,會需要寫程式嗎?,"現在已經可以讓AI幫我們寫很精準的程式了 27 | 只要能夠很好地讓他了解我們的業務流程 28 | 而我們這門課即將帶您了解AI-Agent,知道如何高效地讓他完成任務。" 29 | 我是一個非資訊業的人士,想要跨足到雲端產業,該怎麼做呢?,把時間專注學習,好好念書,上秉鴻老師的課。 30 | AWS-Sysops課程在教什麼呢?,"引領學員掌握AWS雲端維運技術,強調實作與理論知識的結合,目的在於全面提升學員的雲端技術實力。鑒於SOA課程調性,我們建議學員在參加本課程前,先完成 AWS認證解決方案架構師考證班 的學習,以確保有堅實的基礎。 31 | 32 | 以情境式的專案實作進行課程,課程結束可建置出一個產品。 33 | 以資訊業界常用的維運情境,呼應AWS核心服務的知識要點。 34 | 針對不同維運情境,而設計出來的實作Lab,紮根強化技術能力。 35 | 會有兩次的題型解析,剖析考題內的維運要點,精準答題。" 36 | 雲育鏈的課程跟外面的課程有什麼差別呢?,"秉鴻老師是兼具產業界、學界、補教業的前輩 37 | 從工程師、資料科學、商業規劃、專案管理、標案申請等均有經驗 38 | 39 | 上課也會先用人類世界案例,引起同學思想之後,再做類比,之後總結。 40 | 課後還會有餐會,連結眾人的社會關係。" 41 | 課程會不會很難?導致我聽不懂?,"可以到任一課程的官網頁面最下方看同學評論 42 | 43 | https://www.cxcxc.io/aws-solution-architect-course/ 44 | 45 | 謝謝秉鴻老師上課幽默風趣的言談 用人類世界的生活來解釋對比複雜雲端世界 淺顯易懂也更加深刻印象!對於變化中的雲端資訊技術也一直應變更新!獲益良多!謝謝 46 | 47 | 老師的 AWS SAA 課程真的是非常出色!他能把原本有點枯燥的技術概念講解得既清晰又有趣,讓學習變得輕鬆許多。老師對 AWS 的理解非常深厚,不僅知識紮實,還能很有效地傳遞給學生。雲育鍊老師的教學方式讓我們能夠輕鬆掌握關鍵概念和實戰技巧。同時,他也很樂於解答問題,給出的建議和實例都非常實用。這堂課我給予滿分評價,推薦給所有想深入了解 AWS 的學習者!" 48 | 我想報名AWS-SAA課程,"## AWS雲端解決方案架構師考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓 49 | 50 | 課程內容為最新認證版本【 SAA-C03 】 51 | 可順利考取 AWS Solutions Architect – Associate 認證(SAA-C03),並具有充足理論與實戰經驗,能因應各IT部門的專案需求及雲端代理商的案件,設計出專案中客戶所需的雲端架構,提出可行的雲端解決方案。 52 | 53 | 先以生活化的故事方式旁徵博引,牽引至技術面做深入的探討。 54 | 以資訊業界常用的架構為主,帶出AWS核心服務的重點內容。 55 | 課程針對各服務精準介紹、案例考題加強印象,整體考題練習。 56 | 每單元上完立即練習,增加考照記憶點,並透過雲端認證小幫手練習。 57 | 58 | **課程時間:** 59 | 詳見報名連結 60 | https://lihi1.com/OSdQi 61 | 62 | **上課地點:** 63 | 64 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口) 65 | * 在家遠端直播上課 66 | 67 | **多種在雲端上常見的架構延伸討論:** 68 | 69 | **加入LINE官方號,詢問課程內容** 70 | 71 | https://lin.ee/27OG8ZS" 72 | 我想報名GCP-ACE課程,"## GCP 雲端工程師實作考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓 73 | 74 | 本課程將以NIST新方向的雲概念進行實作,當中以「零信任安全」及「雲端原生」技術,貫穿整個GCP雲端架構的思路,結訓後具備考取GCP Cloud Engineer認證的資格與實力。 75 | 76 | 主要考的都是NIST新方向的雲概念,老師也會在裡面放入多種強化元素: 77 | 78 | * 部署應用程式 79 | * 監控運維 80 | * 管理企業解決方案 81 | * 使用Console和CLI來進行開發及運維 82 | * 設計並實作企業應用場景的雲端架構 83 | * 透過架構設計提出解決方案 84 | 85 | **課程時間:** 86 | 查看下方連結 87 | https://lihi1.com/MJf3i 88 | 89 | **上課地點:** 90 | 91 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口) 92 | * 在家遠端直播上課 93 | 94 | **更多架構與實作Lab:** 95 | 96 | 以架構思維進行系統設計的培訓,除了學習雲端技術實作外,更是在系統設計思路。剖析各種不同應用場景的架構,並以實作的方式解決。 97 | 98 | **加入LINE官方號,詢問課程內容** 99 | 100 | https://lin.ee/27OG8ZS 101 | " 102 | 請問你們有專人可以服務嗎?,"**加入LINE官方號** 103 | 104 | https://lin.ee/27OG8ZS 105 | 106 | 加入之後記得傳張貼圖,我們才能知道喔" 107 | 你們有提供企業包班服務嗎?,"有的,可以加入LINE官方號 108 | https://lin.ee/27OG8ZS 109 | 110 | 裡面有專人跟您洽談企業包班細節,加入之後記得傳張貼圖,我們才能知道喔" 111 | 我們公司想要上雲,你們這邊可以怎麼幫忙我們?,"每一間公司的企業文化都有不同,會建議找顧問進行討論,設計一個逐步引導的過程 112 | 可以加入LINE官方號 113 | https://lin.ee/27OG8ZS 114 | 115 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔" 116 | 我們公司雲端費用很貴,該怎麼辦?,"雲端節費是我們公司的強項,您可以選擇上課了解各類服務的節費方向,或聯絡我們,替您安排顧問。 117 | 可以加入LINE官方號 118 | https://lin.ee/27OG8ZS 119 | 120 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔" 121 | 你們這裡有教室場地租借嗎?,"有的,可以聯絡專人,確認場地可行的租借時間。 122 | 123 | 一個時段是1600元,當月最優惠,預訂上午+下午時段只要3000$ !! 124 | 125 | 相關網址如下 126 | https://www.cxcxc.io/space-rental/" 127 | 你們公司在哪裡啊?,"台北據點是長安東路二段80號5樓 128 | 中壢是明德路60號四樓 129 | 來訪前,建議先打電話詢問是否在辦公室喔, 電話是02-25078554" 130 | 要如何聯絡到李秉鴻老師呢?,"可以加入LINE官方號,由我們替您安排聯絡喔 131 | https://lin.ee/27OG8ZS" 132 | 我想要團報課程,有人可以幫我嗎?,"可以加入LINE官方號,由我們替您安排聯絡喔 133 | https://lin.ee/27OG8ZS" 134 | -------------------------------------------------------------------------------- /gcp_vertex_ai/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, render_template, jsonify 2 | import os 3 | import base64 4 | from datetime import datetime 5 | from google.cloud import storage 6 | import vertexai 7 | from vertexai.generative_models import GenerativeModel, Part, SafetySetting 8 | 9 | 10 | app = Flask(__name__) 11 | 12 | # 填入你為llm補上的記憶 13 | text1 = """ """ 14 | 15 | # 設定上傳檔案的目錄 16 | UPLOAD_FOLDER = 'uploads' 17 | os.makedirs(UPLOAD_FOLDER, exist_ok=True) 18 | app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 19 | 20 | # 初始化 Vertex AI 21 | vertexai.init(location="asia-east1") 22 | 23 | # 取得 Cloud Storage bucket 名稱 24 | BUCKET_NAME = os.environ.get('CLOUD_STORAGE_BUCKET') 25 | 26 | # 模型名稱,從環境變數取得,若無則使用預設值 27 | MODEL_NAME = os.environ.get('MODEL_NAME', "gemini-1.5-flash-002") 28 | 29 | # Vertex AI 的配置 30 | generation_config = { 31 | "max_output_tokens": 8192, 32 | "temperature": 1, 33 | "top_p": 0.95, 34 | } 35 | 36 | safety_settings = [ 37 | SafetySetting( 38 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, 39 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 40 | ), 41 | SafetySetting( 42 | category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, 43 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 44 | ), 45 | SafetySetting( 46 | category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, 47 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 48 | ), 49 | SafetySetting( 50 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, 51 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 52 | ), 53 | ] 54 | 55 | @app.route('/') 56 | def index(): 57 | return render_template('index.html') 58 | 59 | 60 | @app.route('/chat', methods=['POST']) 61 | def chat(): 62 | user_message = request.form.get('message') 63 | image_base64 = request.form.get('image_base64') # 從請求中獲取 Base64 圖片 64 | 65 | if not user_message: 66 | return jsonify({'error': '必須提供文字訊息'}), 400 67 | 68 | # 處理圖片資料,如果有的話 69 | if image_base64: 70 | # 將 Base64 字串轉換為二進位資料 71 | image_data = base64.b64decode(image_base64) 72 | 73 | # 將圖片儲存到 Cloud Storage 74 | try: 75 | image_url = save_image_to_bucket(image_data) 76 | conversation_history_entry = f"你上傳了一張圖片: {image_url}" 77 | except Exception as e: 78 | return jsonify({'error': f'圖片儲存失敗: {str(e)}'}), 500 79 | 80 | # 創建 Part 對象以包含圖片資料 81 | image_part = Part.from_data( 82 | mime_type="image/png", # 可以根據實際檔案類型調整 83 | data=image_data 84 | ) 85 | # 將文字訊息與圖片的 Part 物件一起作為輸入 86 | combined_input = [text1, user_message, image_part] 87 | else: 88 | # 如果沒有圖片,僅使用文字訊息 89 | combined_input = [text1, user_message] 90 | 91 | # 使用 Vertex AI 生成回應 92 | try: 93 | model = GenerativeModel(MODEL_NAME) 94 | responses = model.generate_content( 95 | combined_input, 96 | generation_config=generation_config, 97 | safety_settings=safety_settings, 98 | stream=True, 99 | ) 100 | 101 | # 取得生成的回應 102 | response_message = "" 103 | for response in responses: 104 | response_message += response.text 105 | except Exception as e: 106 | return jsonify({'error': str(e)}), 500 107 | 108 | return jsonify({'message': response_message}) 109 | 110 | def save_image_to_bucket(image_data): 111 | """將圖片儲存到指定的 Cloud Storage bucket,並返回圖片的公開 URL""" 112 | # 初始化 Cloud Storage 客戶端 113 | client = storage.Client() 114 | bucket = client.bucket(BUCKET_NAME) 115 | 116 | # 取得當前日期和時間 117 | current_datetime = datetime.utcnow() 118 | date_folder = current_datetime.strftime('%Y-%m-%d') 119 | filename = current_datetime.strftime('%Y-%m-%d-%H-%M-%S') + '.jpg' 120 | 121 | # 建立儲存路徑 122 | blob_path = f"{date_folder}/{filename}" 123 | blob = bucket.blob(blob_path) 124 | 125 | # 將圖片上傳到 Cloud Storage 126 | blob.upload_from_string(image_data, content_type='image/jpeg') 127 | 128 | # 設置 blob 為公開可讀 129 | blob.make_public() 130 | 131 | # 返回公開的 URL 132 | return blob.public_url 133 | 134 | if __name__ == '__main__': 135 | app.run(debug=True,port=5000) 136 | -------------------------------------------------------------------------------- /iam_adv.md: -------------------------------------------------------------------------------- 1 | # Step1 本地用戶使用gcloud 2 | 3 | #### 登入AWS Console 充當本地機器 4 | 5 | https://cxcxc-learning.signin.aws.amazon.com/console 6 | 7 | 帳密:課程時詢問老師 8 | 9 | 啟用aws版本的CloudShell,並在裡面安裝Google的CloudSDK 10 | 11 | #### 輸入指令編輯,遠端套件庫 12 | ``` 13 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM 14 | 15 | ``` 16 | 17 | #### 更新遠端套件庫網址 18 | ``` 19 | [google-cloud-sdk] 20 | name=Google Cloud SDK 21 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64 22 | enabled=1 23 | gpgcheck=1 24 | repo_gpgcheck=1 25 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg 26 | https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg 27 | EOM 28 | ``` 29 | 30 | #### 安裝 CloudSDK 與 python套件 31 | ``` 32 | sudo yum install -y google-cloud-sdk 33 | sudo pip3 install google-cloud-storage 34 | ``` 35 | 36 | #### 在AWS CloudShell 內登入 37 | 輸入後,會彈跳出連結,要求我方使用google驗證,以現有管理員登入 38 | ``` 39 | gcloud auth application-default login --no-launch-browser 40 | gcloud config set project {YOUR-PROJECT-ID} 41 | export GCLOUD_PROJECT={YOUR-PROJECT-ID} 42 | ``` 43 | 44 | #### 啟用python3命令 45 | ``` 46 | python3 47 | ``` 48 | 49 | #### 輸入list bucket的python相關語句 50 | 51 | ``` 52 | from google.cloud import storage 53 | 54 | # 啟用客戶端 55 | storage_client = storage.Client() 56 | 57 | # 調度瀏覽功能 58 | buckets = storage_client.list_buckets() 59 | 60 | # 打印桶子 61 | for bucket in buckets: 62 | print(bucket.name) 63 | 64 | ``` 65 | 66 | #### 江湖一點訣,點破不值錢 67 | ``` 68 | # 該些credential暫存在家目錄內 (~/.config/gcloud/application_default_credentials.json) 69 | ls ~/.config/gcloud/ 70 | 71 | ``` 72 | 73 | 74 | # Step2 - 允許本地用戶可調度專案內的所有Service account 75 | 76 | 重新安裝一個新的AWS Cloud Shell 77 | 78 | 原因是先前登入方式,是GCP不建議的, 79 | ``` 80 | # 不樂見 81 | # gcloud auth application-default login 82 | ``` 83 | 84 | #### 輸入指令編輯,遠端套件庫 85 | ``` 86 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM 87 | 88 | ``` 89 | #### 更新遠端套件庫網址 90 | ``` 91 | [google-cloud-sdk] 92 | name=Google Cloud SDK 93 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64 94 | enabled=1 95 | gpgcheck=1 96 | repo_gpgcheck=1 97 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg 98 | https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg 99 | EOM 100 | ``` 101 | 102 | #### 安裝 CloudSDK 與 python套件 103 | ``` 104 | sudo yum install -y google-cloud-sdk 105 | sudo pip3 install google-cloud-storage 106 | ``` 107 | 108 | #### 登入新用戶 109 | ``` 110 | gcloud auth login 111 | gcloud config set project {YOUR-PROJECT-ID} 112 | ``` 113 | 114 | #### 為新用戶追加權限 115 | 116 | 他希望我們Member都透過service account 調度服務 117 | 118 | 為新的IAM User設置 可調度service account的role,Service Account User 與 Token Creator兩個權限。 119 | 120 | 登入新的IAM User,並輸入指令,要求透過先前建置的service account調度gcloud storage 121 | 122 | #### 調度SERVICE_ACCOUNT@XXXX.XX的權限去操作cloud storage 123 | ``` 124 | gsutil -i SERVICE_ACCOUNT@XXXX.XX ls gs://YOUR-BUCKET-NAME/ 125 | ``` 126 | 127 | #### 調度其他的Service account 試試,發現權限開得很大,什麼Service account 都能調用 128 | 129 | 130 | 131 | # Step3 - 允許用戶使用 特定Service account 132 | 133 | 134 | 取消先前用戶可調度Service account的權限,並切換至IAM的服務帳戶功能列 135 | 136 | 點擊特定服務帳戶,進行編輯,追加用戶的email 137 | 138 | 並選擇Service account使用者權限,進行儲存 139 | 140 | 141 | #### 調度SERVICE_ACCOUNT@XXXX.XX的權限去操作cloud storage 142 | ``` 143 | gsutil -i SERVICE_ACCOUNT@XXXX.XX ls gs://YOUR-BUCKET-NAME/ 144 | ``` 145 | 146 | 發現成功,同學也可以趁此刻去調度其他服務帳戶的權限,看是不是會有反應。 147 | 148 | 149 | # Step4 - 本地經常性調度Service account 150 | 151 | ### 經常性調度Service account 152 | 153 | 先前的使用方法,適用於臨時查閱雲端資源,但若我們希望經常使用service account,而不需特別指名 -i 154 | 155 | 可先切換回IAM Console,為該Service account生成 json檔 156 | 157 | 在本地端激活,後續可直接如一般調用GCP指令 158 | ``` 159 | # 在本地認證該service account,並透過其json檔調度資源 160 | gcloud auth activate-service-account SERVICE-ACCOUNT-NAME --key-file=service-account.json 161 | 162 | # 訪問桶子 163 | gsutil ls gs://YOUR-BUCKET-NAME/ 164 | ``` 165 | 166 | ## 上面的方式適用於命令列,若還要在本地進行開發,則需將該service-account.json,放置合適位置,並依照下方方式配置 167 | 168 | #### 設定環境變數 169 | ``` 170 | export GOOGLE_APPLICATION_CREDENTIALS="[OUR-SERVICE-ACCOUNT-JSON-PATH]" 171 | 172 | sudo pip3 install google-cloud-storage 173 | 174 | python3 175 | ``` 176 | 177 | #### 透過python結合service account調度資料 178 | 啟用python3做service account操作 179 | ``` 180 | from google.cloud import storage 181 | # 發現其可行 182 | storage_client = storage.Client() 183 | buckets = storage_client.list_buckets() 184 | for bucket in buckets: 185 | print(bucket.name) 186 | ``` 187 | 188 | # Step5 OS-Login 189 | 190 | 這已經算是一個複合式的Lab了。 191 | 192 | #### 開一台GCE Instance 193 | 194 | 記錄下該台GCE Instance 所使用的Service account 195 | 196 | #### 在該台instance的 metadata內,追加允許os login 197 | 198 | ``` 199 | enable-oslogin: TRUE 200 | ``` 201 | 202 | #### 切換回IAM Console,針對用戶授與權限 203 | 204 | 追加新用戶入帳號內,追加秉鴻的email好了。 205 | 206 | 並授與權限 207 | 208 | ``` 209 | Compute OS Login or Compute OS Admin Login 210 | Compute Viewer 211 | IAP-secured Tunnel User (可連線到沒有公有IP的機器) 212 | ``` 213 | 214 | #### 切換至Service account 管理畫面 215 | 216 | 找出該台GCE Instance所使用的Service account 217 | 218 | 授與秉鴻的email 可以操作該Service account的權限 219 | 220 | ``` 221 | Service Account User 222 | ``` 223 | 224 | 225 | -------------------------------------------------------------------------------- /gcp_vertex_ai/qa_converted.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | "考雲端證照,有什麼用呢" 5 | ], 6 | "outputs": [ 7 | "可以給公司作為政府標案的能力量化依據\n可以作為自身能力的證明" 8 | ] 9 | }, 10 | { 11 | "inputs": [ 12 | "我想考GCP證照,應該從哪張開始入門呢" 13 | ], 14 | "outputs": [ 15 | "GCP-ACE這張證照,雖然名字上有工程師\n但是考試內容涵蓋了 預算、權限、網路、開發、維運\n是很適合學員們了解GCP的課程" 16 | ] 17 | }, 18 | { 19 | "inputs": [ 20 | "我想考AWS證照,應該從哪張開始入門呢" 21 | ], 22 | "outputs": [ 23 | "建議先上雲育鏈的經典架構實作課,對雲端有經驗之後\n再上AWS解決方案架構師認證課。" 24 | ] 25 | }, 26 | { 27 | "inputs": [ 28 | "AWS-SAA 這張證照要怎麼準備呢" 29 | ], 30 | "outputs": [ 31 | "自學的話,可以去買大話AWS架構。\n想要節省時間的話,可以去買一些外部課程\n想要有真實師傅領進門的話,就來上雲育鏈的課程吧" 32 | ] 33 | }, 34 | { 35 | "inputs": [ 36 | "你們AI課都在教些什麼呢?" 37 | ], 38 | "outputs": [ 39 | "* **課程內容:** 課程內容包含:\n * AI、ML 和生成式 AI 的基本概念和術語\n * 人工智慧、機器學習和生成式人工智慧的用例\n * 基礎模型的設計注意事項\n * 模型訓練與微調\n * 及時工程\n * 基礎模型評價標準\n * 負責任的人工智慧\n * 人工智慧系統的安全性和合規性\n * 將業務流程打造成一個 AI-Agent\n * 利用多重 AI-Agent 完成複雜任務流,強化 AI 產出品質\n * 引導同仁資料共享與上雲的 – Google Sheet\n * 打造 AI 分身的必要關鍵 – Appscript\n * 台灣最火爆的 Line 官方號運維 – Line Official Account" 40 | ] 41 | }, 42 | { 43 | "inputs": [ 44 | "AI的課程,會需要寫程式嗎?" 45 | ], 46 | "outputs": [ 47 | "現在已經可以讓AI幫我們寫很精準的程式了\n只要能夠很好地讓他了解我們的業務流程\n而我們這門課即將帶您了解AI-Agent,知道如何高效地讓他完成任務。" 48 | ] 49 | }, 50 | { 51 | "inputs": [ 52 | "我是一個非資訊業的人士,想要跨足到雲端產業,該怎麼做呢?" 53 | ], 54 | "outputs": [ 55 | "把時間專注學習,好好念書,上秉鴻老師的課。" 56 | ] 57 | }, 58 | { 59 | "inputs": [ 60 | "AWS-Sysops課程在教什麼呢?" 61 | ], 62 | "outputs": [ 63 | "引領學員掌握AWS雲端維運技術,強調實作與理論知識的結合,目的在於全面提升學員的雲端技術實力。鑒於SOA課程調性,我們建議學員在參加本課程前,先完成 AWS認證解決方案架構師考證班 的學習,以確保有堅實的基礎。\n\n以情境式的專案實作進行課程,課程結束可建置出一個產品。\n以資訊業界常用的維運情境,呼應AWS核心服務的知識要點。\n針對不同維運情境,而設計出來的實作Lab,紮根強化技術能力。\n會有兩次的題型解析,剖析考題內的維運要點,精準答題。" 64 | ] 65 | }, 66 | { 67 | "inputs": [ 68 | "雲育鏈的課程跟外面的課程有什麼差別呢?" 69 | ], 70 | "outputs": [ 71 | "秉鴻老師是兼具產業界、學界、補教業的前輩\n從工程師、資料科學、商業規劃、專案管理、標案申請等均有經驗\n\n上課也會先用人類世界案例,引起同學思想之後,再做類比,之後總結。\n課後還會有餐會,連結眾人的社會關係。" 72 | ] 73 | }, 74 | { 75 | "inputs": [ 76 | "課程會不會很難?導致我聽不懂?" 77 | ], 78 | "outputs": [ 79 | "可以到任一課程的官網頁面最下方看同學評論\n\nhttps://www.cxcxc.io/aws-solution-architect-course/\n\n謝謝秉鴻老師上課幽默風趣的言談 用人類世界的生活來解釋對比複雜雲端世界 淺顯易懂也更加深刻印象!對於變化中的雲端資訊技術也一直應變更新!獲益良多!謝謝\n\n老師的 AWS SAA 課程真的是非常出色!他能把原本有點枯燥的技術概念講解得既清晰又有趣,讓學習變得輕鬆許多。老師對 AWS 的理解非常深厚,不僅知識紮實,還能很有效地傳遞給學生。雲育鍊老師的教學方式讓我們能夠輕鬆掌握關鍵概念和實戰技巧。同時,他也很樂於解答問題,給出的建議和實例都非常實用。這堂課我給予滿分評價,推薦給所有想深入了解 AWS 的學習者!" 80 | ] 81 | }, 82 | { 83 | "inputs": [ 84 | "我想報名AWS-SAA課程" 85 | ], 86 | "outputs": [ 87 | "## AWS雲端解決方案架構師考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓\n\n課程內容為最新認證版本【 SAA-C03 】\n可順利考取 AWS Solutions Architect – Associate 認證(SAA-C03),並具有充足理論與實戰經驗,能因應各IT部門的專案需求及雲端代理商的案件,設計出專案中客戶所需的雲端架構,提出可行的雲端解決方案。\n\n先以生活化的故事方式旁徵博引,牽引至技術面做深入的探討。\n以資訊業界常用的架構為主,帶出AWS核心服務的重點內容。\n課程針對各服務精準介紹、案例考題加強印象,整體考題練習。\n每單元上完立即練習,增加考照記憶點,並透過雲端認證小幫手練習。\n\n**課程時間:**\n詳見報名連結\nhttps://lihi1.com/OSdQi\n\n**上課地點:**\n\n* 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)\n* 在家遠端直播上課\n\n**多種在雲端上常見的架構延伸討論:**\n\n**加入LINE官方號,詢問課程內容**\n\nhttps://lin.ee/27OG8ZS" 88 | ] 89 | }, 90 | { 91 | "inputs": [ 92 | "我想報名GCP-ACE課程" 93 | ], 94 | "outputs": [ 95 | "## GCP 雲端工程師實作考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓\n\n本課程將以NIST新方向的雲概念進行實作,當中以「零信任安全」及「雲端原生」技術,貫穿整個GCP雲端架構的思路,結訓後具備考取GCP Cloud Engineer認證的資格與實力。\n\n主要考的都是NIST新方向的雲概念,老師也會在裡面放入多種強化元素:\n\n* 部署應用程式\n* 監控運維\n* 管理企業解決方案\n* 使用Console和CLI來進行開發及運維\n* 設計並實作企業應用場景的雲端架構\n* 透過架構設計提出解決方案\n\n**課程時間:**\n查看下方連結\nhttps://lihi1.com/MJf3i\n\n**上課地點:**\n\n* 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)\n* 在家遠端直播上課\n\n**更多架構與實作Lab:**\n\n以架構思維進行系統設計的培訓,除了學習雲端技術實作外,更是在系統設計思路。剖析各種不同應用場景的架構,並以實作的方式解決。\n\n**加入LINE官方號,詢問課程內容**\n\nhttps://lin.ee/27OG8ZS\n" 96 | ] 97 | }, 98 | { 99 | "inputs": [ 100 | "請問你們有專人可以服務嗎?" 101 | ], 102 | "outputs": [ 103 | "**加入LINE官方號**\n\nhttps://lin.ee/27OG8ZS\n\n加入之後記得傳張貼圖,我們才能知道喔" 104 | ] 105 | }, 106 | { 107 | "inputs": [ 108 | "你們有提供企業包班服務嗎?" 109 | ], 110 | "outputs": [ 111 | "有的,可以加入LINE官方號\nhttps://lin.ee/27OG8ZS\n\n裡面有專人跟您洽談企業包班細節,加入之後記得傳張貼圖,我們才能知道喔" 112 | ] 113 | }, 114 | { 115 | "inputs": [ 116 | "我們公司想要上雲,你們這邊可以怎麼幫忙我們?" 117 | ], 118 | "outputs": [ 119 | "每一間公司的企業文化都有不同,會建議找顧問進行討論,設計一個逐步引導的過程\n可以加入LINE官方號\nhttps://lin.ee/27OG8ZS\n\n裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔" 120 | ] 121 | }, 122 | { 123 | "inputs": [ 124 | "我們公司雲端費用很貴,該怎麼辦?" 125 | ], 126 | "outputs": [ 127 | "雲端節費是我們公司的強項,您可以選擇上課了解各類服務的節費方向,或聯絡我們,替您安排顧問。\n可以加入LINE官方號\nhttps://lin.ee/27OG8ZS\n\n裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔" 128 | ] 129 | }, 130 | { 131 | "inputs": [ 132 | "你們這裡有教室場地租借嗎?" 133 | ], 134 | "outputs": [ 135 | "有的,可以聯絡專人,確認場地可行的租借時間。\n\n一個時段是1600元,當月最優惠,預訂上午+下午時段只要3000$ !!\n\n相關網址如下\nhttps://www.cxcxc.io/space-rental/" 136 | ] 137 | }, 138 | { 139 | "inputs": [ 140 | "你們公司在哪裡啊?" 141 | ], 142 | "outputs": [ 143 | "台北據點是長安東路二段80號5樓\n中壢是明德路60號四樓\n來訪前,建議先打電話詢問是否在辦公室喔, 電話是02-25078554" 144 | ] 145 | }, 146 | { 147 | "inputs": [ 148 | "要如何聯絡到李秉鴻老師呢?" 149 | ], 150 | "outputs": [ 151 | "可以加入LINE官方號,由我們替您安排聯絡喔\nhttps://lin.ee/27OG8ZS" 152 | ] 153 | }, 154 | { 155 | "inputs": [ 156 | "我想要團報課程,有人可以幫我嗎?" 157 | ], 158 | "outputs": [ 159 | "可以加入LINE官方號,由我們替您安排聯絡喔\nhttps://lin.ee/27OG8ZS" 160 | ] 161 | } 162 | ] -------------------------------------------------------------------------------- /gcp_vertex_ai/app_with_similar_tune.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, render_template, jsonify 2 | import os 3 | import base64 4 | from datetime import datetime 5 | from google.cloud import storage 6 | import vertexai 7 | from vertexai.generative_models import GenerativeModel, Part, SafetySetting 8 | 9 | 10 | app = Flask(__name__) 11 | 12 | text1 = """input: 考雲端證照,有什麼用呢 13 | output: 可以給公司作為政府標案的能力量化依據 14 | 可以作為自身能力的證明 15 | 16 | input: 我想考GCP證照,應該從哪張開始入門呢 17 | output: GCP-ACE這張證照,雖然名字上有工程師 18 | 但是考試內容涵蓋了 預算、權限、網路、開發、維運 19 | 是很適合學員們了解GCP的課程 20 | 21 | input: 我想考AWS證照,應該從哪張開始入門呢 22 | output: 建議先上雲育鏈的經典架構實作課,對雲端有經驗之後 23 | 再上AWS解決方案架構師認證課。 24 | 25 | input: AWS-SAA 這張證照要怎麼準備呢 26 | output: 自學的話,可以去買大話AWS架構。 27 | 想要節省時間的話,可以去買一些外部課程 28 | 想要有真實師傅領進門的話,就來上雲育鏈的課程吧 29 | 30 | input: 你們AI課都在教些什麼呢? 31 | output: * **課程內容:** 課程內容包含: 32 | * AI、ML 和生成式 AI 的基本概念和術語 33 | * 人工智慧、機器學習和生成式人工智慧的用例 34 | * 基礎模型的設計注意事項 35 | * 模型訓練與微調 36 | * 及時工程 37 | * 基礎模型評價標準 38 | * 負責任的人工智慧 39 | * 人工智慧系統的安全性和合規性 40 | * 將業務流程打造成一個 AI-Agent 41 | * 利用多重 AI-Agent 完成複雜任務流,強化 AI 產出品質 42 | * 引導同仁資料共享與上雲的 – Google Sheet 43 | * 打造 AI 分身的必要關鍵 – Appscript 44 | * 台灣最火爆的 Line 官方號運維 – Line Official Account 45 | 46 | input: AI的課程,會需要寫程式嗎? 47 | output: 現在已經可以讓AI幫我們寫很精準的程式了 48 | 只要能夠很好地讓他了解我們的業務流程 49 | 而我們這門課即將帶您了解AI-Agent,知道如何高效地讓他完成任務。 50 | 51 | input: 我是一個非資訊業的人士,想要跨足到雲端產業,該怎麼做呢? 52 | output: 把時間專注學習,好好念書,上秉鴻老師的課。 53 | 54 | input: AWS-Sysops課程在教什麼呢? 55 | output: 引領學員掌握AWS雲端維運技術,強調實作與理論知識的結合,目的在於全面提升學員的雲端技術實力。鑒於SOA課程調性,我們建議學員在參加本課程前,先完成 AWS認證解決方案架構師考證班 的學習,以確保有堅實的基礎。 56 | 57 | 以情境式的專案實作進行課程,課程結束可建置出一個產品。 58 | 以資訊業界常用的維運情境,呼應AWS核心服務的知識要點。 59 | 針對不同維運情境,而設計出來的實作Lab,紮根強化技術能力。 60 | 會有兩次的題型解析,剖析考題內的維運要點,精準答題。 61 | 62 | input: 雲育鏈的課程跟外面的課程有什麼差別呢? 63 | output: 秉鴻老師是兼具產業界、學界、補教業的前輩 64 | 從工程師、資料科學、商業規劃、專案管理、標案申請等均有經驗 65 | 66 | 上課也會先用人類世界案例,引起同學思想之後,再做類比,之後總結。 67 | 課後還會有餐會,連結眾人的社會關係。 68 | 69 | input: 課程會不會很難?導致我聽不懂? 70 | output: 可以到任一課程的官網頁面最下方看同學評論 71 | 72 | https://www.cxcxc.io/aws-solution-architect-course/ 73 | 74 | 謝謝秉鴻老師上課幽默風趣的言談 用人類世界的生活來解釋對比複雜雲端世界 淺顯易懂也更加深刻印象!對於變化中的雲端資訊技術也一直應變更新!獲益良多!謝謝 75 | 76 | 老師的 AWS SAA 課程真的是非常出色!他能把原本有點枯燥的技術概念講解得既清晰又有趣,讓學習變得輕鬆許多。老師對 AWS 的理解非常深厚,不僅知識紮實,還能很有效地傳遞給學生。雲育鍊老師的教學方式讓我們能夠輕鬆掌握關鍵概念和實戰技巧。同時,他也很樂於解答問題,給出的建議和實例都非常實用。這堂課我給予滿分評價,推薦給所有想深入了解 AWS 的學習者! 77 | 78 | input: 我想報名AWS-SAA課程 79 | output: ## AWS雲端解決方案架構師考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓 80 | 81 | 課程內容為最新認證版本【 SAA-C03 】 82 | 可順利考取 AWS Solutions Architect – Associate 認證(SAA-C03),並具有充足理論與實戰經驗,能因應各IT部門的專案需求及雲端代理商的案件,設計出專案中客戶所需的雲端架構,提出可行的雲端解決方案。 83 | 84 | 先以生活化的故事方式旁徵博引,牽引至技術面做深入的探討。 85 | 以資訊業界常用的架構為主,帶出AWS核心服務的重點內容。 86 | 課程針對各服務精準介紹、案例考題加強印象,整體考題練習。 87 | 每單元上完立即練習,增加考照記憶點,並透過雲端認證小幫手練習。 88 | 89 | **課程時間:** 90 | 詳見報名連結 91 | https://lihi1.com/OSdQi 92 | 93 | **上課地點:** 94 | 95 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口) 96 | * 在家遠端直播上課 97 | 98 | **多種在雲端上常見的架構延伸討論:** 99 | 100 | **加入LINE官方號,詢問課程內容** 101 | 102 | https://lin.ee/27OG8ZS 103 | 104 | input: 我想報名GCP-ACE課程 105 | output: ## GCP 雲端工程師實作考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓 106 | 107 | 本課程將以NIST新方向的雲概念進行實作,當中以「零信任安全」及「雲端原生」技術,貫穿整個GCP雲端架構的思路,結訓後具備考取GCP Cloud Engineer認證的資格與實力。 108 | 109 | 主要考的都是NIST新方向的雲概念,老師也會在裡面放入多種強化元素: 110 | 111 | * 部署應用程式 112 | * 監控運維 113 | * 管理企業解決方案 114 | * 使用Console和CLI來進行開發及運維 115 | * 設計並實作企業應用場景的雲端架構 116 | * 透過架構設計提出解決方案 117 | 118 | **課程時間:** 119 | 查看下方連結 120 | https://lihi1.com/MJf3i 121 | 122 | **上課地點:** 123 | 124 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口) 125 | * 在家遠端直播上課 126 | 127 | **更多架構與實作Lab:** 128 | 129 | 以架構思維進行系統設計的培訓,除了學習雲端技術實作外,更是在系統設計思路。剖析各種不同應用場景的架構,並以實作的方式解決。 130 | 131 | **加入LINE官方號,詢問課程內容** 132 | 133 | https://lin.ee/27OG8ZS 134 | 135 | 136 | input: 請問你們有專人可以服務嗎? 137 | output: **加入LINE官方號** 138 | 139 | https://lin.ee/27OG8ZS 140 | 141 | 加入之後記得傳張貼圖,我們才能知道喔 142 | 143 | input: 你們有提供企業包班服務嗎? 144 | output: 有的,可以加入LINE官方號 145 | https://lin.ee/27OG8ZS 146 | 147 | 裡面有專人跟您洽談企業包班細節,加入之後記得傳張貼圖,我們才能知道喔 148 | 149 | input: 我們公司想要上雲,你們這邊可以怎麼幫忙我們? 150 | output: 每一間公司的企業文化都有不同,會建議找顧問進行討論,設計一個逐步引導的過程 151 | 可以加入LINE官方號 152 | https://lin.ee/27OG8ZS 153 | 154 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔 155 | 156 | input: 我們公司雲端費用很貴,該怎麼辦? 157 | output: 雲端節費是我們公司的強項,您可以選擇上課了解各類服務的節費方向,或聯絡我們,替您安排顧問。 158 | 可以加入LINE官方號 159 | https://lin.ee/27OG8ZS 160 | 161 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔 162 | 163 | input: 你們這裡有教室場地租借嗎? 164 | output: 有的,可以聯絡專人,確認場地可行的租借時間。 165 | 166 | 一個時段是1600元,當月最優惠,預訂上午+下午時段只要3000$ !! 167 | 168 | 相關網址如下 169 | https://www.cxcxc.io/space-rental/ 170 | 171 | input: 你們公司在哪裡啊? 172 | output: 台北據點是長安東路二段80號5樓 173 | 中壢是明德路60號四樓 174 | 來訪前,建議先打電話詢問是否在辦公室喔, 電話是02-25078554 175 | 176 | input: 要如何聯絡到李秉鴻老師呢? 177 | output: 可以加入LINE官方號,由我們替您安排聯絡喔 178 | https://lin.ee/27OG8ZS 179 | 180 | input: 我想要團報課程,有人可以幫我嗎? 181 | output: 可以加入LINE官方號,由我們替您安排聯絡喔 182 | https://lin.ee/27OG8ZS""" 183 | 184 | # 設定上傳檔案的目錄 185 | UPLOAD_FOLDER = 'uploads' 186 | os.makedirs(UPLOAD_FOLDER, exist_ok=True) 187 | app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 188 | 189 | # 初始化 Vertex AI 190 | vertexai.init(location="asia-east1") 191 | 192 | # 取得 Cloud Storage bucket 名稱 193 | BUCKET_NAME = os.environ.get('CLOUD_STORAGE_BUCKET') 194 | 195 | # 模型名稱,從環境變數取得,若無則使用預設值 196 | MODEL_NAME = os.environ.get('MODEL_NAME', "projects/904506393037/locations/asia-east1/endpoints/9016721025437532160") 197 | 198 | # Vertex AI 的配置 199 | generation_config = { 200 | "max_output_tokens": 8192, 201 | "temperature": 1, 202 | "top_p": 0.95, 203 | } 204 | 205 | safety_settings = [ 206 | SafetySetting( 207 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, 208 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 209 | ), 210 | SafetySetting( 211 | category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, 212 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 213 | ), 214 | SafetySetting( 215 | category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, 216 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 217 | ), 218 | SafetySetting( 219 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, 220 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH 221 | ), 222 | ] 223 | 224 | @app.route('/') 225 | def index(): 226 | return render_template('index.html') 227 | 228 | 229 | @app.route('/chat', methods=['POST']) 230 | def chat(): 231 | user_message = request.form.get('message') 232 | image_base64 = request.form.get('image_base64') # 從請求中獲取 Base64 圖片 233 | 234 | if not user_message: 235 | return jsonify({'error': '必須提供文字訊息'}), 400 236 | 237 | # 處理圖片資料,如果有的話 238 | if image_base64: 239 | # 將 Base64 字串轉換為二進位資料 240 | image_data = base64.b64decode(image_base64) 241 | 242 | # 將圖片儲存到 Cloud Storage 243 | try: 244 | image_url = save_image_to_bucket(image_data) 245 | conversation_history_entry = f"你上傳了一張圖片: {image_url}" 246 | except Exception as e: 247 | return jsonify({'error': f'圖片儲存失敗: {str(e)}'}), 500 248 | 249 | # 創建 Part 對象以包含圖片資料 250 | image_part = Part.from_data( 251 | mime_type="image/png", # 可以根據實際檔案類型調整 252 | data=image_data 253 | ) 254 | # 將文字訊息與圖片的 Part 物件一起作為輸入 255 | combined_input = [text1, user_message, image_part] 256 | else: 257 | # 如果沒有圖片,僅使用文字訊息 258 | combined_input = [text1, user_message] 259 | 260 | # 使用 Vertex AI 生成回應 261 | try: 262 | model = GenerativeModel(MODEL_NAME) 263 | responses = model.generate_content( 264 | combined_input, 265 | generation_config=generation_config, 266 | safety_settings=safety_settings, 267 | stream=True, 268 | ) 269 | 270 | # 取得生成的回應 271 | response_message = "" 272 | for response in responses: 273 | response_message += response.text 274 | except Exception as e: 275 | return jsonify({'error': str(e)}), 500 276 | 277 | return jsonify({'message': response_message}) 278 | 279 | def save_image_to_bucket(image_data): 280 | """將圖片儲存到指定的 Cloud Storage bucket,並返回圖片的公開 URL""" 281 | # 初始化 Cloud Storage 客戶端 282 | client = storage.Client() 283 | bucket = client.bucket(BUCKET_NAME) 284 | 285 | # 取得當前日期和時間 286 | current_datetime = datetime.utcnow() 287 | date_folder = current_datetime.strftime('%Y-%m-%d') 288 | filename = current_datetime.strftime('%Y-%m-%d-%H-%M-%S') + '.jpg' 289 | 290 | # 建立儲存路徑 291 | blob_path = f"{date_folder}/{filename}" 292 | blob = bucket.blob(blob_path) 293 | 294 | # 將圖片上傳到 Cloud Storage 295 | blob.upload_from_string(image_data, content_type='image/jpeg') 296 | 297 | # 設置 blob 為公開可讀 298 | blob.make_public() 299 | 300 | # 返回公開的 URL 301 | return blob.public_url 302 | 303 | if __name__ == '__main__': 304 | app.run(debug=True,port=5000) 305 | --------------------------------------------------------------------------------