更新时间:2026-10-27 GMT+08:00
分享

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的实现为例):
    1. 切分:将输入Tokens序列按固定大小切分为多个块(如每16个token切分一次)。
    2. 哈希(Hashing):为每个块计算唯一的哈希值作为缓存Key,通常为增量哈希,即每个块的哈希值依赖于之前所有块的内容。
    3. 查找与复用:新请求到来时,逐块查找缓存,命中则复用,未命中则新计算并存储。
  • 由以上原理,可以得到实现缓存命中的约束:
    1. Prefix Caching必须从整个输入序列的开头开始匹配。
    2. 如某个块未命中,则后续所有块都须重新计算(即使后续某个块的内容与缓存中某条记录相同,由于上下文不同,导致哈希Key不同,所以其KV Cache也不相同,无法复用)。

提示词设计

提升缓存命中率,主要在于提升提示词从头开始的严格匹配长度,匹配到的长度越长,对整体的收益越高。可基于以下原则进行业务设计和服务配置,以提升缓存命中率。

需遵循以下原则:稳定的指令放在前面。所有请求的通用内容(系统提示、输出格式要求、检索说明、工具定义等)以固定文本、固定顺序放在最前端。业务层统一模板,不允许局部微调,例如字符、标点、换行等。动态内容(如用户名、时间戳)放在后面,避免在中间插入变化内容导致后续缓存失效。

使用X-Session-ID

X-Session-ID是通过HTTP Header传递的会话标识,用于将同一用户的连续请求路由到同一个推理实例,从而提高该实例上的KV Cache局部命中率。

支持的接口:MaaS标准API V2、OpenAI兼容接口、Anthropic兼容接口。

  1. 同一用户的多轮对话保持X-Session-ID不变。
  2. 不同用户或不同对话上下文使用不同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,故在业务侧做分流时,需要确保同一会话的上下文引流至同一厂商后端服务,避免多轮对话在不同厂商服务间相互调用导致缓存无法命中。

缓存淘汰策略

缓存空间有限,长时间不使用的缓存通过淘汰机制进行释放,以节约显存等存储空间的使用。常用的淘汰机制有LRU(最近最少使用)和TTL(存活时间)。MaaS服务由内部自动管理缓存淘汰策略,以获得缓存命中概率和资源利用的最佳平衡,当前未提供可配置参数。

注意事项

  • 避免System提示词每行换行、空格、标点不一致;
  • 避免每条请求携带随机traceId、requestId、动态时间戳放置在提示词前段;
  • 避免相同请求存在全角 / 半角、多余空格、换行、大小写差异;
  • 避免相同Session中相邻请求改变Reasoning_effort;
  • 避免在接入多个模型提供商的场景中使用同一网关进行分流,建议同一用户的连续请求路由到同一个厂商的同一个模型。
  • 避免任务执行过程频繁切换模型。

相关文档