Files
2026-07-13 21:36:25 +08:00

279 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: context-optimization-reference
description: 上下文优化技术参考文档
metadata:
type: reference
---
# 上下文优化参考
本文档提供了关于上下文优化技术与策略的详细技术参考。
## 压缩策略
### 基于摘要的压缩
基于摘要的压缩用简洁的摘要替代冗长的内容,同时保留关键信息。该方法通过识别可压缩的部分、生成捕捉要点的摘要,以及用摘要替换完整内容来实现。
压缩的有效性取决于保留哪些信息。关键决策、用户偏好以及当前任务状态绝不能压缩。中间结果和支持性证据可以更积极地摘要化。样板内容、重复信息以及探索性推理通常可以直接移除。
### Token 预算分配
有效的上下文预算管理需要了解不同上下文组件如何消耗 token,并进行策略性分配:
| 组件 | 典型范围 | 说明 |
|-----------|---------------|-------|
| 系统提示词 | 5002000 tokens | 整个会话期间保持稳定 |
| 工具定义 | 每个工具 100–500 | 随工具数量增长 |
| 检索到的文档 | 不固定 | 通常是最大消耗者 |
| 消息历史 | 不固定 | 随对话增长 |
| 工具输出 | 不固定 | 可能占据绝大部分上下文 |
### 压缩阈值
在适当的阈值触发压缩,以维持性能:
- 达到有效上下文限制 70% 时发出警告阈值
- 达到有效上下文限制 80% 时触发压缩
- 达到有效上下文限制 90% 时进行激进压缩
具体阈值取决于模型行为与任务特征。部分模型会呈现渐进式退化,而另一些模型则表现出明显的性能悬崖。
## 观测屏蔽模式
### 选择性屏蔽
并非所有观测结果都应同等屏蔽。应考虑屏蔽那些已完成使命、不再需要用于活跃推理的观测结果。保留当前任务的核心观测结果。保留最近一轮的观测结果。保留可能被再次引用的观测结果。
### 屏蔽实现
```python
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. 对动态内容使用占位符
```python
# 不利于缓存:提示词中包含动态时间戳
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.
"""
```
## 上下文分区策略
### 子代理隔离
将工作分配到多个子代理中,以防止任何一个上下文增长过大。每个子代理使用干净的上下文,专注于其子任务。
### 分区规划
```python
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%
- 成本超过基线上升
## 集成模式
### 与代理框架集成
将优化集成到代理工作流中:
```python
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
```
### 与记忆系统集成
将优化与记忆系统对接:
```python
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 数量。目标:
- 激进压缩实现 5070% 的 token 减少
- 压缩带来的质量退化低于 5%
- 压缩开销导致的延迟增加低于 10%
### 屏蔽性能
观测屏蔽应显著减少 token 数量:
- 被屏蔽的观测结果减少 6080%
- 屏蔽带来的质量影响低于 2%
- 延迟开销接近为零
### 缓存性能
KV 缓存优化应改善成本与延迟:
- 稳定工作负载下缓存命中率达 70% 以上
- 缓存命中实现 50% 以上的成本降低
- 缓存命中实现 40% 以上的延迟降低