試用機器翻譯

本頁面將逐步說明如何使用 Vertex AI API,將文字從一種語言翻譯成另一種語言。

在本範例中,您部署工作負載時不會使用 GPU。如要使用 GPU 部署,請按照「部署 GPU 容器工作負載」一文的步驟操作。

Translation API

以下範例說明如何使用 Vertex AI 翻譯文字。

  1. 請務必按照「使用 Vertex AI」一文所述,設定 Vertex AI 存取權。
  2. 按照這篇 Vertex AI 快速入門指南的說明,設定 Python Vertex AI API。詳情請參閱 Vertex AI Python API 參考說明文件

  3. 建立 Python 檔案 main.py。這個指令碼會利用 Google CloudTranslation API (透過容器端點存取) 執行翻譯。

    import os
    import requests # Use requests for HTTP calls
    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    TRANSLATE_API_URL = 'https://translation.googleapis.com/language/translate/v2'
    
    @app.route('/translate', methods=['POST'])
    def translate_text():
    
        try:
            data = request.get_json()
            text_to_translate = data.get('text')
            target_language = data.get('target_language', 'en') # Default to English
    
            if not text_to_translate:
                return jsonify({'error': 'Missing "text" in request body'}), 400
    
            params = {
                'key': '${API_KEY}', // insert API key
                'q': text_to_translate,
                'target': target_language
            }
    
            response = requests.post(TRANSLATE_API_URL, params=params)
            response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
    
            result = response.json()
    
            # The structure of the response from the REST API is slightly different
            # It's usually: {'data': {'translations': [{'translatedText': '...', 'detectedSourceLanguage': '...'}]}}
            if 'data' in result and 'translations' in result['data'] and len(result['data']['translations']) > 0:
                translation_info = result['data']['translations'][0]
                return jsonify({
                    'original_text': text_to_translate,
                    'translated_text': translation_info['translatedText'],
                    'detected_source_language': translation_info.get('detectedSourceLanguage')
                })
            else:
                return jsonify({'error': 'Unexpected response format from Translation API', 'details': result}), 500
    
        except requests.exceptions.HTTPError as http_err:
            print(f"HTTP error occurred: {http_err} - {response.text}")
            return jsonify({'error': f"Translation API request failed: {http_err}", 'details': response.text}), response.status_code
        except Exception as e:
            print(f"Error during translation: {e}")
            return jsonify({'error': str(e)}), 500
    
    if __name__ == '__main__':
        port = int(os.environ.get('PORT', 8080))
        app.run(debug=True, host='0.0.0.0', port=port)
    
  4. 建立包含 Python 指令碼的 Docker 檔案:

    FROM python:3.9-slim
    
    WORKDIR /app
    
    COPY . /app
    
    RUN pip install --no-cache-dir -r requirements.txt
    
    EXPOSE 8080
    ENV PORT 8080
    
    CMD ["python", "main.py"]
    
  5. 建構翻譯應用程式的 Docker 映像檔:

    docker build -t translation-app .
    
  6. 請按照「設定 Docker」中的操作說明執行下列操作:

    1. 設定 Docker,
    2. 建立密鑰,並
    3. 將映像檔上傳至 HaaS (Harbor 即服務)。
  7. 登入使用者叢集,並使用使用者身分產生 kubeconfig 檔案。請務必將 kubeconfig 路徑設為環境變數:

    export KUBECONFIG=${CLUSTER_KUBECONFIG_PATH}
    
  8. 建立及部署 Kubernetes 部署和服務自訂資源。如要啟用容器輸出,請務必加入 egress.networking.gke.io/enabled: "true" 標籤,如以下範例所示。

    kubectl --kubeconfig ${KUBECONFIG} -n TENANT_PROJECT \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: translation-deployment-apikey
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: translation-apikey
      template:
        metadata:
          labels:
            app: translation-apikey
            egress.networking.gke.io/enabled: "true"
        spec:
          dnsConfig:
            nameservers:
            - 8.8.8.8
          containers:
          - name: translation-app
            image: HARBOR_INSTANCE_URL/HARBOR_PROJECT/translation-app:latest
            ports:
            - containerPort: 8080
          imagePullSecrets:
            - name: SECRET
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: translation-service-apikey
    spec:
      type: LoadBalancer
      selector:
        app: translation-apikey
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    EOF
    

    更改下列內容:

    • HARBOR_INSTANCE_URL:Harbor 執行個體網址。
    • HARBOR_PROJECT:Harbor 專案。
    • SECRET:為儲存 Docker 憑證而建立的密鑰名稱。
  9. 確認 Deployment 已建立 Pod:

    kubectl --kubeconfig ${KUBECONFIG} get pods -n TENANT_PROJECT
    
  10. 建立網路政策,允許所有網路流量傳輸至租戶專案:

    kubectl --kubeconfig ${KUBECONFIG} -n TENANT_PROJECT \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  11. 匯出服務的 IP 位址:

    export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n TENANT_PROJECT -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  12. 建立 SSH 通道工作階段,連線至您部署的工作負載。

      sshuttle -r zone1-org-1-data@GDC_SANDBOX_INSTANCE_NAME --no-latency-control \
      --ssh-cmd 'gcloud compute ssh --project PROJECT_NAME --zone ZONE --tunnel-through-iap' \
      10.200.0.0/16 --dns
    
  13. 如要測試服務,請使用 POST 要求,將含有文字和目標語言的 JSON 酬載傳送至 http://${IP}:8080/translate,並將 Content-Type 標頭設為 application/json。以下 curl 指令會將「Hello, world!」翻譯成西班牙文 (es):

    curl -X POST -H "Content-Type: application/json" -d '{"text": "Hello, world\\!", "target\_language": "es"}' http://${IP}:8080/translate