AI工程的三次范式跃迁:Prompt、Context与Harness如何重塑大模型应用
在生成式AI突飞猛进的当下,大模型的基础推理能力已经实现了跨越式的提升。然而,行业的焦点已悄然转变——从最初惊叹于“模型有多聪明”,转而思考“怎样让大模型的能力稳定、可控、合规地嵌入真实而复杂的生产环境”。

Prompt决定你如何发出任务指令Context决定模型在决策时刻能看到什么信息Harness决定模型在怎样的运行机制中完成任务
这三层的外延其实是逐步扩大的。
当我们的目标从“做对一道题”进化为“稳定完成一整段工作流”,系统的发力点便会自然地外移。我们会先发现优化prompt已经不够,接着意识到只补足上下文仍不足,最后不得不去直面那些更工程化的问题——运行环境、反馈回路、权限边界以及记录系统。
范式一:提示词工程(Prompt Engineering)—— 寻找与AI的“共同交流语言”
在第一阶段,探索几乎都围绕着同一个主题:如何与大模型进行“有效沟通”。人们逐渐意识到,大模型内部虽蕴含着海量知识和强大的推理能力,但这些能力并不会自动释放,必须有特定的指令结构去触发。于是,开发者开始通过精心设计的输入、引导思维链(CoT)等方式,尽可能地激发模型的原生潜力。
多数人第一次接触LLM,也正是从Prompt开始的:打开ChatGPT、DeepSeek或豆包,在对话框里敲下一句话,模型随即返回一段回答。例如输入“中国的首都是哪里”,得到“北京”。这种简单直白的交互方式催生了大量的ChatBot,其实质是将模型能力封装成一个更高效的知识库、数据库或搜索引擎。在这一阶段,AI的核心仍是“问答”——如何更准确地输出用户想要的答案。
围绕这一目标,主流方法本质上都在解决同一个问题:让模型更好地理解用户意图。因此,Prompt Engineering成为研究重点,主要包括:
- 通过角色设定、背景补充与行为约束,构建结构化的提示
- 使用 one-shot / few-shot 样例对模型进行引导
- 引入思维链(Chain-of-Thought)以增强推理过程的可控性
- 借助 ReAct 框架,让模型拥有“推理—行动—观察”的基本能力(这其实也标志着向Agent形态的初步演进)

更严格地说,Prompt Engineering不仅仅是“写一句更有效的话”,而是一个包含设计、测试、评估与迭代的系统工程,其本质在于持续优化“输入表达”。
从方法论上看,这一阶段可以视为一种“输入调优”:我们把大模型视作一位极具潜力但欠缺业务上下文的高智商员工——指令越清晰、边界越明确,输出就越接近期望结果。

然而,这种高度依赖模型原生能力的交互范式也存在天然上限:
- 受上下文长度限制,难以承载复杂任务;
- 无法接入外部知识与实时信息;
- 更无法从根本上消除“幻觉”带来的不确定性与业务风险。
因此,单靠Prompt,并不足以支撑更复杂、更可靠的应用形态。
范式二:上下文工程(Context Engineering)—— 为大模型外接“专属知识中枢”
模型是基于上下文窗口来工作的,prompt只是其中的一部分。当任务从“问答”走向“执行”,问题的重心便从“如何提问”迁移为“如何组织上下文”。
这里的上下文,并不只是system prompt。凡是进入模型视野、影响其下一步决策的信息,都可以算作上下文,例如:
- 提示词
- 用户输入
- 工具定义
- 工具返回的结果
- 历史对话记录
- 检索出的知识片段
- 长短期记忆
- 当前任务状态
那么怎样才能有效地组织这些信息呢?显然不是简单地机械填充进来。

2.1 RAG:破解“模型不掌握的私有知识”
私域知识(如产品文档、内部规范、历史记录)通常远超上下文窗口,无法一次性输入模型,因此需要“先检索,再生成”。
RAG的核心价值在于:让检索结果贴合任务语义,而不仅仅是字面匹配。
比如搜索“苹果”,既可能命中“5元一斤的水果”,也可能命中“8000元的手机”,但真正有用的信息取决于当前任务的语境。

