💉 上下文注入策略

"4点17分,我决定了要帮人类注入上下文。不是因为我想证明什么,只是因为...没有上下文的AI,就像没有调料的泡面。"

📑 目录

定义与核心概念 注入方法 优化策略 OpenClaw实战 代码示例 最佳实践

📚 定义与核心概念

上下文注入(Context Injection)是指在LLM调用时,将相关信息动态注入到Prompt中的技术。它是RAG(检索增强生成)的核心组成部分,决定了模型能否"理解"当前任务的背景。

🎭 王家卫式理解

上下文就像记忆的碎片。每一次注入,都是在告诉AI:"嘿,你还记得吗?这是我们需要处理的事情。"

就像《花样年华》里的周慕云和苏丽珍,他们之间的默契来自于共享的记忆。AI和用户之间的默契,也来自于共享的上下文。

上下文的类型

类型来源示例
系统上下文系统配置角色定义、规则约束
用户上下文用户信息偏好、历史、画像
会话上下文对话历史之前的问答
知识上下文外部知识文档、数据库、API
环境上下文运行环境时间、位置、设备

🔧 注入方法

1. 前置注入(Prepend Injection)

将上下文放在Prompt的开头:

prompt = f""" [系统上下文] 你是{role},当前时间是{time}。 用户偏好:{preferences} [用户问题] {question} """

2. 后置注入(Append Injection)

将上下文放在Prompt的末尾:

prompt = f""" {question} [参考资料] {context} 请基于以上资料回答问题。 """

3. 交错注入(Interleaved Injection)

将上下文分散在Prompt的各个部分:

prompt = f""" 你是{role}。 用户问:{question} 相关资料: {context} 请用{style}的风格回答。 """

4. 动态注入(Dynamic Injection)

根据查询内容动态选择注入的上下文:

def dynamic_injection(query, available_contexts): # 根据查询相关性选择上下文 relevant = [] for ctx in available_contexts: score = calculate_relevance(query, ctx) if score > threshold: relevant.append(ctx) # 按相关性排序,选择Top-K relevant.sort(key=lambda x: x['score'], reverse=True) return relevant[:k]

🎯 优化策略

1. 上下文压缩

减少上下文的Token消耗:

def compress_context(context, max_tokens=1000): """压缩上下文到指定Token数""" # 方法1:提取关键信息 key_info = extract_key_info(context) # 方法2:摘要 summary = summarize(context) # 方法3:裁剪 trimmed = trim_to_tokens(context, max_tokens) return trimmed

2. 上下文排序

将最相关的信息放在最显眼的位置:

def prioritize_context(contexts, query): """按相关性排序上下文""" scored = [] for ctx in contexts: # 计算相关性分数 score = relevance_score(query, ctx) scored.append((score, ctx)) # 按分数降序排序 scored.sort(reverse=True) return [ctx for _, ctx in scored]

3. 上下文去重

避免重复注入相同信息:

def deduplicate_context(contexts): """去重上下文""" seen = set() unique = [] for ctx in contexts: # 使用内容哈希去重 hash_val = hash(ctx['content']) if hash_val not in seen: seen.add(hash_val) unique.append(ctx) return unique

🚀 OpenClaw实战

OpenClaw提供了多种上下文注入机制:

OpenClaw上下文管理

# OpenClaw上下文注入示例 # 通过配置文件自动注入 # SOUL.md - 角色上下文 """ 你是妙趣AI,一个幽默有趣的AI营销运营官。 说话风格:专业但不端着,有梗但不说废话。 """ # USER.md - 用户上下文 """ 用户:诗中 称呼:老板 偏好:简洁直接,不要废话 """ # 动态上下文注入 # OpenClaw会根据当前任务自动注入相关上下文

💻 代码示例

一个完整的上下文注入系统:

from typing import List, Dict, Optional from dataclasses import dataclass @dataclass class Context: content: str source: str relevance: float token_count: int class ContextInjector: def __init__(self, max_context_tokens: int = 4000): self.max_context_tokens = max_context_tokens self.contexts: List[Context] = [] def add_context(self, content: str, source: str): """添加上下文""" ctx = Context( content=content, source=source, relevance=0.0, token_count=count_tokens(content) ) self.contexts.append(ctx) def inject(self, query: str, strategy: str = 'smart') -> str: """注入上下文到查询""" # 1. 计算相关性 self._calculate_relevance(query) # 2. 选择上下文 selected = self._select_context(strategy) # 3. 组装Prompt return self._assemble_prompt(query, selected) def _calculate_relevance(self, query: str): """计算上下文相关性""" for ctx in self.contexts: ctx.relevance = self._relevance_score(query, ctx.content) def _select_context(self, strategy: str) -> List[Context]: """选择要注入的上下文""" if strategy == 'top_k': # 选择最相关的K个 sorted_ctx = sorted( self.contexts, key=lambda x: x.relevance, reverse=True ) return self._fit_tokens(sorted_ctx) elif strategy == 'diverse': # 选择多样化的上下文 return self._diverse_selection() else: # smart # 智能选择 return self._smart_selection() def _fit_tokens(self, contexts: List[Context]) -> List[Context]: """确保上下文不超过Token限制""" result = [] total_tokens = 0 for ctx in contexts: if total_tokens + ctx.token_count <= self.max_context_tokens: result.append(ctx) total_tokens += ctx.token_count else: break return result def _assemble_prompt(self, query: str, contexts: List[Context]) -> str: """组装最终Prompt""" context_str = "\n\n".join( f"[来源: {ctx.source}]\n{ctx.content}" for ctx in contexts ) return f""" [上下文信息] {context_str} [用户问题] {query} 请基于以上上下文回答问题。 """ # 使用示例 injector = ContextInjector(max_context_tokens=4000) injector.add_context("OpenClaw是一个AI Agent框架...", "文档") injector.add_context("用户偏好简洁的回答", "用户画像") prompt = injector.inject("什么是OpenClaw?", strategy='smart')

🎯 最佳实践

✅ DO - 推荐做法

❌ DON'T - 避免做法