MaaS提升缓存命中率实践方案
本章节主要描述了缓存命中基本原理和缓存命中率提升方法(提示词设计、使用X-Session-ID、后端服务分离和缓存淘汰策略)以及注意事项。
缓存命中基本原理
华为云MaaS服务提供KV Cache复用能力,用户调用大模型的过程中,MaaS会不断更新客户的缓存信息。用户的请求如果命中前缀缓存,将复用缓存命中的计算结果,节省大部分Prefill(预填充阶段,即模型首次处理输入Token的计算过程)的计算,大幅提升推理性能,降低推理成本。为尽可能复用KV Cache,提升缓存命中率,可以使用本章所述原则进行业务侧和服务侧的配置。
- Prefix Caching(前缀缓存)是一项旨在消除重复计算、提升推理效率的优化技术,其核心机制在于缓存并复用共享前缀的KV Cache。
- 在大语言模型(LLM)的实际部署中,大量请求往往包含相同的前缀(Prefix)提示词,如以下典型场景:
系统提示词(System Prompt):同一应用内的所有请求,均被默认插入相同的指令部分;
工具调用:相同的工具列表和参数说明;
RAG 场景:检索到的文档片段反复复用;
多轮对话:历史对话上下文在后续交互轮次中持续存在。
- 若对每个请求都从零开始重新计算这些重复前缀的 KV Cache,将导致巨大的计算资源浪费。而前缀缓存技术,实现在相同的输入前缀下,复用之前已经计算的KV Cache,大幅消除重复计算。
- 业界Prefix Caching的机制通常可以分为三个步骤(以vLLM的实现为例):
- 切分:将输入Tokens序列按固定大小切分为多个块(如每16个token切分一次)。
- 哈希(Hashing):为每个块计算唯一的哈希值作为缓存Key,通常为增量哈希,即每个块的哈希值依赖于之前所有块的内容。
- 查找与复用:新请求到来时,逐块查找缓存,命中则复用,未命中则新计算并存储。
- 由以上原理,可以得到实现缓存命中的约束:
- Prefix Caching必须从整个输入序列的开头开始匹配。
- 如某个块未命中,则后续所有块都须重新计算(即使后续某个块的内容与缓存中某条记录相同,由于上下文不同,导致哈希Key不同,所以其KV Cache也不相同,无法复用)。
提示词设计
提升缓存命中率,主要在于提升提示词从头开始的严格匹配长度,匹配到的长度越长,对整体的收益越高。可基于以下原则进行业务设计和服务配置,以提升缓存命中率。
需遵循以下原则:稳定的指令放在前面。所有请求的通用内容(系统提示、输出格式要求、检索说明、工具定义等)以固定文本、固定顺序放在最前端。业务层统一模板,不允许局部微调,例如字符、标点、换行等。动态内容(如用户名、时间戳)放在后面,避免在中间插入变化内容导致后续缓存失效。
使用X-Session-ID
X-Session-ID是通过HTTP Header传递的会话标识,用于将同一用户的连续请求路由到同一个推理实例,从而提高该实例上的KV Cache局部命中率。
支持的接口:MaaS标准API V2、OpenAI兼容接口、Anthropic兼容接口。
- 同一用户的多轮对话保持X-Session-ID不变。
- 不同用户或不同对话上下文使用不同X-Session-ID。
例如在请求header中添加:X-Session-ID: session-test。
import requests
import json
if __name__ == '__main__':
url = "https://api.modelarts-maas.com/v2/chat/completions" # API地址
api_key = "MAAS_API_KEY" # 把MAAS_API_KEY替换成已获取的API Key
# Send request.
headers = {
'Content-Type': 'application/json',
'X-Session-ID': 'session-test',
'Authorization': f'Bearer {api_key}'
}
data = {
"model": "your-model", # model参数,您可按需更换模型参数
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "介绍下你自己"}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
# Print result.
print(response.status_code)
print(response.text) 例如在请求header中添加:X-Session-ID: session-test。
curl --request POST \
--url https://api.modelarts-maas.com/v2/chat/completions \
--header 'authorization: Bearer $MAAS_API_KEY' \
--header 'content-type: application/json' \
--header 'X-Session-ID: session-test' \
--data '{
"model": "your-model",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好"
}
]
}' 后端服务分离
大型客户在进行大规模MaaS类服务调用时,可能会引入多家服务供应商,使用AI网关进行流量分流。由于不同供应商自行维护KV Cache,故在业务侧做分流时,需要确保同一会话的上下文引流至同一厂商后端服务,避免多轮对话在不同厂商服务间相互调用导致缓存无法命中。