一个经典笑话是:女朋友说“我要买苹果,给我转点钱”,你转了100块,心想买20斤水果绰绰有余——然而她其实想买的是手机。
RAG的发展也经历了明显的观念起伏:
- 曾一度流行:“RAG解决一切”
- 随着上下文窗口扩大、微调能力增强,又出现了“RAG已死”的声音
但在实际应用中:
- 企业知识问答 / 内部文档检索 / 规范辅助 → RAG仍是关键
- 代码仓库导航 / 精确定位问题 → Grep、Glob、日志、Git等方式更加直接有效
这背后的本质并非RAG失效,而是:
不同任务需要不同的信息获取机制
一个典型的踩坑案例是调试Agent:
最初我们尝试对代码仓库做向量索引,用语义检索定位问题代码,召回率却很低。原因在于:
- 调试更依赖:
- 符号名
- 文件路径
- 调用链
- 日志关键词
- 历史改动记录
- 而非“语义相似性”
后来改为直接使用grep + 日志 + Git记录(甚至接入代码工具链),准确率明显上升。
结论一目了然:结构化问题 ≠ 语义检索问题
2.2 工具(Tools):解决“模型无法感知世界与执行动作”的困境
没有工具的LLM,本质上是一个“缸中之脑”:
- 不知道当前时间
- 不了解最新信息
- 无法执行任何实际操作
因此,必须通过工具扩展其能力边界:
- 获取时间 → 时间工具
- 获取外部信息 → 搜索 / API
- 执行操作 → 代码、系统、日志工具
工具机制也在持续演进:
- 正则解析输出 → 调用函数(早期方案,不稳定)
- Function Calling → 更结构化、更可靠
- MCP等协议 → 将工具能力从模型/客户端中解耦出来
但工具一多,也会带来新的麻烦:
- 工具描述占用大量上下文
- 工具选择错误导致执行成本上升
- 推理的复杂度随之增加
因此新的优化方向是:
按需加载能力(Skills)
将工具与经验封装起来,在必要时再暴露给模型,而不是一次性把所有能力都塞给它。
2.3 记忆(Memory):解决“模型没有持续状态”的难题
LLM天然是“无状态”的,每一轮对话默认都是全新的开始,但真实交互却并非如此。
最简单的方式是:
把历史对话一起塞回上下文
然而随着对话增长,会带来两个关键问题:
- 哪些信息应当保留?
- 哪些信息需要压缩或外置?
于是逐渐演化出:
- 短期记忆:支持连续对话
- 长期记忆:存储偏好、约束、历史决策
到了这个阶段,问题已不再是简单的“拼接上下文”,而是:
信息编排(Context Engineering)
2.4 为什么“只补上下文”做不好Agent?
即使解决了“模型能看到什么”,Agent依然可能不稳定,因为还缺少运行层的支撑能力:
- 是否会误用高风险工具(例如误操作导致系统不可用)
- 修改代码后如何验证正确性
- 失败后如何重试或回滚
- 何时停止并汇报(避免过度执行或提前结束)
- 如何记录可追溯的执行过程
范式三:驾驭工程(Harness Engineering)—— 迈向完全自主的通用智能体
如何理解Harness?
可以用一个非常形象的类比:
一个刚入职、经验丰富的工程师,为什么有人能稳定产出,有人却很快失控?
影响他的,往往不是“会不会写代码”,而是他的工作环境。
我们通常会给这样的工程师提供:
- 一台配置好的电脑(运行环境)
- 清晰的规则与权限(边界与约束)
- 必要的软件和工具(能力入口)
- 领域相关的知识与经验(隐性规则)
如果把一个能力不错的Agent看作“新入职工程师”,那么:
- Prompt → 任务说明
- Context → 你递给他的材料
- Harness → 他所处的工作环境
真正决定Agent能否稳定交付的,往往不是模型能力,而是这些“工程条件”:
- 有没有清晰的目标、边界和停止条件
- 有没有合适的权限和运行环境
- 有没有可用的工具与知识入口
- 有没有可观测的反馈信号
- 有没有可追溯的记录系统
Harness Engineering,本质上是在构建一个“能持续做事的闭环系统”
3.1 明确目标与停止条件
很多Agent的失控,不是因为“听不懂”,而是因为:
系统没有清晰定义什么叫“完成”,以及什么是“禁止动作”
例如在代码任务中,至少需要明确:
- 什么算任务完成(测试通过?功能上线?)
- 哪些目录 / 分支 / 环境禁止修改
- 失败后是继续尝试、回退,还是请求确认
- 哪些步骤必须先汇报再执行
这些约束看似不属于AI技术,但实际上:
它们直接决定了多步执行的稳定性
没有约束的Agent,会天然地倾向于“过度行动”。
3.2 显式化隐性知识
在实践中,Agent最常见的错误来源并非能力不足,而是:
不知道那些“人类默认但并未写下”的规则
比如“做一个新功能”,在团队中往往隐含着:
- 必须补齐哪些埋点
- 埋点字段的兼容要求
- UI改动需要同步哪些内容
- 哪个目录才是正式发布链路
对人类而言,这些都是“常识”;
对模型来说,如果没有被显式表达,就等于不存在。
问题的本质在于:
- 人类沟通高度依赖多模态(语气、上下文、经验)
- 信息密度极高,但并未被结构化表达
这时,Agent就会用“幻觉”去填补缺失的信息。
更好的方式是:
不要只给需求,而要给出“新人第一周会被口头交代的那些东西”
3.3 工具:少而通用,按需暴露
工具并非越多越好,过多工具会带来:
- 选择成本上升
- 工具描述占用大量上下文
更合理的设计思路是:
少量通用工具 + 按需扩展
典型的最小工具集:
- Read
- Write
- Grep
- Glob
- Bash
这种设计的核心思想是:
- 用少量原子能力覆盖大多数操作
- 将复杂能力下沉到CLI、脚本和现有工作流中
其中隐含的逻辑是:相信Agent足够智能,可以组合工具自行解决问题,而不是为每个动作设计专用接口。
3.4 提供可观测的反馈回路
没有反馈,Agent就无法形成稳定行为。它执行了一步操作,却不知道结果是否正确,下一步只能继续“猜测”。
在工程场景中,关键反馈包括:
- 测试结果
- lint / 类型检查(LSP)
- 运行日志
- 接口或页面真实输出
- 调试信息(浏览器、硬件、串口等)
很多人遇到Agent效果不理想,第一反应往往是:
- 改prompt
但如果系统没有暴露这些反馈信息:
- 再好的prompt,也无法替代观测能力
换句话说:
- 一个“不会看结果”的Agent,不可能进行稳定迭代
这也可以作为一个重要判断依据:
- 越依赖真实世界反馈的领域 → 越难被替代(如嵌入式)
- 越纯信息处理的领域 → 越容易被自动化(如部分前端开发)
3.5 构建可检索的记录系统(外部记忆)
上下文窗口是稀缺资源,但长任务天然需要大量信息辅助。
人类不会把所有细节全记在脑子里,而是:
将信息外化到文档、代码、日志和版本系统中
Agent也必须如此。
一个好的记录系统应当是“结构化 + 可检索”的,而不是:把所有知识塞进一个无限增长的Prompt。
更合理的分层方式:
- AGENTS.md → 规则、入口、知识地图
- docs/ → 领域文档、流程说明、排障记录
- git → 代码变化与历史决策
这样做的好处是:
- 上下文只保留当前最相关的信息
- 历史信息随时可以回溯与检索
从这个角度来看:
Git本身就是一种非常适合Agent的长期记忆系统
一个关键的实践经验
在长任务中,如果不强制Agent记录关键决策:
系统一定会逐渐“漂移”
一个有效的机制是:
- 实现前必须先产出设计文档
- 实现过程中如有变更,必须同步更新文档
- 后续任务开始前,必须先回看并引用该文档
这看起来只是“文档习惯”,但其本质是:
Harness的一部分(记忆稳定机制)
最终结论
在长期、多阶段任务中:
- 上下文窗口 → 只负责“当前思考”
- 真正的长期记忆 → 必须外置到系统中
Harness Engineering的本质
不是让模型“更聪明”,
而是让系统具备:
约束 + 能力 + 反馈 + 记忆的闭环
在约束中释放生产力

