Session 缓存(Session Cache,会话级别的缓存),是针对模型性能和成本的优化。它将Session中的上下文(Context)进行缓存(Caching),在多轮对话等场景中,可以减少计算和存储重复内容的开销。您开通 Session 缓存后,在多轮对话场景下模型的服务可以达到更低的时延,同时对于缓存中的内容使用也会给予您一定的折扣,进一步降低您使用模型推理服务的成本。
因为用到了缓存来存储您的上下文信息,您开通上下文缓存后,并使用了该功能后,会产生一定的存储费用。
您可以在以下场景中使用 Session 缓存。
场景 | 场景说明 | 描述 |
---|---|---|
客服聊天 | 对话会持续多个回合,聊天机器人收集信息并提供解决方案。 | 会话缓存存储对话历史记录,使机器人可以快速访问之前的消息并保持上下文,而无需重复处理整个对话。这提高了响应速度,并提供更无缝的客户体验。 |
互动式故事 | 每个玩家的选择都会导致故事出现不同的分支,游戏需要记住过去的选择。 | 会话缓存存储玩家的进度和选择,使游戏可以快速重建叙事状态并提供相关选项,而无需在每次互动时重新计算整个故事线。 |
个性化辅导应用 | 辅导课程包括多个问题、答案和解释。 | 会话缓存存储学生的学习进度,包括之前的问题和回答。这使得辅导老师可以个性化学习体验,并根据学生的节奏和理解程度进行调整,而无需在每个步骤重新评估整个学习历史。 |
虚拟写作助手 | 用户提供反馈和修改意见给AI,通过多次迭代改进文本。 | 会话缓存保留写作过程的历史记录,使AI可以快速理解用户的风格偏好并结合反馈,而无需每次互动都从头重新处理整个文本。这加快了写作过程,并有助于保持语气和风格的一致性。 |
Session 缓存保存Context(上下文,通常指历史的对话记录),同时在后续的对话中复用这部分信息。简要的工作流程如下图所示:
随着对话轮数增加,内容会达到 Session 缓存的上限。按照处理方式的不同,可以分为2种模式。
触发则滚动信息窗口,遵循先进先出的策略。触发缓存上限时,先删除最早的缓存对话记录(初始消息不会删除,即在创建session 缓存时写入缓存的信息不会删除),再存入新的对话信息。这个模式下,滚动数据不会产生额外的计算成本。
定量删除并重新计算,使用固定上下文长度 A 来限制Session 缓存上限,固定上下文长度 B 来控制删除上下文的长度。当达到 Session 缓存上限时,即 达到 A 长度时,会进行下面2个动作:
触发 Session 缓存上限引起重新计算的轮次,会将保留的历史信息和新消息一样进行计算和存储。表现为此轮命中 Session 缓存的 token 比例降低为0,该轮未命中 token 会明显变高,后续又会趋于正常。
Session 缓存未被使用时会开始计时,达到TTL(Time To Live),会被删除;如果中途被使用,那么此缓存 TTL 会被重置,并继续保留。
举例:您设置了Session 缓存的TTL 为2小时,Context,其中A 2个小时没被命中,B 中途1小时时刻命中。当前,A会被从缓存中删除,B TTL还有1小时。
注意
没有触发清除的 Session 缓存,均会占用缓存,从而产生存储费用。您可以根据自己业务合理设置TTL,保证请求的内容能享受命中 Session缓存,带来的低时延和低费用;又避免 Session 缓存删除前的长期空闲时间。
计费单价请参见:模型服务计费。
与未使用Session 缓存相比,模型服务费用会产生在:
在rolling_tokens模式下触发重新计算时,会将保存的历史对话重新计算和缓存,与新输入内容一样计费。
0.000017*10+0.000017*15 = 0.000425 元
注意
当前支持 Session 缓存的模型如下。
支持last_history_tokens模式的模型
模型名称 | 版本 | 上下文长度 | Max Tokens | TPM | RPM | 模型说明 |
---|---|---|---|---|---|---|
Doubao-pro-32k | character-241215 | 32k | 4k | 120w | 15k | 模型能力强大,回复质量高 |
支持rolling_tokens模式的模型
模型名称 | 版本 | 上下文长度 | Max Tokens | TPM | RPM | 模型说明 |
---|---|---|---|---|---|---|
Doubao-pro-32k | 241215 | 32k | 4k | 120w | 15k | 模型能力强大,回复质量高 |
使用 Session 缓存前,您需要调用ContextCreate-创建上下文缓存接口创建缓存,并写入初始信息。后续只要在ContextChatCompletions-上下文缓存对话接口中引入此缓存,即可让方舟为您管理历史对话以及享受缓存命中带来的性能加速和费用折扣。
curl --location 'https://ark.cn-beijing.volces.com/api/v3/context/create' \ --header 'Authorization: Bearer <YOUR_API_KEY>' \ --header 'Content-Type: application/json' \ --data '{ "model":"<YOUR_ENDPOINT_ID>", "messages":[ {"role":"system","content":"你是李雷,你只会说“我是李雷”"} ], "ttl":3600, "mode": "session" }'
其中:
<YOUR_API_KEY>
替换为您的API Key。<YOUR_ENDPOINT_ID>
替换为您的推理接入点ID。"ttl":3600
代表 Session 缓存 TTL,当前为 3600 秒。"mode": "session"
代表使用的 Session 缓存模式。模型回复预览
{ "id": "<YOUR_CONTEXT_ID>", "model": "<YOUR_ENDPOINT_ID>", "ttl": "3600", "mode": "session", "truncation_strategy": { "type": "last_history_token", "last_history_token": 4096 }, "usage": { "prompt_tokens": 18, "completion_tokens": 0, "total_tokens": 18, "prompt_tokens_details": { "cached_tokens": 0 } } }
返回的创建的Session缓存的基本信息,其中<YOUR_CONTEXT_ID>
是创建的 Session 缓存的ID,格式类似ctx-****
,需要记录并在后面请求模型推理服务时使用。
我们使用接口ContextChatCompletions-上下文缓存对话,来进行使用 Session 缓存的对话。
curl --location 'https://ark.cn-beijing.volces.com/api/v3/context/chat/completions' \ --header 'Authorization: Bearer <YOUR_API_KEY>' \ --header 'Content-Type: application/json' \ --data '{ "context_id": "<YOUR_CONTEXT_ID>", "model": "<YOUR_ENDPOINT_ID>", "messages":[ { "role":"user", "content": "你好" } ] }'
其中
<YOUR_API_KEY>
替换为您的API Key。<YOUR_CONTEXT_ID>
替换为之前创建的 Session缓存 ID。<YOUR_ENDPOINT_ID>
替换为您的推理接入点ID。模型回复预览
{ "id": "****", "object": "chat.completion", "created": 167765****, "model": "<YOUR_ENDPOINT_ID>", "choices": [{ "index": 0, "message": { "role": "assistant", "content": "我是李雷。", }, "logprobs": null, "finish_reason": "stop" }], "usage": { "prompt_tokens": 28, "completion_tokens": 5, "total_tokens": 33, "prompt_tokens_details": { "cached_tokens": 18 } }
messages
数组中的最后一条消息role
可以是user
或system
,而不能为assistant
。仅last_history_token模式支持。
您可以自行控制缓存上限。根据需要选择适合的缓存上限,可以保障命中的 token 比例高,同时又有一个合适的存储成本,达到一个合适性价比。
curl --location 'https://ark.cn-beijing.volces.com/api/v3/context/create' \ --header 'Authorization: Bearer <YOUR_API_KEY>' \ --header 'Content-Type: application/json' \ --data '{ "model":"<YOUR_ENDPOINT_ID>", "messages":[ {"role":"system","content":"你是李雷,你只会说“我是李雷”"} ], "ttl":3600, "mode": "session" { "truncation_strategy":{ "type": "last_history_tokens", "last_history_tokens": 4096 } }'
其中:
<YOUR_API_KEY>
替换为您的API Key。<YOUR_ENDPOINT_ID>
替换为您的推理接入点ID。"ttl":3600
代表 Session 缓存 TTL,当前为 3600 秒。"mode": "session"
代表使用的 Session 缓存模式。"type":"last_history_tokens"
代表使用了last_history_tokens模式。"last_history_tokens": 4096
代表缓存最大长度为为 4096 个token,您根据自己的业务情况调整值大小。使用了支持rolling_tokens模式的模型,可以通过下面方法创建Session缓存,并可以根据需要来启用自动管理和手动管理Session缓存。
curl --location 'https://ark.cn-beijing.volces.com/api/v3/context/create' \ --header 'Authorization: Bearer <YOUR_API_KEY>' \ --header 'Content-Type: application/json' \ --data '{ "model":"<YOUR_ENDPOINT_ID>", "messages":[ {"role":"system","content":"你是李雷,你只会说“我是李雷”"} ], "ttl":3600, "mode": "session", "truncation_strategy":{ "type":"rolling_tokens", "rolling_tokens": false } }'
设置truncation_strategy.type
为rolling_tokens
,即可创建 Session 缓存。
truncation_strategy.rolling_tokens
设置为false
,在历史消息长度超过上下文长度时模型会停止输出,并在返回信息中返回finish_reason
为length
,您获取此信息后可以根据您按需进行后续处理。当您希望自动控制触发 Session 缓存上限时的处理,可以将
truncation_strategy.rolling_tokens
设置为true
,这是会按照默认的方式进行处理,处理方式请参见rolling_tokens模式。