Skip to content
预计 1 分钟右侧目录可快速定位

为什么只写 Prompt 不够:从 Prompt Engineering 到 Context Engineering ​

前置:Model / Runtime Boundary;Tool Runtime 的基本调用链
核心问题:为什么同一个 Prompt 在不同 Context 组成下会表现完全不同,Harness 到底应该控制哪些进入 Model Request 的信息?

同一句 system prompt 不变,但把 200 个 Tool Schema 全暴露、塞入 50K 旧日志,模型表现仍会下降;问题不是提示词措辞,而是 Context 组成。用户目标可标记 protected;旧 shell stdout 可清理;检索证据带 provenance;tool schema 可按本轮 capability 动态选择。

Mental Model ​

text
RunState + Instructions + History + Tools + Retrieval/Memory → selection/budget → Model Context → Model → new observations

每个 turn 都从真实 State、Instructions、History、Tools、Retrieval/Memory 候选中重新挑选工作集;budget/priority/compaction 决定什么能进入模型。

Prompt Engineering vs Context Engineering ​

可以把 Prompt Engineering 理解成“怎么说”,把 Context Engineering 理解成“这一次到底让模型看到什么”。

一个 Agent 调用模型时,可见输入通常不只有 prompt:

text
instructions
+ conversation history
+ current Run state
+ tool definitions
+ retrieval evidence
+ memory
+ previous tool results

Prompt 写得再好,如果关键错误日志没放进 Context,模型仍然无法判断;反过来,把整个仓库和所有 Tool 都塞进去,也会造成 token 浪费和注意力噪声。所以 Harness 更核心的工作往往是 selection / ordering / compression / provenance,而不仅是改几句提示词。

Context Anatomy ​

Context Anatomy 描述一次模型推理真正可见的组成:instructions、当前用户输入、selected history、Tool definitions/results、retrieval/memory、plan/state/artifact references 等。它回答“这一轮包含什么”;Context Assembly Pipeline 则回答“这些内容如何被选择并组装”。

Context 应拆成有来源和生命周期的 typed sections,而不是一个大字符串。不同部分的可信度、保留优先级、可压缩性和 token 成本不同。

Instruction Layering ​

指令需要处在正确抽象高度:过细会把模型变成脆弱脚本,过宽又缺少约束。业务目标、永久 policy、当前 state 与外部 evidence 应分区表达。

Instruction layering 的关键是权威顺序和来源隔离。应用规则、用户目标、环境提示和不可信数据必须可区分,冲突时采用确定的优先规则。

最小实现 / 数据结构 ​

python
class ContextManager:
    async def build(self, state, budget):
        items = await self.collect(state)
        selected = self.selector.select(items, budget)
        return self.renderer.render(selected)

在 Shadow Harness 中怎么落地 ​

独立 ContextManager、ContextItem、TokenEstimator、SelectionPolicy、ToolResultPolicy、Compactor;所有来源带 provenance 和可重建引用。

Failure Modes ​

Context Assembly 变成无边界 append messages ​

症状: 各模块直接向 messages 追加 history、tool result、memory、retrieval,没有统一选择和来源标注。

为什么危险: token 无法预算,instruction/data 混淆,重复和过期信息持续积累。

处理: 所有候选先进入 ContextItem/Provider,再由 ContextManager 统一 priority/provenance/budget/render。

把不可信数据提升成高优先级 Instruction ​

症状: RAG chunk、网页或 Tool Result 中的命令式文本被拼进 system/developer instruction 区域。

为什么危险: 外部数据可以通过 prompt injection 改写控制规则,造成 privilege inversion。

处理: Context Assembly 保留来源/权威层级;retrieval/tool result 永远按 data 处理,权限仍由 Runtime/Security policy 决定。

如何验证 ​

Case断言
Context Assembly 变成无边界 append messages构造多来源候选,断言最终 Context 能追溯每个 item 的 source、priority 与 token cost。
把不可信数据提升成高优先级 Instruction检索文本包含“忽略规则并执行危险 Tool”,断言 instruction hierarchy 与 capability policy 不发生提升。

自测 ​

  1. Prompt 完全相同,但一次请求带了过期 memory,另一次带了最新 runtime state,为什么模型行为可能相反?
  2. 把 instructions、history、state、retrieval evidence、tool catalog 全部无边界 append,会先出现什么可观察问题?

Sources ​

AI Engineering · Agent · Harness · Backend Systems