context-optimizer
1
总安装量
1
周安装量
#77440
全站排名
安装命令
npx skills add https://github.com/huangwb8/skills --skill context-optimizer
Agent 安装分布
amp
1
trae
1
qoder
1
opencode
1
cursor
1
kimi-cli
1
Skill 文档
Context Optimizer – ä¸ä¸æä¼åä¸å®¶
æ ¸å¿ç念
ä¸ä¸æä¼å æ¯é¿å¯¹è¯æ§è½çå ³é®ï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â è¯å«é®é¢ â å缩åå² â æ©ç å è½½ â ç¼åéç¨ â æ§è½æå â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
æ ¸å¿é®é¢ï¼
- â Lost-in-Middleï¼å ³é®ä¿¡æ¯è¢«ä¸é´å 容淹没
- â Context Poisoningï¼å²çªä¿¡æ¯å¹²æ°å¤æ
- â Distractionï¼æ å ³ä¿¡æ¯æµªè´¹ token
- â Context Clashï¼å¤ä¿¡æ¯æºå²çª
使¶ä½¿ç¨æ¬æè½
å¨ä»¥ä¸åºæ¯æ¶æ¿æ´»ï¼
- é¿å¯¹è¯å¯¼è´æ§è½ä¸é
- Context window æ¥è¿éå¶
- AI éå¿ä¹åçä¿¡æ¯
- æå°”ä¸ä¸æ”ã”token éå¶”ã”æç”
ä¸ä¸æé®é¢è¯å«
é®é¢ 1ï¼Lost-in-Middle
表ç°ï¼
- AI éå¿å¯¹è¯ä¸é´çå ³é®ä¿¡æ¯
- é¦å°¾ä¿¡æ¯è®°ä½ï¼ä¸é´ä¿¡æ¯éå¿
- éè¦é夿ä¾ç¸åä¿¡æ¯
æ£æµï¼
def detect_lost_in_middle(conversation: list) -> bool:
"""æ£æµæ¯å¦åºç° lost-in-middle é®é¢"""
# 1. æ£æ¥å¯¹è¯é¿åº¦
if len(conversation) < 10:
return False
# 2. æ£æ¥æ¯å¦æé夿é®
questions = [msg for msg in conversation if '?' in msg]
unique_questions = set(questions)
if len(questions) > len(unique_questions) * 1.5:
return True # åå¨é夿é®
# 3. æ£æ¥ä¸é´å
容æ¯å¦è¢«å¼ç¨
middle_start = len(conversation) // 3
middle_end = len(conversation) * 2 // 3
middle_content = conversation[middle_start:middle_end]
# æ£æ¥åç»å¯¹è¯æ¯å¦å¼ç¨ä¸é´å
容
later_refs = sum(
1 for msg in conversation[middle_end:]
if any(keyword in msg for keyword in extract_keywords(middle_content))
)
if later_refs < len(middle_content) * 0.1:
return True # ä¸é´å
容被éå¿
return False
é®é¢ 2ï¼Context Poisoning
表ç°ï¼
- AI 产ççç¾çåç
- é误信æ¯å½±å夿
- ä¸åæ¥æºä¿¡æ¯å²çª
æ£æµï¼
def detect_context_poisoning(conversation: list) -> list:
"""æ£æµä¸ä¸ææ±¡æ"""
conflicts = []
# 1. æåææäºå®éè¿°
facts = extract_facts(conversation)
# 2. æ£æµçç¾
for fact1, fact2 in combinations(facts, 2):
if are_contradictory(fact1, fact2):
conflicts.append({
'type': 'contradiction',
'fact1': fact1,
'fact2': fact2,
'severity': 'high'
})
# 3. æ£æµä¿¡æ¯æºå²çª
sources = group_by_source(facts)
for source, source_facts in sources.items():
if has_internal_conflicts(source_facts):
conflicts.append({
'type': 'source_conflict',
'source': source,
'severity': 'medium'
})
return conflicts
ä¼åçç¥
çç¥ 1ï¼å缩çç¥
åå²å缩
class ContextCompressor:
"""ä¸ä¸æå缩å¨"""
def compress_history(
self,
conversation: list,
max_tokens: int,
retention_priority: list[str] = None
) -> list:
"""
å缩对è¯åå²
Args:
conversation: 对è¯åå²
max_tokens: æå¤§ token æ°
retention_priority: ä¿çä¼å
级 ["current_task", "decisions", "errors"]
Returns:
å缩åç对è¯
"""
priority = retention_priority or ["current_task", "decisions", "errors"]
# 1. åç±»æ¶æ¯
categorized = self._categorize_messages(conversation)
# 2. æä¼å
级ä¿ç
retained = []
current_tokens = 0
for category in priority:
messages = categorized.get(category, [])
for msg in messages:
tokens = self._count_tokens(msg)
if current_tokens + tokens > max_tokens:
# å°è¯å缩
compressed = self._compress_message(msg)
if current_tokens + self._count_tokens(compressed) <= max_tokens:
retained.append(compressed)
current_tokens += self._count_tokens(compressed)
else:
retained.append(msg)
current_tokens += tokens
return retained
def _categorize_messages(self, conversation: list) -> dict:
"""åç±»æ¶æ¯"""
categories = {
'current_task': [],
'decisions': [],
'errors': [],
'context': []
}
for msg in conversation:
if self._is_task_related(msg):
categories['current_task'].append(msg)
elif self._is_decision(msg):
categories['decisions'].append(msg)
elif self._is_error(msg):
categories['errors'].append(msg)
else:
categories['context'].append(msg)
return categories
def _compress_message(self, message: str) -> str:
"""åç¼©åæ¡æ¶æ¯"""
# æåå
³é®ä¿¡æ¯
key_points = extract_key_points(message)
# çææè¦
summary = summarize(key_points)
return f"[æè¦] {summary}"
def _count_tokens(self, text: str) -> int:
"""ä¼°ç® token æ°é"""
return len(text.split()) * 1.3 # ç²ç¥ä¼°è®¡
å¢éæè¦
class IncrementalSummarizer:
"""å¢éæè¦å¨"""
def __init__(self, summary_interval: int = 10):
self.summary_interval = summary_interval
self.summaries = []
def add_messages(self, messages: list) -> str:
"""æ·»å æ¶æ¯å¹¶çææè¦"""
# æ¯é N æ¡æ¶æ¯çæä¸æ¬¡æè¦
if len(messages) % self.summary_interval == 0:
summary = self._generate_summary(messages[-self.summary_interval:])
self.summaries.append(summary)
# è¿å宿´çæè¦åå²
return "\n\n".join(self.summaries)
def _generate_summary(self, messages: list) -> str:
"""çææ¶æ¯æè¦"""
# æåå
³é®ä¿¡æ¯
key_info = {
'tasks': self._extract_tasks(messages),
'decisions': self._extract_decisions(messages),
'errors': self._extract_errors(messages),
'outcomes': self._extract_outcomes(messages)
}
# æ ¼å¼åæè¦
summary_parts = []
if key_info['tasks']:
summary_parts.append(f"ä»»å¡: {', '.join(key_info['tasks'])}")
if key_info['decisions']:
summary_parts.append(f"å³ç: {', '.join(key_info['decisions'])}")
if key_info['errors']:
summary_parts.append(f"é误: {', '.join(key_info['errors'])}")
if key_info['outcomes']:
summary_parts.append(f"ç»æ: {', '.join(key_info['outcomes'])}")
return " | ".join(summary_parts)
çç¥ 2ï¼æ©ç çç¥
æéå è½½
class LazyContextLoader:
"""æå è½½ä¸ä¸æ"""
def __init__(self):
self.loaded_references = {}
self.reference_metadata = {}
def load_reference(
self,
ref_name: str,
force: bool = False
) -> str | None:
"""
æéå è½½åèææ¡£
Args:
ref_name: åèææ¡£åç§°
force: æ¯å¦å¼ºå¶éæ°å è½½
"""
# å·²å è½½ä¸ä¸å¼ºå¶
if ref_name in self.loaded_references and not force:
return self.loaded_references[ref_name]
# æ£æ¥å
æ°æ®
metadata = self.reference_metadata.get(ref_name)
if not metadata:
return None
# æéå³ç
if self._should_load(metadata):
content = self._load_from_disk(ref_name)
self.loaded_references[ref_name] = content
return content
return None
def _should_load(self, metadata: dict) -> bool:
"""夿æ¯å¦åºè¯¥å è½½"""
# 夿é»è¾ï¼
# 1. æ¯å¦è¢«æç¡®è¯·æ±
# 2. ç¸å
³æ§åæ°
# 3. å½å token 使ç¨ç
relevance = metadata.get('relevance', 0)
token_usage = metadata.get('token_usage', 0)
return relevance > 0.7 or token_usage < 0.8
çç¥ 3ï¼ç¼åçç¥
æºè½ç¼å
class SmartCache:
"""æºè½ç¼åç³»ç»"""
def __init__(self, max_size: int = 100):
self.cache = {}
self.max_size = max_size
self.access_count = {}
def get(self, key: str) -> any:
"""è·åç¼å"""
if key in self.cache:
# æ´æ°è®¿é®è®¡æ°
self.access_count[key] = self.access_count.get(key, 0) + 1
return self.cache[key]
return None
def set(self, key: str, value: any, priority: int = 1):
"""设置ç¼å"""
# ç¼åå·²æ»¡ï¼æ¸
çä½ä¼å
级项
if len(self.cache) >= self.max_size:
self._evict_low_priority()
self.cache[key] = value
self.access_count[key] = 0
def _evict_low_priority(self):
"""æ·æ±°ä½ä¼å
级ç¼å"""
# æ (è®¿é®æ¬¡æ° * ä¼å
级) æåº
items = list(self.cache.items())
items.sort(key=lambda x: self.access_count.get(x[0], 0) * x[1].get('priority', 1))
# ç§»é¤æä½å项
if items:
key_to_remove = items[0][0]
del self.cache[key_to_remove]
del self.access_count[key_to_remove]
# 使ç¨ç¤ºä¾
cache = SmartCache()
# ç¼åè§£æç»æ
code_structure = parse_code('main.py')
cache.set('code:main.py', code_structure, priority=2)
# è·åç¼å
cached = cache.get('code:main.py')
if cached:
use_cached_structure(cached)
ä¼åæ£æ¥æ¸ å
é®é¢è¯æ
- 对è¯é¿åº¦æ¯å¦åç
- æ¯å¦æé夿é®
- ä¸é´ä¿¡æ¯æ¯å¦è¢«éå¿
- æ¯å¦åå¨ä¿¡æ¯å²çª
å缩çç¥
- åå²å¯¹è¯å·²æè¦
- å ³é®å³çå·²ä¿ç
- é误信æ¯å·²ä¿ç
- æ å ³ä¿¡æ¯å·²è¿æ»¤
æ©ç çç¥
- åèææ¡£æéå è½½
- 详ç»ä¿¡æ¯å»¶è¿å è½½
- é¿å 䏿¬¡æ§å è½½ææå 容
ç¼åçç¥
- è§£æç»æå·²ç¼å
- é¢ç¹è®¿é®å 容已ç¼å
- ç¼åææ·æ±°æºå¶
æä½³å®è·µ
1. åé¶æ®µå¤ç
# â 䏿¬¡æ§å¤çææä¿¡æ¯
def process_large_file(filename):
content = read_file(filename) # å¯è½å¾å¤§
result = analyze(content)
return result
# â
åé¶æ®µå¤ç
def process_large_file(filename):
# 第ä¸é¶æ®µï¼è·åç»æ
structure = get_file_structure(filename)
# 第äºé¶æ®µï¼æéå è½½
for section in structure.sections:
content = load_section(filename, section)
result = analyze_section(content)
return aggregate_results(results)
2. æ¸è¿å¼ä¿¡æ¯æ«é²
# â 䏿¬¡æ§æä¾ææä¿¡æ¯
def provide_context():
return """
è¿æ¯é¡¹ç®ç宿´ææ¡£ï¼å
æ¬æ¶æãAPIãé
ç½®ç...
ï¼å¯è½ 10000+ tokensï¼
"""
# â
æ¸è¿å¼æ«é²
def provide_context():
return """
é¡¹ç®æ¦è¿°ï¼è¿æ¯ä¸ä¸ª Web åºç¨
éè¦è¯¦ç»ä¿¡æ¯æ¶ï¼å¯æ¥é
ï¼
- [æ¶æè®¾è®¡](docs/architecture.md)
- [API ææ¡£](docs/api.md)
- [é
ç½®æå](docs/config.md)
ï¼çº¦ 100 tokensï¼
"""