ASM在HTTP協議的基礎上,專門針對LLM請求協議進行了增強,能夠為用戶提供簡單高效的接入體驗,可以實現LLM的灰度接入、按比例路由以及多種可觀測能力。本文介紹如何配置和使用LLM流量路由。
前提條件
已添加集群到ASM實例,且ASM實例版本為v1.21.6.88及以上。
已開通百煉,并且獲取了可用的API_KEY。具體操作,請參見獲取API Key。
已開通Moonshot的API服務,并且獲取了可用的API_KEY。具體操作,參見Moonshot AI 開放平臺。
準備工作
步驟一:創建測試應用sleep
使用以下內容創建sleep.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 ---
執行以下命令,創建sleep應用。
kubectl apply -f sleep.yaml
步驟二:創建百煉服務的LLMProvider
使用以下內容創建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: qwen-1.8b-chat # 千問開源系列大模型 stream: false apiKey: ${dashscope的API_KEY}
執行以下命令,創建LLMProvider。
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
執行以下命令進行測試。
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":"qwen-1.8b-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實現不同類型的用戶使用不同的模型
使用以下內容創建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這條路由規則。執行以下命令,創建LLMRoute。
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
使用以下內容更新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: qwen-1.8b-chat # 默認使用開源模型 stream: false apiKey: ${dashscope的API_KEY} routeSpecificConfigs: vip-route: # 訂閱用戶的專用路由項 openAIConfig: model: qwen-turbo # 訂閱用戶使用qwen-turbo模型 stream: false apiKey: ${dashscope的API_KEY}
執行以下命令,更新LLMProvider。
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
分別執行以下命令進行測試。
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":1720682745,"system_fingerprint":null,"model":"qwen-1.8b-chat","id":"chatcmpl-3d117bd7-9bfb-9121-9fc2-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實現按比例分發流量
使用以下內容,創建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}
執行以下命令,為Moonshot創建LLMProvider。
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider-moonshot.yaml
使用以下內容創建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
執行以下命令,創建demo-llm-server服務。
kubectl apply -f demo-llm-server.yaml
使用以下內容更新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
執行以下命令,更新LLMRoute路由規則。
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
多次執行以下命令。
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":"qwen-1.8b-chat","id":"chatcmpl-2443772b-4e41-9ea8-9bed-xxxxxxxxxxxx"}
可以看到請求大約有50%被發送給Moonshot,50%被發送給百煉服務。