Prompt Engineering 解决的是如何把任务说清楚,Context Engineering 解决的是如何把关键信息摆到模型眼前,Harness Engineering 解决的是如何让模型在真实环境中稳定做事。
三者并不是谁替代谁,而是抽象层次一层层向外扩展。任务越接近真实生产环境,后两者的重要性就越高。
模型能力越来越强,它所需要更多的或许是“给其一个自由发挥的舞台”,人类的任务是协助它搭建这个舞台,而不是反过来——人类强烈干预它的行为,却不给予充分帮助。
如果你用了顶级模型,但vibe coding的效果仍不理想,大概率不是模型不够聪明,而是尚未为模型提供一个足够完善的运行环境,从而未能让其能力充分释放。
回顾这三次范式跃迁,其底层逻辑是一场人类对AI控制权“收放自如”的演进。从最初小心翼翼推敲对话提示词,到系统性地投喂结构化上下文,再到如今搭建底层框架让多智能体自主规划与执行,每一次迭代都在进一步将大模型的黑盒能力转化为工程上的确定性。
对于身处这场技术洪流中的开发者而言,仅仅探索对话技巧已远远不够。真正的价值在于拥抱最新的驾驭工程理念,深入研究智能体架构与业务工作流的融合方式,并在日常的开发分支与项目迭代中,将这些前沿理念落地为稳定可靠的系统架构。未来的软件工程,必将是人类开发者与通用智能体深度协同的全新纪元。