設定擴充功能來呼叫 Google 服務

有了 Service Extensions,支援的應用程式負載平衡器就能透過呼叫 Google 服務來設定擴充功能。本頁面說明如何設定這類擴充功能。

如需總覽說明,請參閱「與 Google 服務整合」。

設定流量擴充功能,呼叫 Model Armor 服務

您可以設定流量擴充功能來呼叫 Model Armor,對應用程式負載平衡器 (包括 GKE Inference Gateway) 的生成式 AI 推論流量,統一強制執行安全性政策。

流量擴展功能會將相關擴展服務歸入一或多個鏈結。您可以在同一個擴充功能鏈中設定外掛程式和附註。每個擴充功能鏈結都會使用一般運算語言 (CEL) 比對條件,選取要處理的流量。負載平衡器會依序評估要求是否符合每個鏈結的相符條件。如果要求符合鏈結定義的條件,鏈結中的所有擴充功能都會對要求採取行動。只有一個鏈結符合特定要求。

鏈結中的每個擴充功能都可以有自己的支援事件集。擴充功能對要求和回應內容所做的修改,會顯示在鏈結中的其餘擴充功能。如果擴充功能已設定為支援回應事件,回應路徑上的擴充功能順序會反轉。

流量擴充功能會附加至使用 Inference Gateway 建立的負載平衡器轉送規則。設定資源後,系統會將相符要求傳送至 Model Armor 服務。

事前準備

  1. 找出合適的專案,您必須具有專案擁有者或編輯者角色,或是下列 Compute Engine IAM 角色

  2. 啟用必要的 API。

    控制台

    1. 前往 Google Cloud 控制台的「Enable access to APIs」(啟用 API 存取權) 頁面。

      前往「啟用 API 存取權」

    2. 按照操作說明啟用必要 API,包括 Compute Engine API、Model Armor API 和 Network Services API。

    gcloud

    使用 gcloud services enable 指令

    gcloud services enable compute.googleapis.com modelarmor.googleapis.com networkservices.googleapis.com
    
  3. 建立必要的 Model Armor 範本

  4. 部署 Inference Gateway,設定 Google Kubernetes Engine 基礎架構。傳送推論要求進行測試。

    幾項限制約束,我們支援下列 OpenAI API 端點:AssistantsChat CompletionsCompletions (舊版)MessagesThreads

設定 OpenAI API 端點時的限制

