Las aplicaciones que invocan API de Large Language Model (LLM) suelen gestionar protocolos específicos del proveedor, credenciales y configuración de TLS directamente en el código. Al cambiar de proveedor o dirigir distintos niveles de usuarios a diferentes modelos, estos cambios se propagan por toda la base de código. Alibaba Cloud Service Mesh (ASM) traslada esta complejidad a la infraestructura de malla: configure dos recursos personalizados de Kubernetes — LLMProvider y LLMRoute — y el sidecar de ASM se encarga automáticamente de la conversión de protocolo, la inyección de claves de API, la actualización de TLS y el enrutamiento de tráfico. Su aplicación envía solicitudes HTTP simples sin lógica específica del proveedor.
Con la gestión de tráfico de LLM en ASM, puede implementar acceso canary, enrutamiento ponderado y capacidades de observability:
Enrutamiento por encabezado de solicitud: Dirija las solicitudes a distintos modelos según los encabezados; por ejemplo, envíe a los suscriptores a un modelo premium mientras otros usuarios utilizan un modelo estándar.
División de tráfico por peso: Distribuya las solicitudes entre varios proveedores de LLM para realizar una migración gradual o comparaciones A/B.
Monitoreo de tráfico de LLM: Realice un seguimiento de métricas específicas de LLM mediante los paneles integrados de observability de ASM.
Funcionamiento
ASM introduce dos definiciones de recursos personalizados (CRD) que trabajan en conjunto para gestionar el tráfico de LLM:
|
Resource |
Role |
Applied to |
|
|
Define un servicio backend de LLM: host, ruta de API, modelo y clave de API |
Plano de control de ASM ( |
|
|
Controla la distribución de solicitudes entre proveedores, con compatibilidad para coincidencia basada en encabezados y enrutamiento ponderado |
Plano de control de ASM ( |
Flujo de solicitud: Cuando un pod envía una solicitud HTTP simple al nombre de host de un proveedor de LLM, el sidecar de ASM intercepta la solicitud y automáticamente:
La convierte al formato de finalización de chat compatible con OpenAI.
Inyecta la clave de API desde la configuración de
LLMProvider.Actualiza la conexión de HTTP a HTTPS.
Reenvía la solicitud al endpoint del proveedor.
Esto significa que su aplicación envía una solicitud HTTP POST mínima, sin ruta de API, sin credenciales y sin configuración de TLS. El sidecar completa todos los campos necesarios a partir de la especificación de LLMProvider.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de ASM (v1.21.6.88 o posterior) con a cluster added
Sidecar injection policies configured para el namespace de destino
Una cuenta de Alibaba Cloud Model Studio con una clave de API válida; consulte Obtain an API key
(Solo escenario 2) Una cuenta de Moonshot AI con una clave de API válida; consulte la Plataforma abierta de Moonshot AI
Configuración del entorno de prueba
Despliegue un cliente de prueba y configure un proveedor básico de LLM antes de ejecutar cualquiera de los escenarios.
Paso 1: Desplegar la aplicación de prueba sleep
El pod sleep funciona como cliente para enviar solicitudes de prueba a los proveedores de LLM a través de la malla.
-
Guarde el siguiente contenido como
sleep.yaml: -
Aplique el manifiesto a su clúster de ACK:
kubectl apply -f sleep.yaml
Paso 2: Configurar el proveedor de Model Studio
Cree un recurso LLMProvider que indique a ASM cómo conectarse a Alibaba Cloud Model Studio (DashScope).
-
Guarde el siguiente contenido como
LLMProvider.yaml. Reemplace<your-dashscope-api-key>con su clave de API de 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 consultar la lista completa de modelos de código abierto Qwen disponibles, véase Text generation - Qwen open-source models.
-
Aplique el manifiesto a su instancia de ASM:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml -
Compruebe la configuración mediante el envío de una solicitud de prueba desde el 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."} ] }'Una respuesta exitosa tiene el siguiente aspecto:
{ "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 } }La solicitud se dirige a
http://dashscope.aliyuncs.comsin especificar ruta, modelo ni clave de API. El sidecar de ASM completa estos campos desde la configuración deLLMProvider, actualiza la conexión a HTTPS y reenvía la solicitud a DashScope. Dado que Model Studio es compatible con el protocolo de OpenAI, la respuesta sigue el formato estándar de finalización de chat.
Escenario 1: Enrutamiento de solicitudes a distintos modelos por encabezado
Dirija a los usuarios de nivel suscriptor al modelo qwen-turbo, mientras que el resto utiliza el modelo predeterminado qwen1.5-72b-chat. La decisión de enrutamiento se basa en el encabezado de solicitud user-type.
Creación de la regla de enrutamiento
-
Guarde el siguiente contenido 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.comLa primera regla coincide con las solicitudes que incluyen un encabezado
user-type: subscribery las enruta mediante la regla de enrutamientovip-route. La segunda regla actúa como captura predeterminada para todas las demás solicitudes. -
Aplique la regla de enrutamiento a su instancia de ASM:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
Asignación de un modelo a cada ruta
Actualice LLMProvider para especificar distintos modelos para la ruta predeterminada y para vip-route:
-
Actualice
LLMProvider.yamlcon el siguiente contenido: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 la actualización:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
Prueba del enrutamiento
Envíe dos solicitudes: una sin el encabezado (ruta predeterminada) y otra con el encabezado user-type: subscriber (ruta 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."}
]
}'
Salida 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"}
Revise el campo model en cada respuesta. La solicitud predeterminada devuelve "model": "qwen1.5-72b-chat", mientras que la solicitud de suscriptor devuelve "model": "qwen-turbo".
Escenario 2: División de tráfico entre proveedores con enrutamiento ponderado
Divida el tráfico en proporción 50/50 entre Alibaba Cloud Model Studio (DashScope) y Moonshot AI. Este patrón resulta útil para migrar gradualmente entre proveedores o comparar el rendimiento de modelos lado a lado.
Paso 1: Configurar el proveedor de Moonshot
-
Guarde el siguiente contenido como
LLMProvider-moonshot.yaml. Reemplace<your-moonshot-api-key>con su clave de API de 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 el manifiesto:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider-moonshot.yaml
Paso 2: Crear un servicio virtual de LLM
Cree un Service de Kubernetes como punto de entrada único para las solicitudes de LLM. Este servicio no tiene pods de respaldo; el sidecar de ASM enruta todas las solicitudes a los proveedores de LLM definidos en LLMRoute.
-
Guarde el siguiente contenido 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 el manifiesto:
kubectl apply -f demo-llm-server.yaml
Paso 3: Configurar el enrutamiento ponderado
Cree un recurso LLMRoute que distribuya el tráfico equitativamente entre DashScope y Moonshot:
-
Guarde el siguiente contenido 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 los valores de
weightpara controlar la división del tráfico. Los pesos son relativos:50/50divide el tráfico equitativamente, mientras que80/20envía el 80 % a DashScope y el 20 % a Moonshot. -
Aplique la regla de enrutamiento:
kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml
Prueba del enrutamiento ponderado
Envíe varias solicitudes al servicio virtual demo-llm-server y observe las respuestas:
kubectl exec deployment/sleep -it -- curl --location 'http://demo-llm-server' \
--header 'Content-Type: application/json' \
--data '{
"messages": [
{"role": "user", "content": "Please introduce yourself."}
]
}'
Ejecute el comando varias veces. Algunas respuestas provienen de Moonshot (identificadas por "model": "moonshot-v1-8k" y el nombre del asistente Kimi), mientras que otras provienen de DashScope (identificadas por "model": "qwen1.5-72b-chat" y el nombre del asistente Qwen).
Salida 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"}
La salida muestra que las solicitudes se distribuyen equitativamente entre Moonshot y Alibaba Cloud Model Studio.
Referencia de recursos y marcadores de posición
Recursos de Kubernetes
|
YAML file |
Kind |
Name |
Applied to |
|
|
ServiceAccount, Service, Deployment |
sleep |
Clúster de ACK ( |
|
|
LLMProvider |
dashscope-qwen |
Instancia de ASM ( |
|
|
LLMProvider |
moonshot |
Instancia de ASM ( |
|
|
LLMRoute |
dashscope-route / demo-llm-server |
Instancia de ASM ( |
|
|
Service |
demo-llm-server |
Clúster de ACK ( |
Marcadores de posición
Reemplace los siguientes marcadores de posición con sus valores reales antes de aplicar los manifiestos YAML:
|
Placeholder |
Description |
Example |
|
|
Clave de API para Alibaba Cloud Model Studio |
sk-xxxxxxxxxxxxx |
|
|
Clave de API para Moonshot AI |
sk-xxxxxxxxxxxxx |
|
|
Ruta al archivo kubeconfig de la instancia de ASM |
~/.kube/asm-config |