Aplicações que chamam APIs de Large Language Model (LLM) geralmente lidam com protocolos específicos do provedor, gerenciamento de credenciais e configuração de TLS diretamente no código. Ao trocar de provedor ou direcionar diferentes níveis de usuários para modelos distintos, essas alterações se propagam por toda a base de código. O Alibaba Cloud Service Mesh (ASM) transfere essa complexidade para a infraestrutura do mesh: configure dois recursos personalizados do Kubernetes — LLMProvider e LLMRoute — e o sidecar do ASM cuida automaticamente da conversão de protocolo, injeção de chave de API, upgrade de TLS e roteamento de tráfego. Sua aplicação envia requisições HTTP simples, sem lógica específica do provedor.
Com o gerenciamento de tráfego de LLM no ASM, você implementa acesso canário, roteamento ponderado e capacidades de observabilidade:
Roteamento por cabeçalho de requisição: direcione requisições para modelos diferentes com base em cabeçalhos. Por exemplo, envie assinantes para um modelo premium enquanto outros usuários utilizam um modelo padrão.
Divisão de tráfego por peso: distribua requisições entre vários provedores de LLM para migração gradual ou comparação A/B.
Monitoramento de tráfego de LLM: acompanhe métricas específicas de LLM pelos painéis de observabilidade integrados do ASM.
Como funciona
O ASM introduz duas Custom Resource Definitions (CRDs) que trabalham em conjunto para gerenciar o tráfego de LLM:
|
Recurso |
Função |
Aplicado a |
|
|
Define um serviço de backend de LLM: host, caminho da API, modelo e chave de API |
Plano de controle do ASM ( |
|
|
Controla a distribuição de requisições entre provedores, com suporte a correspondência baseada em cabeçalho e roteamento ponderado |
Plano de controle do ASM ( |
Fluxo da requisição: quando um pod envia uma requisição HTTP simples para o hostname de um provedor de LLM, o sidecar do ASM intercepta a requisição e executa automaticamente as seguintes ações:
Converte-a para o formato de conclusão de chat compatível com OpenAI.
Injeta a chave de API da configuração do
LLMProvider.Faz o upgrade da conexão de HTTP para HTTPS.
Encaminha a requisição para o endpoint do provedor.
Isso significa que sua aplicação envia um POST HTTP mínimo, sem caminho de API, credenciais ou configuração de TLS. O sidecar preenche todos os campos a partir da especificação do LLMProvider.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM (v1.21.6.88 ou posterior) com um cluster adicionado
Políticas de injeção de sidecar configuradas para o namespace de destino
Uma conta no Alibaba Cloud Model Studio com uma chave de API válida. Consulte Obter uma chave de API
(Apenas Cenário 2) Uma conta na Moonshot AI com uma chave de API válida. Consulte a Plataforma Aberta da Moonshot AI
Configure o ambiente de teste
Implante um cliente de teste e configure um provedor básico de LLM antes de executar qualquer cenário.
Etapa 1: Implante a aplicação de teste sleep
O pod sleep atua como cliente para enviar requisições de teste aos provedores de LLM através do mesh.
-
Salve o conteúdo a seguir como
sleep.yaml: -
Aplique o manifesto ao seu cluster ACK:
kubectl apply -f sleep.yaml
Etapa 2: Configure o provedor Model Studio
Crie um recurso LLMProvider para informar ao ASM como acessar o Alibaba Cloud Model Studio (DashScope).
-
Salve o conteúdo a seguir como
LLMProvider.yaml. Substitua<your-dashscope-api-key>pela sua chave de API do Model Studio.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 # Qwen open-source series model apiKey: <your-dashscope-api-key>Para obter a lista completa de modelos open-source Qwen disponíveis, consulte Geração de texto - Modelos open-source Qwen.
-
Aplique o manifesto à sua instância do ASM:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml -
Verifique a configuração enviando uma requisição de teste a partir do pod
sleep:kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ {"role": "user", "content": "Please introduce yourself."} ] }'Uma resposta bem-sucedida tem o seguinte formato:
{ "choices": [ { "message": { "role": "assistant", "content": "Hello! I am Qwen, a pre-trained language model developed by Alibaba Cloud..." }, "finish_reason": "stop", "index": 0 } ], "model": "qwen1.5-72b-chat", "usage": { "prompt_tokens": 12, "completion_tokens": 130, "total_tokens": 142 } }A requisição usa
http://dashscope.aliyuncs.comsimples, sem especificar caminho, modelo ou chave de API. O sidecar do ASM preenche esses campos a partir da configuração doLLMProvider, faz o upgrade para HTTPS e encaminha a requisição ao DashScope. Como o Model Studio é compatível com o protocolo OpenAI, a resposta segue o formato padrão de conclusão de chat.
Cenário 1: Roteie requisições para modelos diferentes por cabeçalho
Direcione usuários do nível assinante para o modelo qwen-turbo, enquanto todos os outros usuários utilizam o modelo padrão qwen1.5-72b-chat. A decisão de roteamento baseia-se no cabeçalho de requisição user-type.
Crie a regra de roteamento
-
Salve o conteúdo a seguir como
LLMRoute.yaml:apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMRoute metadata: name: dashscope-route spec: host: dashscope.aliyuncs.com # Must match the LLMProvider host rules: - name: vip-route matches: - headers: user-type: exact: subscriber # Match requests with this header value backendRefs: - providerHost: dashscope.aliyuncs.com - backendRefs: - providerHost: dashscope.aliyuncs.comA primeira regra corresponde a requisições que incluem o cabeçalho
user-type: subscribere as roteia pela regravip-route. A segunda regra atua como captura padrão para todas as demais requisições. -
Aplique a regra de roteamento à sua instância do ASM:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
Atribua um modelo a cada rota
Atualize o LLMProvider para especificar modelos diferentes para a rota padrão e para a vip-route:
-
Atualize o arquivo
LLMProvider.yamlcom o seguinte conteúdo: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 # Default: open-source model apiKey: <your-dashscope-api-key> routeSpecificConfigs: vip-route: # Override for subscriber requests openAIConfig: model: qwen-turbo # Subscribers use qwen-turbo apiKey: <your-dashscope-api-key> -
Aplique a atualização:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
Teste o roteamento
Envie duas requisições: uma sem o cabeçalho (rota padrão) e outra com o cabeçalho user-type: subscriber (rota VIP).
# Default route: uses qwen1.5-72b-chat
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
--header 'Content-Type: application/json' \
--data '{
"messages": [
{"role": "user", "content": "Please introduce yourself."}
]
}'
# Subscriber route: uses qwen-turbo
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": "Please introduce yourself."}
]
}'
Saída esperada:
{"choices":[{"message":{"role":"assistant","content":"Hello! I am Qwen, a pre-trained language model developed by Alibaba Cloud. My purpose is to assist users in generating various types of text, such as articles, stories, poems, and answering questions by leveraging my extensive knowledge and understanding of context. Although I'm an AI, I don't have a physical body or personal experiences like human beings do, but I've been trained on a vast corpus of text data, which allows me to engage in conversations, provide information, or help with various tasks to the best of my abilities. So, feel free to ask me anything, and I'll do my best to provide helpful and informative responses!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":12,"completion_tokens":130,"total_tokens":142},"created":1720680044,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1c33b950-3220-9bfe-9066-xxxxxxxxxxxx"}
{"choices":[{"message":{"role":"assistant","content":"Hello, I'm Qwen, a large language model from Alibaba Cloud. As an AI assistant, my goal is to help users get accurate and useful information, and to solve their problems and confusions. I can provide knowledge in various fields, engage in conversation, and even create text. Please note that all the content I provide is based on the data I was trained on and may not include the latest events or personal information. If you have any questions, feel free to ask me at any time!"},"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"}
Verifique o campo model em cada resposta. A requisição padrão retorna "model": "qwen1.5-72b-chat", enquanto a requisição de assinante retorna "model": "qwen-turbo".
Cenário 2: Divida o tráfego entre provedores com roteamento ponderado
Divida o tráfego 50/50 entre o Alibaba Cloud Model Studio (DashScope) e a Moonshot AI. Esse padrão é útil para migrar gradualmente entre provedores ou comparar o desempenho dos modelos lado a lado.
Etapa 1: Configure o provedor Moonshot
-
Salve o conteúdo a seguir como
LLMProvider-moonshot.yaml. Substitua<your-moonshot-api-key>pela sua chave de API da Moonshot AI.apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMProvider metadata: name: moonshot spec: host: api.moonshot.cn # Must be unique across all LLMProviders path: /v1/chat/completions configs: defaultConfig: openAIConfig: model: moonshot-v1-8k stream: false apiKey: <your-moonshot-api-key> -
Aplique o manifesto:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider-moonshot.yaml
Etapa 2: Crie um serviço virtual de LLM
Crie um Serviço do Kubernetes como ponto de entrada único para requisições de LLM. Este serviço não possui pods de backend; o sidecar do ASM roteia todas as requisições para os provedores de LLM definidos no LLMRoute.
-
Salve o conteúdo a seguir como
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 -
Aplique o manifesto:
kubectl apply -f demo-llm-server.yaml
Etapa 3: Configure o roteamento ponderado
Crie um LLMRoute para distribuir o tráfego uniformemente entre DashScope e Moonshot:
-
Salve o conteúdo a seguir como
LLMRoute.yaml:apiVersion: istio.alibabacloud.com/v1beta1 kind: LLMRoute metadata: name: demo-llm-server namespace: default spec: host: demo-llm-server rules: - name: migrate-rule backendRefs: - providerHost: dashscope.aliyuncs.com weight: 50 - providerHost: api.moonshot.cn weight: 50Ajuste os valores de
weightpara controlar a divisão do tráfego. Os pesos são relativos:50/50divide igualmente, enquanto80/20envia 80% para o DashScope e 20% para a Moonshot. -
Aplique a regra de roteamento:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
Teste o roteamento ponderado
Envie várias requisições para o serviço virtual demo-llm-server e observe as respostas:
kubectl exec deployment/sleep -it -- curl --location 'http://demo-llm-server' \
--header 'Content-Type: application/json' \
--data '{
"messages": [
{"role": "user", "content": "Please introduce yourself."}
]
}'
Execute o comando várias vezes. Algumas respostas vêm da Moonshot (identificadas por "model": "moonshot-v1-8k" e pelo nome do assistente Kimi), enquanto outras vêm do DashScope (identificadas por "model": "qwen1.5-72b-chat" e pelo nome do assistente Qwen).
Saída esperada:
{"id":"cmpl-cafd47b181204cdbb4a4xxxxxxxxxxxx","object":"chat.completion","created":1720687132,"model":"moonshot-v1-8k","choices":[{"index":0,"message":{"role":"assistant","content":"Hello! I am an AI language model named Kimi. My main function is to help people generate human-like text. I can write articles, answer questions, provide advice, and more. I am trained on a massive amount of text data, so I can generate a wide variety of text. My goal is to help people communicate more effectively and solve problems."},"finish_reason":"stop"}],"usage":{"prompt_tokens":11,"completion_tokens":59,"total_tokens":70}}
{"choices":[{"message":{"role":"assistant","content":"Hello! I am Qwen, a pre-trained language model developed by Alibaba Cloud. My purpose is to assist users in generating various types of text, such as articles, stories, poems, and answering questions by leveraging my extensive knowledge and understanding of context. Although I'm an AI, I don't have a physical body or personal experiences like human beings do, but I've been trained on a vast corpus of text data, which allows me to engage in conversations, provide information, or help with various tasks to the best of my abilities. So, feel free to ask me anything, and I'll do my best to provide helpful and informative responses!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":12,"completion_tokens":130,"total_tokens":142},"created":1720687164,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-2443772b-4e41-9ea8-9bed-xxxxxxxxxxxx"}
A saída mostra que as requisições são distribuídas uniformemente entre a Moonshot e o Alibaba Cloud Model Studio.
Referência de recursos e placeholders
Recursos do Kubernetes
|
Arquivo YAML |
Kind |
Nome |
Aplicado a |
|
|
ServiceAccount, Service, Deployment |
sleep |
Cluster ACK ( |
|
|
LLMProvider |
dashscope-qwen |
Instância do ASM ( |
|
|
LLMProvider |
moonshot |
Instância do ASM ( |
|
|
LLMRoute |
dashscope-route / demo-llm-server |
Instância do ASM ( |
|
|
Service |
demo-llm-server |
Cluster ACK ( |
Placeholders
Substitua os seguintes placeholders pelos valores reais antes de aplicar os manifestos YAML:
|
Placeholder |
Descrição |
Exemplo |
|
|
Chave de API para o Alibaba Cloud Model Studio |
sk-xxxxxxxxxxxxx |
|
|
Chave de API para a Moonshot AI |
sk-xxxxxxxxxxxxx |
|
|
Caminho para o arquivo kubeconfig da instância do ASM |
~/.kube/asm-config |