全部產品
Search
文件中心

Alibaba Cloud Service Mesh:流量路由:使用ASM高效管理LLM流量

更新時間:Mar 13, 2025

ASM在HTTP協議的基礎上,專門針對LLM請求協議進行了增強,能夠為使用者提供簡單高效的接入體驗,可以實現LLM的灰階接入、按比例路由以及多種可觀測能力。本文介紹如何配置和使用LLM流量路由。

前提條件

準備工作

步驟一:建立測試應用sleep

  1. 使用以下內容建立sleep.yaml。

    展開查看YAML內容

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/curl:asm-sleep
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
  2. 執行以下命令,建立sleep應用。

    kubectl apply -f sleep.yaml

步驟二:建立百鍊服務的LLMProvider

  1. 使用以下內容建立LLMProvider.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:  
      name: dashscope-qwen
    spec:
      host: dashscope.aliyuncs.com
      path: /compatible-mode/v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: qwen1.5-72b-chat  # 千問開源系列大模型
            apiKey: ${dashscope的API_KEY}

    更多開源模型,請參見文本產生-通義千問-開源版

  2. 執行以下命令,建立LLMProvider。

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
  3. 執行以下命令進行測試。

    kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
    --header 'Content-Type: application/json' \
    --data '{
        "messages": [
            {"role": "user", "content": "請介紹你自己"}
        ]
    }'

    預期輸出:

    {"choices":[{"message":{"role":"assistant","content":"我是來自阿里雲的大規模語言模型,我叫通義千問。我的主要功能是回答使用者的問題、提供資訊和進行對話交流。我可以理解使用者的提問,並基於自然語言產生相應的答案或建議。我也可以學習新的知識,並將其應用於各種情境中。如果您有任何問題或需要協助,請隨時告訴我,我會儘力為您提供支援。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":3,"completion_tokens":72,"total_tokens":75},"created":1720680044,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1c33b950-3220-9bfe-9066-xxxxxxxxxxxx"}

    LLMProvider建立完成後,在sleep pod中直接以HTTP協議訪問dashscope.aliyuncs.com,ASM的Sidecar會自動將請求轉換成符合OpenAI LLM協議的格式(百鍊服務相容OpenAI的LLM協議),給請求添加上API Key,並且將HTTP協議升級為HTTPS,最終發送給叢集外部的LLM供應商伺服器。

情境示範

情境一:建立LLMRoute實現不同類型的使用者使用不同的模型

  1. 使用以下內容建立LLMRoute.yaml。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMRoute
    metadata:  
      name: dashscope-route
    spec:
      host: dashscope.aliyuncs.com # 不同provider之間不能重複
      rules:
      - name: vip-route
        matches:
        - headers:
            user-type:
              exact: subscriber  # 訂閱使用者專用的路由項,後面會在provider中提供專用的配置。
        backendRefs:
        - providerHost: dashscope.aliyuncs.com
      - backendRefs:
        - providerHost: dashscope.aliyuncs.com

    此配置會讓攜帶了user-type:subscriber的請求走vip-route這條路由規則。

  2. 執行以下命令,建立LLMRoute。

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
  3. 使用以下內容更新LLMProvider.yaml,增加路由層級配置。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:  
      name: dashscope-qwen
    spec:
      host: dashscope.aliyuncs.com
      path: /compatible-mode/v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: qwen1.5-72b-chat  # 預設使用開源模型
            apiKey: ${dashscope的API_KEY}
        routeSpecificConfigs:
          vip-route:  # 訂閱使用者的專用路由項
            openAIConfig:
              model: qwen-turbo  # 訂閱使用者使用qwen-turbo模型
              apiKey: ${dashscope的API_KEY}

    執行以下命令,更新LLMProvider。

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
  4. 分別執行以下命令進行測試。

    kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
    --header 'Content-Type: application/json' \
    --data '{
        "messages": [
            {"role": "user", "content": "請介紹你自己"}
        ]
    }'
    kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
    --header 'Content-Type: application/json' \
    --header 'user-type: subscriber' \
    --data '{
        "messages": [
            {"role": "user", "content": "請介紹你自己"}
        ]
    }'

    預期輸出:

    {"choices":[{"message":{"role":"assistant","content":"我是來自阿里雲的大規模語言模型,我叫通義千問。我的主要功能是回答使用者的問題、提供資訊和進行對話交流。我可以理解使用者的提問,並基於自然語言產生相應的答案或建議。我也可以學習新的知識,並將其應用於各種情境中。如果您有任何問題或需要協助,請隨時告訴我,我會儘力為您提供支援。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":3,"completion_tokens":72,"total_tokens":75},"created":1720680044,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1c33b950-3220-9bfe-9066-xxxxxxxxxxxx"}
    {"choices":[{"message":{"role":"assistant","content":"你好,我是來自阿里雲的大規模語言模型,我叫通義千問。作為一個AI助手,我的目標是協助使用者獲得準確、有用的資訊,解決他們的問題和困惑。我可以提供各種領域的知識,進行對話交流,甚至創作文字,但請注意,我所提供的所有內容都是基於我所訓練的資料,可能無法包含最新的事件或個人資訊。如果你有任何問題,歡迎隨時向我提問!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":11,"completion_tokens":85,"total_tokens":96},"created":1720683416,"system_fingerprint":null,"model":"qwen-turbo","id":"chatcmpl-9cbc7c56-06e9-9639-a50d-xxxxxxxxxxxx"}

    可以看到訂閱使用者使用了qwen-turbo模型。

情境二:配置LLMProvider和LLMRoute實現按比例分發流量

  1. 使用以下內容,建立LLMProvider-moonshot.yaml。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:  
      name: moonshot
    spec:
      host: api.moonshot.cn # 不同provider之間不能重複
      path: /v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: moonshot-v1-8k
            stream: false
            apiKey: ${Moonshot的API_KEY}
  2. 執行以下命令,為Moonshot建立LLMProvider。

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider-moonshot.yaml
  3. 使用以下內容建立demo-llm-server.yaml。

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-llm-server
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: none
      type: ClusterIP
  4. 執行以下命令,建立demo-llm-server服務。

    kubectl apply -f demo-llm-server.yaml
  5. 使用以下內容更新LLMRoute.yaml。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMRoute
    metadata:
      name: demo-llm-server
      namespace: default
    spec:
      host: demo-llm-server
      rules:
      - backendRefs:
        - providerHost: dashscope.aliyuncs.com
          weight: 50
        - providerHost: api.moonshot.cn
          weight: 50
        name: migrate-rule
  6. 執行以下命令,更新LLMRoute路由規則。

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
  7. 多次執行以下命令。

    kubectl exec deployment/sleep -it -- curl --location 'http://demo-llm-server' \
    --header 'Content-Type: application/json' \
    --data '{
        "messages": [
            {"role": "user", "content": "請介紹你自己"}
        ]
    }' 

    預期輸出:

    {"id":"cmpl-cafd47b181204cdbb4a4xxxxxxxxxxxx","object":"chat.completion","created":1720687132,"model":"moonshot-v1-8k","choices":[{"index":0,"message":{"role":"assistant","content":"你好!我是Mina,一個AI語言模型。我的主要功能是協助人們產生類似人類的文本。我可以寫文章、回答問題、提供建議等等。我是由大量文本資料訓練出來的,所以我可以產生各種各樣的文本。我的目標是協助人們更有效地溝通和解決問題。"},"finish_reason":"stop"}],"usage":{"prompt_tokens":11,"completion_tokens":59,"total_tokens":70}}
    
    {"choices":[{"message":{"role":"assistant","content":"我是來自阿里雲的大規模語言模型,我叫通義千問。我的主要功能是回答使用者的問題、提供資訊和進行對話交流。我可以理解使用者的提問,並基於自然語言產生相應的答案或建議。我也可以學習新的知識,並將其應用於各種情境中。如果您有任何問題或需要協助,請隨時告訴我,我會儘力為您提供支援。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":3,"completion_tokens":72,"total_tokens":75},"created":1720687164,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-2443772b-4e41-9ea8-9bed-xxxxxxxxxxxx"}

    可以看到請求大約有50%被發送給Moonshot,50%被發送給百鍊服務。