简介:本文系统辨析大模型应用中的三层工程实践:Prompt Engineering负责设计一次性输入,Context Engineering在任务全程动态组织上下文,Harness Engineering则用代码为模型施加外部约束。文章梳理三者的定义、核心区别、嵌套交集与协作方式,并结合典型场景给出选型与落地建议,帮助你判断不同复杂度的任务应把工程重心放在哪一层。
在大模型应用开发中,Prompt Engineering(提示词工程)、Context Engineering(上下文工程)与Harness Engineering(脚手架工程,也称约束工程)经常被并列讨论,但它们回答的是三个不同层面的问题:输入怎么写、过程喂什么、边界怎么管。理解三者差异的第一步,是分别看清它们“是什么、管什么、解决什么问题”。
定义:提示词工程是在单次模型调用之前,对发送给模型的指令进行措辞、结构与示例设计的工程实践。
它管理的对象是“这一次调用要说什么”。开发者通过明确任务目标、设定角色、约定输出格式、补充少量示例等方式,把一个模糊需求转化为模型能够准确理解并执行的输入。它的典型特征是一次性:输入发出之后,本轮工程工作即告结束,任务成败在很大程度上取决于这段文本的质量。
它解决的问题:同一个模型,不同的提问方式会得到质量悬殊的输出。提示词工程的本质是降低“模型理解偏差”,让模型把已有能力准确对准任务目标,而不是“教会模型新知识”。
定义:上下文工程是在任务执行的全过程中,持续判断“此刻哪些信息应该进入模型的上下文窗口”,并对其进行检索、筛选、压缩与注入的工程实践。
它管理的不是一句指令,而是模型在每一轮调用时看到的全部信息:系统指令、历史对话或其摘要、检索到的知识片段、上一次工具调用的返回结果、待处理的结构化数据等。由于上下文窗口有限,而任务相关信息又分散在多个来源,系统必须在每一轮动态做出判断:保留什么、丢弃什么、压缩什么、补充什么。
它解决的问题:随着任务变长,历史不断膨胀、无关内容持续涌入、关键事实被淹没。上下文工程的本质,是在有限的窗口内,让模型在每一刻都看到“当下最相关”的信息,而不是“所有”信息。
定义:Harness工程是把模型嵌入一套由确定性代码构成的外部执行框架(harness原意为“挽具、马具”,在软件领域引申为“运行支架、测试脚手架”)之中,通过格式校验、工具接口、权限控制、重试机制、状态管理等手段约束模型行为的工程实践。
它承认一个基本事实:模型输出本质上是不确定的,仅靠自然语言措辞无法保证格式正确、行为不越界、任务能闭环。因此harness的思路是“用代码兜住模型”:模型负责生成,代码负责验证、裁决与执行。需要注意的是,harness并不排斥上下文管理——正相反,上下文的组装逻辑本身往往就作为代码运行在harness之中,harness是在“输入上下文”之外,额外叠加的一层程序化约束。
它解决的问题:让概率性的模型输出,变成可校验、可重试、可观测、可回滚的确定性流程。
可以从五个维度对三者进行对比:
| 对比维度 | Prompt工程 | Context工程 | Harness工程 |
|---|---|---|---|
| 管理对象 | 单次输入的指令文本 | 每轮进入窗口的全部信息 | 模型外部的执行环境与约束 |
| 生效时机 | 调用前,一次性确定 | 任务全程,每轮动态调整 | 任务全生命周期,含调用之外的环节 |
| 实现手段 | 自然语言写作与结构设计 | 检索、压缩、编排等信息组织策略 | 确定性代码与系统机制 |
| 工程属性 | 偏“写作与设计” | 偏“策略与数据流” | 偏“软件工程” |
| 典型失败表现 | 模型理解偏差、答非所问 | 无关信息淹没、超窗、关键信息缺失 | 输出不可验证、任务不可控、不可复现 |
进一步展开:Prompt工程的交付物是一段精心设计的文本;Context工程的交付物是一套信息组织策略及其运行数据流;Harness工程的交付物则是可部署、可维护的程序系统。三者失败时的症状也不同——prompt失效表现为“理解错了”,context失效表现为“信息乱了”,harness缺失表现为“管不住了”。
三者并非三条互斥的技术路线,而是围绕同一目标的三个叠加层次,交集主要体现在三个方面。
其一,嵌套包含关系。 从信息视角看,prompt是context的初始组成部分——首轮上下文通常由系统提示与用户提示构成;而context的组装与裁剪逻辑,通常作为代码运行在harness之中。三者呈现“输入 ⊂ 上下文 ⊂ 运行框架”的层级结构。
其二,目标一致。 三者都在回答同一个问题:如何把模型的自然语言能力转化为可依赖的任务执行。区别只在作用层面——prompt作用于语义理解,context作用于信息供给,harness作用于行为边界。
其三,工程重心随任务复杂度迁移。 单轮生成任务写好prompt即可;多轮对话与知识问答,context管理成为主要矛盾;长程智能体任务需要连续决策、调用工具、产出结构化结果,harness的可靠性设计决定系统上限。实践中的演进路径,通常就是从prompt到context再到harness逐层加深。
下面用一段语言无关的伪代码,展示三层工程在同一个任务循环中如何配合(仅为示意):
SYSTEM_PROMPT = "你是订单查询助手,只回答与订单相关的问题,输出结构化格式。"while not task_done:context = build_context( # ← Context工程:每轮重建上下文system = SYSTEM_PROMPT, # ← Prompt工程:一次写好的输入设计history = compress(dialog), # 历史压缩knowledge = retrieve(query), # 知识检索tool_notes = recent_results, # 工具结果筛选)raw = llm(context)answer = validate_schema(raw) # ← Harness:格式校验if answer is None:raw = llm(context, REPAIR_HINT) # ← Harness:失败重试answer = validate_schema(raw)if answer.wants_tool:if answer.tool in ALLOWED_TOOLS: # ← Harness:权限白名单result = run_in_sandbox(answer.tool) # ← Harness:沙箱执行append(recent_results, result)else:append(recent_results, DENIED)continueemit(answer)
逐段拆解:SYSTEM_PROMPT是相对稳定的输入设计,属于prompt工程;build_context在每一轮压缩历史、检索知识、过滤工具结果,属于context工程;而while循环、结构校验、失败重试、权限判断、沙箱执行这些不依赖模型自觉、由代码强制执行的机制,正是harness工程的核心。
在百度智能云等提供大模型推理与工程化配套能力的云平台上,这三层实践通常分别对应提示词模板管理、检索与记忆组件、应用编排与安全校验等通用能力类别,开发者可以按任务复杂度逐层引入,不必一步到位。
Prompt层面:
Context层面:
Harness层面:
回到定义本身:Prompt工程解决“一次输入怎么说”,Context工程解决“任务过程中每一步给模型看什么”,Harness工程解决“如何用代码为模型划出确定性的行为边界”。三者不是相互替代的技术选项,而是同一目标下的三个叠加层次:prompt是context的起点,context是harness调度的主要对象,harness则把前两者纳入可验证、可控制、可观测的执行框架。判断工程力气该花在哪一层,看任务形态即可——单轮任务优化prompt,多轮任务经营context,长程自动化任务则必须建好harness。