Agent_提示词工程

提示词工程是什么、解决什么问题,以及为何演化到上下文工程与 harness 工程

提示词工程是什么

提示词工程(Prompt Engineering)本质是:

通过设计输入结构(指令、上下文、示例、输出约束),提高模型输出质量、稳定性和可用性。

早期它主要是“单次调用优化”问题:

  • 同一个问题怎么让模型更少跑偏
  • 怎么让模型按格式输出,方便程序接入
  • 怎么让模型在有限上下文中优先关注关键信息

一句话理解:

Prompt 工程 = 把自然语言需求,转成模型可稳定执行的输入规范

早期提示词工程要解决什么问题

在早期大模型使用阶段,主要痛点很直接:

  1. 输出不稳定
  • 相同问题,不同轮次质量波动明显
  1. 指令跟随不一致
  • 会漏条件、漏步骤,或者偏离任务边界
  1. 输出格式不可控
  • 难以稳定产出 JSON、表格、结构化字段
  1. 幻觉与编造
  • 在信息缺口场景下容易“补全事实”
  1. 工程接入成本高
  • 无法可靠进入自动化工作流(解析、入库、调用)

提示词工程的实际价值,就是把这些“随机对话行为”转成“可重复调用行为”。

提示词工程的典型方法

1. 指令清晰化

把任务拆为明确动作,避免抽象要求。

你是后端代码审查助手。
目标:找出并发安全问题。
范围:仅检查 src/service/*.java。
输出:按 风险级别/文件路径/修复建议 三列输出 Markdown 表格。

2. 结构化约束

给固定输出 Schema,减少“好看但不可用”的回答。

{
  "risk_level": "high|medium|low",
  "file": "string",
  "issue": "string",
  "fix": "string"
}

3. Few-shot 示例

给 1-3 个高质量样例,提升风格一致性与任务理解。

4. 角色与边界

明确“能做什么”和“不能做什么”,特别是禁止臆测。

如果证据不足,返回“信息不足”,不要编造。

5. 迭代调优

把 prompt 当代码维护:版本化、回归测试、逐步收敛。

实际开发中怎么用(可执行流程)

第 0 步:先定义任务接口

先写清楚:

  • 输入是什么
  • 输出给谁消费(人/程序)
  • 合格输出标准

这一步本质是“为 Prompt 定 API 契约”。

第 1 步:用模板化 Prompt

建议固定模板:

  • 角色
  • 目标
  • 输入数据
  • 约束
  • 输出格式
  • 失败处理规则

示例:

[角色]
你是资深前端 reviewer。

[目标]
检查以下 PR diff 是否存在可访问性问题。

[输入]
{{DIFF_CONTENT}}

[约束]
- 只依据提供的 diff 判断
- 不猜测未给出的代码

[输出格式]
JSON 数组:[{"severity":"","file":"","issue":"","fix":""}]

[失败处理]
证据不足时返回空数组并给出 reason 字段。

第 2 步:给 Prompt 加自动评测

不要只靠主观阅读结果。至少做两类检查:

  • 格式检查:JSON 是否可解析、字段是否齐全
  • 质量检查:是否命中关键规则(比如必须包含 file 和 fix)

第 3 步:把失败样本回灌到 Prompt

将典型失败样本沉淀为:

  • 新约束
  • 新示例
  • 新反例

这一步是提示词工程最核心的“可学习回路”。

第 4 步:按场景拆分 Prompt

不要期望一个超级 Prompt 覆盖所有场景。按任务分开:

  • 信息抽取 Prompt
  • 代码审查 Prompt
  • 规划 Prompt
  • 生成 Prompt

拆分后更稳定,也更易测。

单独做提示词工程的不足

提示词工程很有效,但它有天然边界,尤其在 Agent/长任务开发里:

  1. 记忆能力不足
  • Prompt 优化的是“这一次怎么说”,不是“多轮历史怎么管理”
  1. 长上下文退化
  • 历史越来越长时,仅靠 prompt 约束无法解决 token 与注意力稀释问题
  1. 状态不可持续
  • 会话中断后,单条 Prompt 很难完整恢复任务现场
  1. 缺少执行闭环
  • Prompt 可以要求“请测试”,但不等于真的执行测试、采集日志、回写状态
  1. 缺少系统级治理
  • 无法单独解决工具编排、失败恢复、可观测性、质量门禁

为什么会演化出上下文工程

当任务从“问答”变成“连续开发”后,主要矛盾变成:

  • 需要保留哪些历史
  • 何时压缩历史
  • 旧信息如何检索回填
  • 新窗口如何无损交接

这就是上下文工程(Context Engineering)要处理的问题:

Prompt 工程关注:怎么表达任务
Context 工程关注:怎么管理任务历史和状态

为什么还要演化到 Harness 工程

即使有了 Prompt + Context,仍有一个更大的问题:

如何让 Agent 在真实工程里稳定交付结果。

这要求引入系统级能力:

  • 工具链编排(lint/test/build/deploy)
  • 质量门禁与自动验证
  • 失败恢复与重试策略
  • 任务调度与状态追踪
  • 规则沉淀与可观测性

这就是 Harness 工程的范围:

Harness 工程 = 把 Prompt、Context、Tools、Checks、Workflow 组装成可持续交付系统

三者关系总结

维度提示词工程上下文工程Harness 工程
核心问题如何让单次输出更好如何管理多轮记忆与状态如何让整套开发流程稳定交付
主要对象单次输入文本历史消息、摘要、检索、状态工具链、规则、验证、编排
典型产物Prompt 模板状态快照、压缩摘要、记忆层Agent 工作流、检查回路、运行策略
失效点长任务漂移缺少执行与治理实施成本更高但最稳

我的实践结论

提示词工程不是过时,而是基础层能力。

实际开发里更合理的顺序是:

  1. 先把 Prompt 工程做好(稳定输入输出)
  2. 再上 Context 工程(解决长任务记忆)
  3. 最后用 Harness 工程做系统闭环(稳定交付)

如果直接跳到 Harness,但基础 Prompt 质量不稳定,系统复杂度会快速上升且难排查;反过来只做 Prompt,又无法支撑长流程开发。

参考文章