LLM上下文工程实战:Prompt组装、Token预算与RAG上下文设计
摘要
- Context Engineering(上下文工程)是2026年LLM应用落地的核心能力,比Prompt Engineering覆盖面更广、更贴近生产
- Token预算是硬约束:系统提示词、工具定义、RAG检索、对话历史必须分层分配,否则要么超窗截断、要么成本失控
- Prompt组装不是字符串拼接,而是有优先级的上下文管道(Context Pipeline),每一层都有明确的预算和淘汰策略
- RAG上下文注入的3大坑:检索噪声淹没关键信息、Chunk边界切断语义、重复内容浪费Token
- 本文提供从原理到Python实现的完整方案,含Token预算计算器与生产级Context Manager
目录
- 为什么Prompt Engineering不够用了
- Context Engineering核心概念
- Token预算:上下文窗口的「财务规划」
- Prompt组装流水线设计
- RAG上下文注入最佳实践
- 上下文压缩与淘汰策略
- Python生产级Context Manager实现
- 面试高频考点与避坑指南
- 总结与延伸阅读
为什么Prompt Engineering不够用了
2024年大家还在讨论「怎么写好Prompt」,到了2026年,企业落地LLM应用时真正卡脖子的不是「一句话怎么写」,而是整个上下文怎么组织。
一个真实的生产故障
某电商客服AI上线第一周,用户投诉率飙升。排查发现:
| 现象 | 根因 | 影响 |
|---|---|---|
| AI回答与订单无关 | RAG检索了10条历史工单,淹没了当前订单上下文 | 答非所问 |
| 多轮对话后响应变慢 | 对话历史无限累积,Token超窗后触发截断 | 丢失用户意图 |
| 月API账单超预算3倍 | 系统提示词重复发送,未利用Prompt Caching | 成本失控 |
这三个问题,没有一个靠「优化Prompt措辞」能解决。它们都属于Context Engineering的范畴。
Prompt Engineering vs Context Engineering
| 维度 | Prompt Engineering | Context Engineering |
|---|---|---|
| 关注点 | 单条提示词的措辞和格式 | 整个上下文的组织、预算和生命周期 |
| 适用范围 | 简单问答、一次性任务 | 多轮对话、RAG、Agent、工具调用 |
| 核心技能 | 角色设定、Few-shot、CoT | Token预算、上下文分层、压缩淘汰 |
| 生产复杂度 | 低 | 高(涉及缓存、检索、状态管理) |
| 2026面试权重 | 基础题 | 高频架构题 |
简单说:Prompt Engineering管「说什么」,Context Engineering管「给模型看什么」。
Context Engineering核心概念
上下文的4个层次
把发给LLM的完整输入想象成一个「信息三明治」:
┌─────────────────────────────────────────────┐
│ Layer 1: 系统层 (System Context) │
│ 角色定义、行为约束、输出格式、安全策略 │
├─────────────────────────────────────────────┤
│ Layer 2: 工具层 (Tool Context) │
│ Function Calling定义、MCP工具描述、Schema │
├─────────────────────────────────────────────┤
│ Layer 3: 知识层 (Knowledge Context) │
│ RAG检索结果、知识图谱、业务规则文档 │
├─────────────────────────────────────────────┤
│ Layer 4: 对话层 (Conversation Context) │
│ 多轮历史、用户当前输入、中间推理步骤 │
└─────────────────────────────────────────────┘
每一层都有独立的Token预算,层与层之间还有优先级关系。当总Token接近窗口上限时,从低优先级层开始淘汰。
上下文的生命周期
Context不是一次性组装的,它在一次完整交互中会经历多个阶段:
- 组装(Assembly):按优先级合并各层上下文
- 验证(Validation):检查Token总量、格式合规、敏感信息过滤
- 发送(Dispatch):调用LLM API,利用Prompt Caching减少重复Token
- 更新(Update):将模型响应追加到对话层,触发下一轮组装
- 压缩(Compaction):对话过长时,摘要或淘汰低价值历史
Token预算:上下文窗口的「财务规划」
为什么要做Token预算
假设你用的是128K上下文窗口的模型,看起来很大,但生产环境中:
- 系统提示词 + 工具定义:通常占 2K-8K Token
- RAG检索10条文档:每条500 Token = 5K Token
- 50轮对话历史:每轮200 Token = 10K Token
- 模型输出预留:4K Token
合计已经 21K-27K Token。如果业务复杂(多工具Agent、长文档RAG),轻松突破50K。没有预算管理,就是在裸奔。
推荐预算分配表(128K窗口)
| 层级 | 预算比例 | Token上限 | 淘汰策略 |
|---|---|---|---|
| 系统层 | 固定 | 4K | 不淘汰,利用Prompt Caching |
| 工具层 | 固定 | 6K | 按使用频率动态加载 |
| 知识层 | 弹性 | 20K | 按相关性分数截断 |
| 对话层 | 弹性 | 30K | 滑动窗口 + 摘要压缩 |
| 输出预留 | 固定 | 8K | — |
| 安全缓冲 | 固定 | 10K | 防止估算误差超窗 |
Token计数器的3种实现
方案1:tiktoken精确计数(推荐)
import tiktoken
def count_tokens(text: str, model: str = "gpt-4o") -> int:
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
def budget_check(layers: dict[str, str], max_tokens: int = 128000) -> dict:
usage = {name: count_tokens(content) for name, content in layers.items()}
total = sum(usage.values())
return {
"usage": usage,
"total": total,
"remaining": max_tokens - total,
"overflow": total > max_tokens,
}
方案2:字符估算法(快速预检)
中文约 1.5-2 字符/Token,英文约 4 字符/Token。用于组装前的快速预检,最终发送前再用tiktoken精确校验。
方案3:API返回的实际用量
调用后从 response.usage 获取真实消耗,用于监控和动态调整预算。
Prompt组装流水线设计
流水线架构
用户输入 ──→ [意图识别] ──→ [知识检索] ──→ [上下文组装] ──→ [预算校验] ──→ LLM API
│ │ │ │
▼ ▼ ▼ ▼
决定加载哪些工具 Top-K文档筛选 按优先级合并 超限则压缩
组装优先级规则
当Token预算不足时,按以下顺序裁剪:
- 先裁对话层最旧的消息(保留最近N轮 + 首轮系统交互)
- 再裁知识层低分文档(按Rerank分数从低到高移除)
- 再裁工具层未使用的工具定义(只保留本轮可能调用的工具)
- 最后才动系统层(系统层应尽量固定,利用Prompt Caching)
生产级组装器实现
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ContextLayer:
name: str
content: str
priority: int # 数字越小优先级越高(越不容易被裁)
max_tokens: int
cacheable: bool = False
@dataclass
class ContextBudget:
total_limit: int = 128000
output_reserve: int = 8000
safety_buffer: int = 10000
@property
def available(self) -> int:
return self.total_limit - self.output_reserve - self.safety_buffer
class ContextAssembler:
def __init__(self, budget: ContextBudget):
self.budget = budget
self.layers: list[ContextLayer] = []
def add_layer(self, layer: ContextLayer) -> None:
self.layers.append(layer)
self.layers.sort(key=lambda l: l.priority)
def assemble(self) -> str:
available = self.budget.available
parts: list[str] = []
for layer in self.layers:
tokens = count_tokens(layer.content)
if tokens <= layer.max_tokens and tokens <= available:
parts.append(layer.content)
available -= tokens
elif tokens > layer.max_tokens:
truncated = self._truncate(layer.content, layer.max_tokens)
parts.append(truncated)
available -= layer.max_tokens
return "\n\n---\n\n".join(parts)
def _truncate(self, text: str, max_tokens: int) -> str:
encoding = tiktoken.encoding_for_model("gpt-4o")
tokens = encoding.encode(text)
if len(tokens) <= max_tokens:
return text
return encoding.decode(tokens[:max_tokens])
RAG上下文注入最佳实践
RAG是Context Engineering中最容易踩坑的环节。检索到的文档如何「喂」给模型,直接决定回答质量。
文档注入的3种格式
格式1:XML标签包裹(推荐,Claude/GPT均友好)
<retrieved_documents>
<document source="product_manual_v3.pdf" score="0.92">
产品保修期为购买之日起12个月,人为损坏不在保修范围内...
</document>
<document source="faq_returns.md" score="0.87">
7天无理由退货需保持商品完好,运费由买家承担...
</document>
</retrieved_documents>
格式2:编号引用(适合需要溯源的场景)
[1] 产品保修期为购买之日起12个月...(来源:product_manual_v3.pdf)
[2] 7天无理由退货需保持商品完好...(来源:faq_returns.md)
请基于以上参考资料回答用户问题,并在回答中标注引用编号。
格式3:直接拼接(不推荐,模型难以区分来源)
RAG上下文的5条铁律
| 规则 | 说明 | 违反后果 |
|---|---|---|
| 相关性阈值过滤 | 低于0.7分的文档不注入 | 噪声干扰,幻觉增加 |
| 去重 | 同一文档的不同Chunk合并 | Token浪费 |
| 元数据保留 | 标注来源、时间、版本 | 无法溯源,合规风险 |
| 位置优先 | 最相关的文档放最前面 | 模型注意力衰减(Lost in the Middle) |
| 动态Top-K | 根据剩余预算调整K值 | 预算不足时硬截断 |
Lost in the Middle问题
2023年斯坦福大学的研究发现:当相关信息放在上下文中间位置时,模型的召回准确率显著下降。生产中的应对策略:
- 最相关的2条文档放在最前面
- 次相关的放在最后面
- 中间位置放系统提示词或工具定义等「固定内容」
上下文压缩与淘汰策略
策略1:滑动窗口
保留最近N轮对话,最简单也最有效。推荐 N=10-20(视单轮Token量而定)。
策略2:摘要压缩
当对话超过阈值时,用一个小模型(或同模型)对早期对话做摘要:
SUMMARIZE_PROMPT = """请将以下对话历史压缩为一段摘要,保留:
1. 用户的核心诉求和约束条件
2. 已确认的关键事实(订单号、产品型号等)
3. 尚未解决的问题
对话历史:
{history}
摘要(不超过200字):"""
策略3:结构化状态提取
对于Agent场景,不保留完整对话,而是维护一个结构化的「会话状态」:
{
"user_intent": "查询订单物流",
"entities": {"order_id": "ORD-20260703-8842"},
"resolved": ["已确认订单存在", "物流承运商为顺丰"],
"pending": ["预计送达时间"]
}
每轮只把状态JSON注入上下文,Token消耗从O(轮数)降到O(1)。
压缩策略选型
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 客服多轮对话 | 滑动窗口 + 摘要 | 平衡成本与上下文连贯性 |
| Agent工具调用 | 结构化状态提取 | 工具结果通常很长,状态更精简 |
| 代码助手 | 滑动窗口(保留代码块) | 代码不宜摘要,会丢失细节 |
| 文档问答 | 无需压缩对话层 | 单轮为主,知识层才是大头 |
Python生产级Context Manager实现
把上面的概念整合为一个可复用的Context Manager:
class ProductionContextManager:
def __init__(
self,
model: str = "gpt-4o",
budget: ContextBudget = ContextBudget(),
):
self.model = model
self.budget = budget
self.assembler = ContextAssembler(budget)
self.conversation_history: list[dict] = []
def build_context(
self,
user_input: str,
system_prompt: str,
retrieved_docs: Optional[list[dict]] = None,
tools: Optional[list[dict]] = None,
) -> str:
self.assembler.layers.clear()
self.assembler.add_layer(ContextLayer(
name="system", content=system_prompt,
priority=0, max_tokens=4000, cacheable=True,
))
if tools:
tools_text = self._format_tools(tools)
self.assembler.add_layer(ContextLayer(
name="tools", content=tools_text,
priority=1, max_tokens=6000,
))
if retrieved_docs:
docs_text = self._format_rag_docs(retrieved_docs)
self.assembler.add_layer(ContextLayer(
name="knowledge", content=docs_text,
priority=2, max_tokens=20000,
))
history_text = self._format_history()
self.assembler.add_layer(ContextLayer(
name="conversation", content=history_text,
priority=3, max_tokens=30000,
))
user_layer = f"<user_query>\n{user_input}\n</user_query>"
self.assembler.add_layer(ContextLayer(
name="current_input", content=user_layer,
priority=4, max_tokens=4000,
))
return self.assembler.assemble()
def _format_rag_docs(self, docs: list[dict]) -> str:
filtered = [d for d in docs if d.get("score", 0) >= 0.7]
filtered.sort(key=lambda d: d["score"], reverse=True)
parts = ["<retrieved_documents>"]
for doc in filtered:
parts.append(
f' <document source="{doc["source"]}" score="{doc["score"]:.2f}">\n'
f' {doc["content"]}\n'
f' </document>'
)
parts.append("</retrieved_documents>")
return "\n".join(parts)
def update_history(self, role: str, content: str) -> None:
self.conversation_history.append({"role": role, "content": content})
if len(self.conversation_history) > 40:
self._compact_history()
def _compact_history(self) -> None:
old = self.conversation_history[:20]
self.conversation_history = self.conversation_history[20:]
summary = f"[Earlier conversation summary: {len(old)} messages condensed]"
self.conversation_history.insert(0, {"role": "system", "content": summary})
面试高频考点与避坑指南
面试常问的5个问题
Q1:Context Engineering和Prompt Engineering有什么区别?
Context Engineering关注整个输入上下文的组织、预算和生命周期管理,是系统级设计;Prompt Engineering关注单条提示词的措辞优化,是技巧级优化。生产环境中前者决定系统能不能跑、跑多少钱,后者决定回答质量好多少。
Q2:128K上下文是不是可以不做压缩了?
不能。128K是理论上限,实际中要考虑:成本(按Token计费)、延迟(上下文越长推理越慢)、注意力衰减(Lost in the Middle)、以及多用户并发时的资源竞争。生产环境必须做预算管理。
Q3:RAG检索10条文档全部注入好不好?
不好。检索结果必须经过相关性过滤(阈值)、去重、Rerank重排,并按预算动态调整Top-K。噪声文档会显著增加幻觉率。
Q4:Prompt Caching和Context Engineering什么关系?
Prompt Caching是成本优化手段,Context Engineering决定哪些内容适合缓存。系统提示词和工具定义等固定内容应标记为cacheable,对话层和RAG结果不适合缓存。
Q5:多Agent系统中上下文怎么管理?
每个Agent维护独立的Context Manager,通过结构化状态(而非完整对话历史)在Agent间传递信息。避免把Agent A的完整上下文传给Agent B,Token会指数级膨胀。
生产避坑清单
| 坑 | 表现 | 解法 |
|---|---|---|
| 无限累积对话历史 | 多轮后响应变慢、超窗截断 | 滑动窗口 + 摘要压缩 |
| RAG噪声注入 | 回答偏离用户问题 | 相关性阈值 + Rerank |
| 系统提示词重复计费 | API成本居高不下 | Prompt Caching |
| 工具定义全量加载 | 8K+ Token浪费在无用工具上 | 按意图动态加载工具 |
| 缺少Token监控 | 成本失控后才发现 | 每次调用记录 usage 指标 |
多模型上下文的差异化管理
2026年生产环境很少只用一种模型。GPT-4o、Claude Sonnet、Gemini Pro可能同时存在于不同业务线,Token计数和上下文格式并不通用。
各模型Token计数差异
| 模型 | 计数器 | 中文约估 | 特殊注意 |
|---|---|---|---|
| GPT-4o | tiktoken cl100k_base | 1.5-2字/Token | 工具定义按Token计费 |
| Claude 3.5+ | 官方API count_tokens | 1.5-2字/Token | 支持Prompt Caching标记 |
| Gemini 1.5+ | 自有分词器 | 1.3-1.8字/Token | 超长上下文(1M)计费不同 |
生产级Context Manager应抽象 TokenCounter 接口,按模型注入不同实现,绝不能用GPT的tiktoken估算Claude的用量。
class TokenCounter(Protocol):
def count(self, text: str) -> int: ...
class TiktokenCounter(TokenCounter):
def count(self, text: str) -> int:
return len(tiktoken.encoding_for_model("gpt-4o").encode(text))
class AnthropicCounter(TokenCounter):
def count(self, text: str) -> int:
# 调用 Anthropic count_tokens API 或本地近似
return int(len(text) / 1.7)
Prompt Caching生产实践
Anthropic和OpenAI均已支持Prompt Caching,是2026年降本增效的第一手段。
Cache Breakpoint策略
[可缓存] 系统提示词(4K Token)
[可缓存] 工具定义(6K Token)
[不可缓存] RAG检索结果(每次不同)
[不可缓存] 对话历史(持续增长)
每轮对话中,系统层+工具层约10K Token可被缓存,按Anthropic 2026年定价,缓存读取价格为正常的10%。
成本节省测算
假设日请求10万次,系统+工具层10K Token/次:
| 模式 | 日Token消耗 | 日成本(约) |
|---|---|---|
| 无缓存 | 10亿 Token | $3000 |
| 90%缓存命中 | 1.9亿 Token | $600 |
| 节省 | — | 80% |
Context Engineering的核心职责之一,就是识别并标记可缓存层,把静态内容固定在上下文前缀。
上下文质量评估与A/B测试
三维评估指标
| 指标 | 定义 | 测量方式 |
|---|---|---|
| Faithfulness | 回答是否忠于检索内容 | LLM-as-Judge + 人工抽检 |
| Relevance | 检索内容是否与问题相关 | Rerank分数分布 |
| Token Efficiency | 每单位Token的信息密度 | 正确答案Token / 总输入Token |
A/B测试框架
experiments = {
"control": {"rag_top_k": 10, "threshold": 0.5},
"variant_a": {"rag_top_k": 5, "threshold": 0.7},
"variant_b": {"rag_top_k": 5, "threshold": 0.7, "rerank": True},
}
对比三组的用户满意度、平均Token消耗、P99延迟,用数据驱动上下文策略迭代,而非靠直觉调参。
Agent场景的上下文隔离
多Agent系统中,最大的Token陷阱是上下文泄漏——把Agent A的完整对话历史传给Agent B。
隔离原则
协调者Agent 只传递:
- 任务描述(用户原始问题)
- 结构化状态(order_id, intent)
- 上游Agent的Artifact(非完整对话)
禁止传递:
- 其他Agent的系统提示词
- 其他Agent的工具调用中间结果
- 完整的多轮对话历史
子Agent上下文模板
<delegated_task>
<intent>查询物流状态</intent>
<context>
<order_id>ORD-20260703-8842</order_id>
<user_id>USR-456</user_id>
</context>
<constraints>只返回物流信息,不处理退款</constraints>
</delegated_task>
企业客服系统改造案例
某SaaS客服平台改造前后对比:
| 指标 | 改造前 | 改造后(Context Engineering) |
|---|---|---|
| 平均输入Token | 45000/次 | 12000/次 |
| 月API成本 | ¥28万 | ¥9万 |
| 答非所问率 | 23% | 6% |
| P95响应延迟 | 8.2秒 | 3.1秒 |
改造措施:分层Token预算、RAG阈值从0.5提到0.7、对话超20轮自动摘要、系统提示词启用Prompt Caching。
面试高频考点与避坑指南(进阶篇)
Q6:上下文窗口从128K扩展到1M,策略要变吗?
要变。窗口越大,「Lost in the Middle」问题越严重——相关信息埋在90万Token中间,模型反而找不到。更大窗口不等于塞更多内容,而是允许更精细的分层和更长的对话历史。
Q7:怎么判断该用RAG还是直接把文档塞进上下文?
文档总Token < 窗口预算的30% 且文档集固定 → 可全量注入(Long Context)。文档动态增长或总量超过预算 → 必须RAG。2026年趋势是混合:核心文档全量 + 动态检索补充。
Q8:工具定义占8K Token,怎么优化?
三策略:(1) 按意图动态加载子集工具;(2) 合并相似工具为一个带参数的通用工具;(3) 工具描述用简短Schema,详细文档放RAG按需检索。
Q9:如何监控上下文质量?
每次请求记录:各层Token用量、RAG命中率、截断次数、缓存命中率。Grafana面板展示Token成本趋势,异常波动自动告警。
Context Engineering 工具链推荐(2026)
| 工具 | 用途 | 推荐场景 |
|---|---|---|
| tiktoken | GPT Token精确计数 | OpenAI模型 |
| Anthropic count_tokens API | Claude Token计数 | Claude模型 |
| LangSmith / LangFuse | 上下文追踪与评估 | 生产监控 |
| LlamaIndex Response Synthesizer | RAG上下文组装 | 文档问答 |
| Microsoft Guidance | 结构化输出约束 | 格式固定场景 |
自建 vs 购买
- 日请求 < 1万:自建Context Manager足够(本文代码即可起步)
- 日请求 1万-100万:引入LangFuse做追踪,自研核心组装逻辑
- 日请求 > 100万:需要专用上下文缓存层(Redis)+ 分层预算引擎
上下文模板库:团队最佳实践沉淀
不要把系统提示词散落在代码里。推荐建立团队级上下文模板库:
context-templates/
├── customer-service/
│ ├── system-v3.md # 客服系统提示词(版本化)
│ ├── tools-schema.json # 工具定义
│ └── rag-config.yaml # RAG参数(top_k, threshold)
├── code-assistant/
│ ├── system-v2.md
│ └── tools-schema.json
└── changelog.md # 每次模板变更记录与A/B结果
每次模板变更走Code Review,记录变更原因和A/B测试结果。这是2026年LLM团队的「基础设施即代码」实践。
动手实战:构建最小可用Context Pipeline
目标
用30行核心代码实现:分层组装 → Token预算校验 → 超限自动裁剪。
Step 1:定义预算
budget = ContextBudget(total_limit=128000, output_reserve=8000, safety_buffer=10000)
manager = ProductionContextManager(budget=budget)
Step 2:准备测试数据
docs = [
{"source": "faq.md", "score": 0.92, "content": "退货政策:7天无理由..."},
{"source": "noise.md", "score": 0.45, "content": "无关内容..."}, # 应被过滤
]
history = [{"role": "user", "content": f"消息{i}"} for i in range(50)] # 触发压缩
Step 3:组装并检查
context = manager.build_context(
user_input="如何退货?",
system_prompt="你是客服助手...",
retrieved_docs=docs,
)
report = budget_check({"assembled": context})
print(f"总Token: {report['total']}, 超限: {report['overflow']}")
Step 4:验证过滤效果
noise.md(score=0.45)不应出现在最终上下文中- 50条历史消息应被压缩到40条以内
- 系统提示词应完整保留(最高优先级)
扩展练习
- 接入真实RAG检索(LlamaIndex或LangChain),替换硬编码docs
- 添加Prometheus指标:
context_tokens_by_layer{layer="knowledge"} - 对比启用/禁用Prompt Caching的API成本差异
深度辨析:上下文工程 vs 微调 vs 长上下文
很多团队在「效果不好」时的第一反应是「要不要微调模型」。2026年的决策树应该是:
第一步:检查上下文质量。 如果RAG检索不准、对话历史太长、系统提示词含糊——这些是Context Engineering问题,微调解决不了。业界经验:80%的「模型效果不好」实际上是上下文组织问题。
第二步:检查模型选择。 换更强的模型(如从GPT-4o-mini升到GPT-4o)往往比微调见效快、成本低。微调适合领域术语固定、输出格式严格、且已有大量标注数据的场景。
第三步:考虑微调。 当上下文工程已优化到位、模型选择已合理、但特定领域表现仍不达标时,才考虑SFT/RLHF微调。微调的成本不仅是GPU费用,还包括数据标注、模型版本管理、回滚策略。
长上下文(128K-1M)不是银弹。 窗口越大,模型对中间内容的注意力越分散。与其把100篇文档全塞进去,不如精准检索5篇高相关文档。Context Engineering的核心价值是「用最少的Token给模型看最对的信息」。
2026年Context Engineering技术趋势
趋势1:上下文感知的Reranker。 不再是通用的Embedding检索,而是根据当前对话上下文动态调整检索策略。例如用户已提到订单号,Reranker会提升包含该订单号的文档权重。
趋势2:自适应Token预算。 根据问题复杂度动态分配预算——简单FAQ只给2K知识层Token,复杂多步推理给20K。避免「一刀切」的固定预算。
趋势3:跨会话长期记忆。 将用户偏好、历史交互摘要存储在外部记忆系统(如Mem0、Zep),按需注入上下文,而非无限累积对话历史。
趋势4:多模态上下文管理。 图片、音频、视频内容的Token计数和管理策略与纯文本不同。2026年多模态Agent需要统一的Context Manager处理异构内容。
趋势5:上下文安全。 防止Prompt注入攻击(恶意文档内容覆盖系统指令)、敏感信息泄漏(PII不出现在日志和缓存中)。Context Engineering必须包含安全过滤层。
给LLM工程师的3句话总结
- 上下文组织决定系统能不能跑、跑多少钱——比Prompt措辞重要10倍
- 四层预算(系统/工具/知识/对话)+ 超限裁剪是生产标配
- 先优化Context Engineering,再考虑微调和换模型
推荐学习路线(2周)
第1周:理解分层+Token预算 — 阅读Anthropic Prompt Caching文档 → 用tiktoken实现Token计数器 → 实现四层Context Assembler → 测试超限裁剪逻辑。
第2周:RAG注入+生产化 — 接入向量检索 → 实现RAG过滤和Rerank → 添加对话压缩策略 → 搭建Token监控Dashboard → 准备5个面试标准答案。
最后送一句话:在LLM应用中,你喂给模型什么,决定了它能给你什么。Context Engineering就是「喂什么」的工程学。
建议读者按本文的Context Pipeline架构,先在本地实现最小可用版本,再逐步接入RAG、Prompt Caching和监控。每个模块独立验证后再组合,避免一次改动太多难以定位问题。
总结与延伸阅读
Context Engineering是2026年LLM应用从Demo走向生产的分水岭。核心就三件事:分层管理上下文、严格Token预算、智能压缩淘汰。
设计要点回顾:
- 上下文分4层:系统层、工具层、知识层、对话层,各有独立预算
- Token预算是硬约束,128K窗口不等于可以挥霍
- RAG注入必须过滤、去重、排序,避免Lost in the Middle
- 对话压缩三策略:滑动窗口、摘要压缩、结构化状态提取
- Prompt Caching + Context Pipeline是成本优化的组合拳
相关阅读:
- Python LLM Prompt Caching实战 — 降低重复Token成本
- LLM长上下文优化策略 — 超长文档处理方案
- RAG生产级落地指南 — 检索增强生成的完整Pipeline
权威参考:
本站提供浏览器本地工具,免注册即可试用 →