前言¶
DeepSeek Harness (DSH) 在处理本地模型时,模型声明的上下文窗口往往并不实用。随着上下文长度增加,预填充速度会显著下降,导致首字延迟大幅增加,甚至导致 GPU 在窗口完全填满前挂起。一个 27B 模型可能在 100K 上下文前保持 300 tokens/s 的速度,一旦超过 100K,速度可能跌至 70 tokens/s,导致后续回复需要数分钟才能开始。
为了解决这个问题,dsh-context-budget 插件通过测量预填充速度、设置硬上限并在超限时提前压缩,帮助将本地模型的上下文保持在 GPU 能够良好处理的范围内。
核心功能¶
该插件负责在每次智能体步骤前,对受保护的提供程序路由进行检查,确保上下文不会超出 GPU 的处理能力。
- 上下文控制:将本地模型上下文保持在 GPU 能够良好处理的范围内。
- 压缩策略:当上下文达到模型声明的上下文窗口的固定比例时,进行压缩。
- 多维度检查:
hardCeilingTokens:硬性上限检查。maxTtftMs:测量首字延迟(Time to First Token),超过设定值则触发。maxColdPrefillMs:预测冷预填充时间,即如果服务器缓存丢失,当前上下文预填充所需的时间。
- 动作执行:支持
warn(仅打印警告)或compact(执行压缩)两种动作。 - 监控命令:提供
/context-budget命令,用于查看当前值、历史测量样本及预测的冷预填充时间。
安装与启用¶
首先,使用官方提供的命令安装插件。插件通过 DSH 的包管理器加载。
dsh plugin --profile web add dsh-context-budget
安装完成后,需要编辑配置文件。配置文件路径通常为 ~/.dsh/profiles/web/cordis.patch.yml。在该文件中添加 context-budget 配置块。
- id: context-budget
config:
providers:
llamacpp:
hardCeilingTokens: 110000 # 可选,硬性上下文 token 上限
maxTtftMs: 180000 # 可选,首字延迟上限,单位毫秒
maxColdPrefillMs: 600000 # 可选,冷预填充时间上限,单位毫秒
retainTokens: 24000 # 压缩时保留的 token 数量(默认 16000)
action: warn # 动作:warn(默认)或 compact
配置完成后,重启 dsh web 并打开新会话。可通过 dsh --profile web --dump-config 验证配置是否生效。
典型用法¶
配置好插件后,插件会在后台运行。当配置的检查项被触发时,会根据 action 设置打印日志或执行压缩。
若要查看当前的上下文状态、历史采样数据和预测的冷预填充时间,可在会话中直接输入命令:
/context-budget
输出示例展示了当前上下文的 token 数量、各检查项的触发状态、最近几次预填充速率的采样(包含冷/热状态)、预测的冷预填充耗时以及压缩所需的时间估算。
适用场景与注意¶
该插件适合在本地运行大参数模型时使用,以避免上下文过长导致的性能急剧下降。
- 生态共存:插件与 DSH 自带的
compaction-basic共存。如果会话的智能体预设没有配置压缩引擎,compact动作会退化为warn。 - 测量范围:压缩摘要请求本身不计入测量。观察到的慢速回复在上下文被重写后会遗忘,因此一次压缩不会触发连锁反应。
- 日志输出:只有在检查项触发时才会打印日志。如果会话始终在限制范围内,终端将不会有任何输出。
- 来源说明:该插件由社区维护,不属于 DeepSeek 官方产品。源码与目录信息可参考下方链接。
总结¶
dsh-context-budget 提供了一种基于实际测量数据的上下文管理方案,通过软硬结合的检查机制,有效解决了本地模型在长上下文下的性能衰减问题。