ASM在HTTP协议的基础上,专门针对LLM请求协议进行了增强,能够为用户提供简单高效的接入体验,可以实现LLM的灰度接入、按比例路由以及多种可观测能力。本文介绍如何配置和使用LLM流量路由。
前提条件
已添加集群到ASM实例,且ASM实例版本为v1.21.6.88及以上。
已开通百炼,并且获取了可用的API_KEY。具体操作,请参见获取API Key。
已开通Moonshot的API服务,并且获取了可用的API_KEY。具体操作,参见Moonshot AI 开放平台。
准备工作
步骤一:创建测试应用sleep
使用以下内容创建sleep.yaml。
执行以下命令,创建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%被发送给百炼服务。