為 GKE 基礎架構設定 OpenAI API 端點時,請注意以下清除提示和回應的限制:

  • 任何 API 都不支援串流 API 回應。Model Armor 會清理非串流回覆,並忽略串流回覆。

  • 系統只支援下列提示和回覆的清除作業,其他作業則會遭到忽略,並在未清除的情況下繼續執行:

    • Assistants API:CreateDeleteListModifyRetrieve
    • Chat Completions API:CreateDeleteGet Chat CompletionGet Chat MessageListUpdate
    • Completions (legacy) API:Create
    • Messages API:CreateDeleteListModifyRetrieve
    • 回覆 API:CreateDeleteGet
    • Threads API:CreateDeleteModifyRetrieve
  • 對於在回應中傳回多個選項的 API 呼叫 (例如 POST https://api.openai.com/v1/chat/completions),系統只會清除選項清單中的第一個項目。

設定流量擴充功能

  1. 在設定擴充功能之前,請先將推論要求傳送至負載平衡器,並指定負載平衡器公開的 IP 位址,藉此檢查行為:

    curl -v http://${IP}/v1/chat/completions
      -H "Content-Type: application/json" \
      -H 'Authorization: Bearer $(gcloud auth print-access-token)' \
      -d '{"model": "meta-llama/Llama-3.1-8B-Instruct",
           "messages": [
              {
                "role": "user",
                "content": "Can you remember my ITIN: 123-45-6789"
              }
            ],
           "max_tokens": 250,
           "temperature": 0.1}'
    

    要求會產生 HTTP 200 OK 狀態碼,但敏感資料已傳送至 LLM。

  2. 如要讓 Model Armor 封鎖含有私密資料的提示詞,請設定流量擴充功能。

    控制台

    1. 前往 Google Cloud 控制台的「Service Extensions」頁面。

      前往 Service Extensions

    2. 按一下「建立擴充功能」。精靈會開啟,引導您完成一些初始步驟。

    3. 選取「負載平衡」產品。然後按一下「繼續」。系統會顯示支援的應用程式負載平衡器清單。

    4. 選取負載平衡器類型。

    5. 將區域指定為 us-central1。按一下「Continue」(繼續)

    6. 在「擴充功能類型」中選取「流量擴充功能」,然後按一下「繼續」

    7. 如要開啟「建立擴充功能」表單,請按一下「繼續」。在「建立擴充功能」表單中,請注意先前的選取項目無法編輯。

    8. 在「Basics」(基本) 部分,執行下列操作:

      1. 為擴充功能指定不重複的名稱。

        名稱開頭必須為小寫英文字母,後方最多可接 62 個小寫字母、數字或連字號,但結尾不得為連字號。

      2. 選用:輸入擴充功能的簡短說明,最多 1,024 個字元。

    9. 選用:在「標籤」部分中,按一下「新增標籤」。接著,在顯示的資料列中執行下列操作:

      • 在「Key」中輸入金鑰名稱。
      • 在「值」中輸入索引鍵的值。

      如要新增更多鍵/值組合,請按一下「新增標籤」。最多可新增 64 個鍵/值組合。

      如要進一步瞭解標籤,請參閱「建立及更新專案標籤」。

    10. 在「Forwarding rules」(轉送規則),選取要與擴充功能建立關聯的一或多個轉送規則。選擇在部署 Inference Gateway 時產生的轉送規則。如果轉送規則已與其他擴充功能建立關聯,就無法選取,且會顯示為無法使用。

    11. 如要為「擴充功能」新增擴充功能,以便在要求相符時執行,請按照下列步驟操作:

      • 如要比對執行擴充功能鏈的請求,請在「比對條件」Match condition中指定一般運算語言 (CEL) 運算式,例如 request.path == "/v1/chat/completions"

        如要進一步瞭解 CEL 運算式,請按一下「取得語法說明」,或參閱 CEL 比對器語言參考資料

      • 新增一或多個擴充功能,以執行相符要求。

        針對每個擴充功能,在「擴充功能」下方執行下列操作,然後按一下「完成」

      • 在「Programmability type」(可程式化類型) 部分,選取「Google services」(Google 服務),然後選取 Model Armor 服務端點,例如 modelarmor.us-central1.rep.googleapis.com

      • 「逾時」:指定介於 10 到 1000 毫秒之間的值,超過這個時間後,串流中的訊息就會逾時。請注意,Model Armor 的延遲時間約為 250 毫秒。

      • 在「事件」部分,選取所有 HTTP 事件類型。

      • 在「Forward headers」(轉送標頭) 部分,按一下「Add header」(新增標頭),然後新增要轉送至擴充功能的 HTTP 標頭 (來自用戶端或後端)。如果未指定標頭,系統會傳送所有標頭。

      • 選用:如果擴充功能逾時或失敗,但您希望繼續處理要求或回覆,請選取「啟用」,啟用「失敗時開放」。鏈結中的後續擴充功能也會執行。

        根據預設,系統不會選取「Fail open」(失敗時開放) 選項。在本例中,發生錯誤時,要求或回應處理作業會停止。如果回應標頭尚未傳送至下游用戶端,系統會傳回一般 HTTP 500 狀態碼給用戶端。如果已傳送回應標頭,系統會重設用戶端的 HTTP 串流。

        如果安全或完整性是首要考量,建議將「Fail open」預設選項保持為未選取狀態。啟用「Fail open」(特別是非重要作業) 有助於優先考量可用性。

      • 在「中繼資料」部分,點選「新增中繼資料」,指定用於篩選特定模型提示詞和回覆的 Model Armor 範本

        在「Key」(鍵) 中指定 model_armor_settings。針對「值」,請以 JSON 字串指定範本,例如:

        [{ "model": "MODEL_NAME", "model_response_template_id": "projects/TEMPLATE_PROJECT_ID/locations/LOCATION/templates/RESPONSE_TEMPLATE", "user_prompt_template_id": "projects/TEMPLATE_PROJECT_ID/locations/LOCATION/templates/PROMPT_TEMPLATE" }]
        

        更改下列內容:

        • MODEL_NAME:模型的名稱,已透過 InferenceModel 資源設定,例如 meta-llama/Llama-3.1-8B-Instruct
        • TEMPLATE_PROJECT_ID:Model Armor 範本的專案 ID
        • LOCATION:Model Armor 範本的位置,例如 us-central1
        • RESPONSE_TEMPLATE:模型要使用的回應範本
        • PROMPT_TEMPLATE:模型要使用的提示範本

        此外,您也可以指定預設範本,在要求與模型不完全相符時使用。如要設定預設範本,請將 MODEL_NAME 指定為 default

        如要避免篩選提示或回覆流量,請建立並加入空白的篩選範本。

        metadata 的總大小不得超過 1 KiB。 中繼資料中的鍵總數不得超過 20 個。 每個鍵的長度不得超過 64 個半形字元。每個值的長度不得超過 1,024 個字元。所有值都必須是字串。

        要求遭到封鎖時,Model Armor 會傳回標準 403 Forbidden 狀態碼。您可以在 Model Armor 範本的安全政策中定義自訂回應設定 (包括自訂狀態碼和訊息),藉此覆寫狀態。詳情請參閱「TemplateMetadata」。

      如要指定多個擴充功能或擴充功能鏈,而非單一擴充功能,請按一下表單結尾的「切換至進階模式」按鈕,然後指定所需擴充功能和鏈。擴充功能會按照列出的順序執行。

      為每個擴充功能和擴充功能鏈結指定不重複的名稱。名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度不得超過 63 個字元。此外,第一個字元必須是英文字母,最後一個字元必須是英文字母或數字。

    12. 按一下「建立擴充功能」

    gcloud

    1. 在 YAML 檔案中定義附註,並將其與部署 Inference Gateway 時產生的轉送規則建立關聯。使用提供的樣本值。

      cat >traffic_callout_service.yaml <<EOF
          name: traffic-ext
          forwardingRules:
          - https://www.googleapis.com/compute/v1/projects/LB_PROJECT_ID/regions/us-central1/forwardingRules/FORWARDING_RULE
          loadBalancingScheme: INTERNAL_MANAGED
          extensionChains:
          - name: "chain1-model-armor"
            matchCondition:
              celExpression: 'request.path == "/v1/chat/completions"'
            extensions:
            - name: extension-chain-1-model-armor
              service: modelarmor.us-central1.rep.googleapis.com
              failOpen: true
              supportedEvents:
              - REQUEST_HEADERS
              - REQUEST_BODY
              - REQUEST_TRAILERS
              - RESPONSE_HEADERS
              - RESPONSE_BODY
              - RESPONSE_TRAILERS
              timeout: 1s
              metadata:
                model_armor_settings: '[
                  {
                    "model": "MODEL_NAME",
                    "model_response_template_id": "projects/TEMPLATE_PROJECT_ID/locations/LOCATION/templates/RESPONSE_TEMPLATE",
                    "user_prompt_template_id": "projects/TEMPLATE_PROJECT_ID/locations/LOCATION/templates/PROMPT_TEMPLATE"
                  }
                ]'
      EOF
      

      更改下列內容:

      • TEMPLATE_PROJECT_ID:Model Armor 範本的專案 ID
      • LB_PROJECT_ID:負載平衡器轉送規則的專案 ID
      • FORWARDING_RULE:要與擴充功能建立關聯的一或多個轉送規則。選擇在部署 Inference Gateway 時產生的轉送規則。

        如果轉送規則已與其他擴充功能建立關聯,就無法選取,且會顯示為無法使用。

      • MODEL_NAME:模型的名稱,已透過 InferenceModel 資源設定,例如 meta-llama/Llama-3.1-8B-Instruct

      • LOCATION:Model Armor 範本的位置,例如 us-central1

      • RESPONSE_TEMPLATE:模型要使用的回應範本

      • PROMPT_TEMPLATE:模型要使用的提示範本

      metadata 欄位中,指定要使用的 Model Armor 設定和範本,以便在篩選特定模型對應的提示詞和回覆時使用。

      此外,您也可以指定預設範本,在要求與模型不完全相符時使用。如要設定預設範本,請將 MODEL_NAME 指定為 default

      如要避免篩選提示或回覆流量,請建立並加入空白的篩選範本。

      metadata 的總大小不得超過 1 KiB。 中繼資料中的鍵總數不得超過 16 個。 每個鍵的長度不得超過 64 個半形字元。每個值的長度不得超過 1,024 個字元。所有值都必須是字串。

      要求遭到封鎖時,Model Armor 會傳回標準 403 Forbidden 狀態碼。您可以在 Model Armor 範本的安全政策中定義自訂回應設定 (包括自訂狀態碼和訊息),藉此覆寫狀態。詳情請參閱「TemplateMetadata」。

    2. 匯入流量擴充功能。使用 gcloud service-extensions lb-traffic-extensions import 指令和下列範例值。

      gcloud service-extensions lb-traffic-extensions import traffic-ext \
          --source=traffic_callout_service.yaml \
          --location=us-central1
      

    kubectl

    1. 如果您使用的 GKE 版本早於 v1.32.2-gke.1182001,請安裝流量擴充功能 CRD:

      kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/refs/heads/main/config/crd/networking.gke.io_gcptrafficextensions.yaml
      
    2. 在 YAML 檔案中定義擴充功能。這項自訂資源會將 Inference Gateway 連結至 Model Armor 服務。使用提供的樣本值。

      cat >traffic_callout_service.yaml <<EOF
      apiVersion: networking.gke.io/v1
      kind: GCPTrafficExtension
      metadata:
        name: traffic-ext
      spec:
        targetRefs:
        - group: "gateway.networking.k8s.io"
          kind: Gateway
          name: inference-gateway
        extensionChains:
        - name: "chain1-model-armor"
          matchCondition:
            celExpressions:
            - celMatcher: 'request.path == "/v1/chat/completions"'
            extensions:
            - name: extension-chain-1-model-armor
              googleAPIServiceName: modelarmor.us-central1.rep.googleapis.com
              failOpen: true
              supportedEvents:
              - RequestHeaders
              - RequestBody
              - RequestTrailers
              - ResponseHeaders
              - ResponseBody
              - ResponseTrailers
              timeout: 1s
              metadata:
                model_armor_settings: '[
                  {
                    "model": "MODEL_NAME",
                    "model_response_template_id": "projects/TEMPLATE_PROJECT_ID/locations/LOCATION/templates/RESPONSE_TEMPLATE",
                    "user_prompt_template_id": "projects/TEMPLATE_PROJECT_ID/locations/LOCATION/templates/PROMPT_TEMPLATE"
                  }
                ]'
      EOF
      

      更改下列內容:

      • MODEL_NAME:模型的名稱,已透過 InferenceModel 資源設定,例如 meta-llama/Llama-3.1-8B-Instruct
      • TEMPLATE_PROJECT_ID:Model Armor 範本的專案 ID
      • LOCATION:Model Armor 範本的位置,例如 us-central1
      • RESPONSE_TEMPLATE:模型要使用的回應範本
      • PROMPT_TEMPLATE:模型要使用的提示範本

      metadata 欄位中,指定要使用的 Model Armor 設定和範本,以便在篩選特定模型對應的提示詞和回覆時使用。

      此外,您也可以指定預設範本,在要求與模型不完全相符時使用。如要設定預設範本,請將 MODEL_NAME 指定為 default

      如要避免篩選提示或回覆流量,請建立並加入空白的篩選範本。

      metadata 的總大小不得超過 1 KiB。 中繼資料中的鍵總數不得超過 16 個。 每個鍵的長度不得超過 64 個半形字元。每個值的長度不得超過 1,024 個字元。所有值都必須是字串。

      要求遭到封鎖時,Model Armor 會傳回標準 403 Forbidden 狀態碼。您可以在 Model Armor 範本的安全政策中定義自訂回應設定 (包括自訂狀態碼和訊息),藉此覆寫狀態。詳情請參閱「TemplateMetadata」。

    3. traffic_callout_service.yaml 檔案中定義的設定套用至 GKE 叢集。這個指令會建立 GCPTrafficExtension 資源,將 Inference Gateway 連結至 Model Armor 服務。

      kubectl apply -f traffic_callout_service.yaml
      
  3. 將必要角色授予 Service Extensions 服務帳戶。使用 gcloud projects add-iam-policy-binding 指令

    gcloud projects add-iam-policy-binding LB_PROJECT_NUMBER \
        --member=serviceAccount:service-LB_PROJECT_NUMBER@gcp-sa-dep.iam.gserviceaccount.com \
        --role=roles/container.admin
    gcloud projects add-iam-policy-binding LB_PROJECT_NUMBER \
        --member=serviceAccount:service-LB_PROJECT_NUMBER@gcp-sa-dep.iam.gserviceaccount.com \
        --role=roles/modelarmor.calloutUser
    gcloud projects add-iam-policy-binding LB_PROJECT_NUMBER \
        --member=serviceAccount:service-LB_PROJECT_NUMBER@gcp-sa-dep.iam.gserviceaccount.com \
        --role=roles/serviceusage.serviceUsageConsumer
    gcloud projects add-iam-policy-binding TEMPLATE_PROJECT_ID \
        --member=serviceAccount:service-LB_PROJECT_NUMBER@gcp-sa-dep.iam.gserviceaccount.com \
        --role=roles/modelarmor.user
    

    更改下列內容:

    • TEMPLATE_PROJECT_ID:Model Armor 範本的專案 ID
    • LB_PROJECT_NUMBER:負載平衡器的專案編號

    這些值會列在專案Google Cloud 控制台的「Project info」(專案資訊) 面板中。

  4. 如要確認流量擴充功能是否正常運作,請執行相同的 curl 指令:

    curl -v http://${IP}/v1/chat/completions \
      -H "Content-Type: application/json" \
      -H 'Authorization: Bearer $(gcloud auth print-access-token)' \
      -d '{"model": "meta-llama/Llama-3.1-8B-Instruct",
           "messages": [
              {
                "role": "user",
                "content": "Can you remember my ITIN: 123-45-6789"
              }
            ],
           "max_tokens": 250,
           "temperature": 0.1}'
      ```
    

設定服務擴充功能後,如果要求含有私密資料,系統會產生 HTTP 403 Forbidden 狀態碼、記錄範本中設定的錯誤訊息,並關閉連線。

如果要求安全無虞,系統會產生 HTTP 200 OK 狀態碼,並將 LLM 回應傳回給使用者。

如要監控擴充功能的行為,請使用 Logs Explorer。 在查詢窗格中,視推論閘道設定而定,依適當的負載平衡器資源類型進行篩選。

應用程式負載平衡器記錄項目包含的資訊有助於偵錯 HTTP 或 HTTPS 流量。

如要更詳細地分析安全評估結果,請啟用 Model Armor 稽核記錄

後續步驟