Files
skillhub-102-context-optimi…/references/optimization_techniques.md
T
2026-07-13 21:36:25 +08:00

8.5 KiB
Raw Blame History

name, description, metadata
name description metadata
context-optimization-reference 上下文优化技术参考文档
type
reference

上下文优化参考

本文档提供了关于上下文优化技术与策略的详细技术参考。

压缩策略

基于摘要的压缩

基于摘要的压缩用简洁的摘要替代冗长的内容,同时保留关键信息。该方法通过识别可压缩的部分、生成捕捉要点的摘要,以及用摘要替换完整内容来实现。

压缩的有效性取决于保留哪些信息。关键决策、用户偏好以及当前任务状态绝不能压缩。中间结果和支持性证据可以更积极地摘要化。样板内容、重复信息以及探索性推理通常可以直接移除。

Token 预算分配

有效的上下文预算管理需要了解不同上下文组件如何消耗 token,并进行策略性分配:

组件 典型范围 说明
系统提示词 5002000 tokens 整个会话期间保持稳定
工具定义 每个工具 100500 随工具数量增长
检索到的文档 不固定 通常是最大消耗者
消息历史 不固定 随对话增长
工具输出 不固定 可能占据绝大部分上下文

压缩阈值

在适当的阈值触发压缩,以维持性能:

  • 达到有效上下文限制 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 缓存的命中率取决于前缀的稳定性。稳定的前缀支持跨请求复用缓存。动态前缀会使缓存失效并强制重新计算。

应保持稳定的元素包括:系统提示词、工具定义以及常用模板。可能变化的元素包括:时间戳、会话标识符以及查询相关的内容。

缓存友好的设计

设计提示词以最大化缓存命中率:

  1. 将稳定内容放在开头
  2. 跨请求使用一致的格式
  3. 尽可能避免在提示词中使用动态内容
  4. 对动态内容使用占位符
# 不利于缓存:提示词中包含动态时间戳
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 数量:

  • 被屏蔽的观测结果减少 6080%
  • 屏蔽带来的质量影响低于 2%
  • 延迟开销接近为零

缓存性能

KV 缓存优化应改善成本与延迟:

  • 稳定工作负载下缓存命中率达 70% 以上
  • 缓存命中实现 50% 以上的成本降低
  • 缓存命中实现 40% 以上的延迟降低