8.5 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| context-optimization-reference | 上下文优化技术参考文档 |
|
上下文优化参考
本文档提供了关于上下文优化技术与策略的详细技术参考。
压缩策略
基于摘要的压缩
基于摘要的压缩用简洁的摘要替代冗长的内容,同时保留关键信息。该方法通过识别可压缩的部分、生成捕捉要点的摘要,以及用摘要替换完整内容来实现。
压缩的有效性取决于保留哪些信息。关键决策、用户偏好以及当前任务状态绝不能压缩。中间结果和支持性证据可以更积极地摘要化。样板内容、重复信息以及探索性推理通常可以直接移除。
Token 预算分配
有效的上下文预算管理需要了解不同上下文组件如何消耗 token,并进行策略性分配:
| 组件 | 典型范围 | 说明 |
|---|---|---|
| 系统提示词 | 500–2000 tokens | 整个会话期间保持稳定 |
| 工具定义 | 每个工具 100–500 | 随工具数量增长 |
| 检索到的文档 | 不固定 | 通常是最大消耗者 |
| 消息历史 | 不固定 | 随对话增长 |
| 工具输出 | 不固定 | 可能占据绝大部分上下文 |
压缩阈值
在适当的阈值触发压缩,以维持性能:
- 达到有效上下文限制 70% 时发出警告阈值
- 达到有效上下文限制 80% 时触发压缩
- 达到有效上下文限制 90% 时进行激进压缩
具体阈值取决于模型行为与任务特征。部分模型会呈现渐进式退化,而另一些模型则表现出明显的性能悬崖。
观测屏蔽模式
选择性屏蔽
并非所有观测结果都应同等屏蔽。应考虑屏蔽那些已完成使命、不再需要用于活跃推理的观测结果。保留当前任务的核心观测结果。保留最近一轮的观测结果。保留可能被再次引用的观测结果。
屏蔽实现
def selective_mask(observations: List[Dict], current_task: Dict) -> List[Dict]:
"""
根据相关性选择性屏蔽观测结果。
返回带有 mask 字段的观测结果,指示已屏蔽的内容。
"""
masked = []
for obs in observations:
relevance = calculate_relevance(obs, current_task)
if relevance < 0.3 and obs["age"] > 3:
# 低相关性且陈旧——屏蔽
masked.append({
**obs,
"masked": True,
"reference": store_for_reference(obs["content"]),
"summary": summarize_content(obs["content"])
})
else:
masked.append({
**obs,
"masked": False
})
return masked
KV 缓存优化
前缀稳定性
KV 缓存的命中率取决于前缀的稳定性。稳定的前缀支持跨请求复用缓存。动态前缀会使缓存失效并强制重新计算。
应保持稳定的元素包括:系统提示词、工具定义以及常用模板。可能变化的元素包括:时间戳、会话标识符以及查询相关的内容。
缓存友好的设计
设计提示词以最大化缓存命中率:
- 将稳定内容放在开头
- 跨请求使用一致的格式
- 尽可能避免在提示词中使用动态内容
- 对动态内容使用占位符
# 不利于缓存:提示词中包含动态时间戳
system_prompt = f"""
Current time: {datetime.now().isoformat()}
You are a helpful assistant.
"""
# 有利于缓存:提示词稳定,动态时间作为变量
system_prompt = """
You are a helpful assistant.
Current time is provided separately when relevant.
"""
上下文分区策略
子代理隔离
将工作分配到多个子代理中,以防止任何一个上下文增长过大。每个子代理使用干净的上下文,专注于其子任务。
分区规划
def plan_partitioning(task: Dict, context_limit: int) -> Dict:
"""
根据上下文限制规划如何对任务进行分区。
返回分区策略与子任务定义。
"""
estimated_context = estimate_task_context(task)
if estimated_context <= context_limit:
return {
"strategy": "single_agent",
"subtasks": [task]
}
# 规划多代理方案
subtasks = decompose_task(task)
return {
"strategy": "multi_agent",
"subtasks": subtasks,
"coordination": "hierarchical"
}
优化决策框架
何时进行优化
在以下情况考虑上下文优化:上下文利用率超过 70%,回复质量随对话延长而下降,长上下文导致成本上升,或对话长度增加导致延迟升高。
应用何种优化
根据上下文构成选择优化策略:
如果工具输出占据上下文主导地位,应用观测屏蔽。如果检索到的文档占据主导地位,应用摘要化或分区。如果消息历史占据主导地位,应用带摘要的压缩。如果多个组件共同贡献,则组合多种策略。
优化效果评估
应用优化后,评估效果:
- 衡量 token 减少量
- 衡量质量保留程度(输出质量不应下降)
- 衡量延迟改善情况
- 衡量成本降低情况
根据评估结果迭代优化策略。
常见陷阱
过度激进的压缩
压缩过于激进可能会移除关键信息。务必保留任务目标、用户偏好以及最近的对话上下文。逐步增加压缩强度进行测试,以找到最佳平衡点。
屏蔽关键观测结果
屏蔽仍在使用的观测结果可能导致错误。跟踪观测结果的使用情况,仅屏蔽不再被引用的内容。考虑保留已屏蔽内容的引用,以便在需要时检索。
忽略注意力分布
中间丢失现象意味着信息放置位置至关重要。将关键信息放在注意力有利的位置(上下文的开头和结尾)。使用显式标记突出重要内容。
过早优化
并非所有上下文都需要优化。添加优化机制本身有开销。仅在上下文限制确实制约了代理性能时进行优化。
监控与告警
关键指标
跟踪以下指标以了解优化需求:
- 上下文 token 数量随时间变化
- 重复模式的缓存命中率
- 按上下文大小划分的回复质量指标
- 按上下文长度划分的每次对话成本
- 按上下文大小划分的延迟
告警阈值
针对以下情况设置告警:
- 上下文利用率超过 80%
- 缓存命中率低于 50%
- 质量分数下降超过 10%
- 成本超过基线上升
集成模式
与代理框架集成
将优化集成到代理工作流中:
class OptimizingAgent:
def __init__(self, context_limit: int = 80000):
self.context_limit = context_limit
self.optimizer = ContextOptimizer()
def process(self, user_input: str, context: Dict) -> Dict:
# 检查是否需要优化
if self.optimizer.should_compact(context):
context = self.optimizer.compact(context)
# 使用优化后的上下文进行处理
response = self._call_model(user_input, context)
# 跟踪指标
self.optimizer.record_metrics(context, response)
return response
与记忆系统集成
将优化与记忆系统对接:
class MemoryAwareOptimizer:
def __init__(self, memory_system, context_limit: int):
self.memory = memory_system
self.limit = context_limit
def optimize_context(self, current_context: Dict, task: str) -> Dict:
# 检查信息是否已在记忆中
relevant_memories = self.memory.retrieve(task)
# 将不需要留在上下文中的信息移至记忆
for mem in relevant_memories:
if mem["importance"] < threshold:
current_context = remove_from_context(current_context, mem)
# 保留引用,以便需要时从记忆检索
return current_context
性能基准
压缩性能
压缩应在保留质量的同时减少 token 数量。目标:
- 激进压缩实现 50–70% 的 token 减少
- 压缩带来的质量退化低于 5%
- 压缩开销导致的延迟增加低于 10%
屏蔽性能
观测屏蔽应显著减少 token 数量:
- 被屏蔽的观测结果减少 60–80%
- 屏蔽带来的质量影响低于 2%
- 延迟开销接近为零
缓存性能
KV 缓存优化应改善成本与延迟:
- 稳定工作负载下缓存命中率达 70% 以上
- 缓存命中实现 50% 以上的成本降低
- 缓存命中实现 40% 以上的延迟降低