前言
或许你也有过这样的时刻:在代码评审会议上,同事用 AI 助手几分钟就重构了一个你花了几天才完成的微服务架构;又或者,在日常开发中,你发现团队里的新人正在用 AI 编程助手,轻松地处理那些曾经需要反复查阅文档和调试的复杂任务。我们曾经坚信的“代码即真理”的世界,正在被一种更模糊、更接近对话的逻辑所渗透。我们还没来得及完全掌握“提示工程”的要领,**“上下文工程”**这个更宏大的概念,已经开始在 AI 的社区里引发讨论。
然而,当一个新概念如潮水般涌来,将旧的拍在沙滩上时,我们心中难免会升起一丝疑虑与不安。这究竟是一场由少数精英设计的“新瓶装旧酒”的文字游戏,还是一场真正触及我们工作核心的根本性变革?对于习惯了代码的确定性与逻辑的工程师而言,这种转变尤为深刻。软件工程师的角色,正在从用精确指令建造系统的建筑师,转变为用启发式信息引导不确定性智能的乐队指挥。这种从控制到引导的转变,不仅是技能的更迭,更是思维方式的巨大挑战。
所以,面对这个新物种,你我这样的工程师,该如何看清它与我们熟悉的软件工程之间那若即若离的血缘关系?我们该如何校准自己的位置,才不至于被这场智能革命甩下车?
焦虑解决不了问题,让我们一起拨开上下文工程的层层迷雾,并在此过程中重新审视“创造”的定义。如果一个系统的大部分行为不是由我们的精确指令决定,而是由我们提供的“环境”所“涌现”,那么,我们的价值是什么?
究竟什么是上下文工程?
我们先来看看这个概念是怎么出现的。一切始于 Shopify CEO Tobi Lütke 的一条推文:
我真的很喜欢“上下文工程”这个术语,而不是提示工程。 它更好地描述了核心技能:为 LLM 能够合理解决的任务提供所有背景的艺术。
Andrej Karpathy 紧接着转发并给出了更详尽的解读:
“上下文工程”优于”提示工程”+1。 人们通常会把提示工程理解为在日常使用中给 LLM 的简短任务描述。而在每个工业级的 LLM 应用中,上下文工程是一门精妙的艺术和科学,它需要用恰到好处的信息填充上下文窗口,为下一步操作做准备。之所以说是科学,是因为要正确地做到这一点,需要任务描述和解释、少量样例(few shot)、RAG、相关的(可能是多模态的)数据、工具、状态和历史记录、压缩等等。如果信息太少或形式不对,LLM 就无法获得最佳性能所需的正确上下文;如果信息太多或太不相关,LLM 的成本可能会上升,性能可能会下降。要做好这件事绝非易事。之所以说是艺术,是因为它需要对 LLM 的”心理学”有直观的理解。 除了上下文工程本身,LLM 应用还必须: 将问题恰当地分解为控制流 恰当地打包上下文窗口 向合适类型和能力的 LLM 发出调用 处理生成-验证的用户界面流程 更多其他方面 - 包括护栏、安全、评估、并行处理、预取等等 因此,上下文工程只是新兴的、重要的软件层中的一小部分,这个软件层负责将单个 LLM 调用(以及更多功能)协调成完整的 LLM 应用。把这些简单地称为”ChatGPT 包装器”是过时且完全错误的说法。
Karpathy 的话点明了核心:上下文工程远不止是写提示词,它是为 AI 构建一个完整、高效的信息环境。
其实,这个观念的转变几乎是水到渠成的。自从 ChatGPT 出现,我们就意识到,面对无状态的模型,上下文就是一切。我们一路走来,从最初钻研提示词的“提示工程”,到后来借助各类工具探索人机协作的“氛围编程”(vibe coding),再到今天,我们终于为这套系统性的实践找到了一个精准的名字:上下文工程。
它不是一个新造的词,而是对我们当前最佳实践的总结。它要求我们用系统化思维,将以下几个方面整合起来:
- 动态信息检索:AI 不能只靠自带的知识,它需要像人一样能随时“查资料”。我们得教会它从知识库、API 或实时数据中精准地调取信息。
- 记忆管理:为了让对话能持续,我们需要为 AI 设计记忆机制,帮它记住用户偏好、总结历史对话,并在恰当的时候回忆起来。
- 工具集成:AI 也需要“双手”来执行任务。我们要确保它能熟练地使用代码执行、数据库查询等外部工具。
- 指令编排:在复杂的工作流中,如何组织指令、范例和上下文的呈现顺序,直接决定了 AI 能否理解并完成任务。
简单来说,上下文工程就是一门为 AI “营造情境”的学问,一门精妙的艺术与科学。
继承与演进:从软件工程到上下文工程
你可能会觉得这听起来有些颠覆,但如果我告诉你,上下文工程的内核其实与你熟悉的软件工程一脉相承,你会怎么想?
所有工程学的本质,都是通过可控的输入(信息),在一个我们不完全理解的复杂实体(系统)中,换取期望的输出(行为)。无论是用代码构建软件,还是用上下文引导 AI,我们都在做同一件事。
不信?你看这几个相似之处:
-
问题分解与组合:
-
在软件工程中,你会将复杂问题分解成独立的函数和模块。比如一个支付系统,会被分解为账户验证、余额检查、交易执行、通知发送等模块,每个模块都有明确的输入输出契约。
-
在上下文工程里,我们同样在做”分解与组合”,但对象变成了认知任务。比如处理”总结这份财报”这个任务时,我们会将其分解为:理解财务术语、提取关键数据、分析趋势、生成摘要等子任务。每个子任务都需要特定的上下文支持(专业词典、计算工具、分析模板等)。
-
可靠性保障:
-
在软件工程中,我们通过分层防御确保系统可靠:代码审查捕获逻辑错误,单元测试验证功能正确性,集成测试确保模块协同,监控系统及时发现异常。
-
在上下文工程里,我们建立了类似的多层防护网:输入验证确保提示合规,事实核查防止幻觉产生,输出过滤屏蔽敏感信息,结果评估确保答案质量。这不是简单的对错判断,而是在概率空间中建立可靠性保障。
-
模块复用:
-
在软件工程中,我们通过设计模式、组件库、代码模板来复用已经验证过的解决方案,避免重复造轮子。
-
在上下文工程里,我们同样重视复用,但复用的是”认知模式”:精心设计的提示模板、验证过的上下文组织方式、有效的few-shot示例等。这些都是可以跨任务、跨领域复用的知识资产。
看到这里,你应该明白了:上下文工程并非颠覆,而是软件工程的自然演进。 它将我们早已熟知的工程原则,应用到了一个以 AI 为核心的新场景。其最显著的特征,就是将“为 AI 构建和优化信息环境”作为了新的核心任务。
过去,我们为人类设计 GUI,是“人类的翻译”,把机器逻辑翻译成直观的视觉语言。如今,我们为 AI 准备 CLI,因为文本才是 AI 的母语,清晰、结构化的文本是与它最高效的沟通方式。我们成了“AI 的编剧”。
根本区别:建筑师 vs. 乐队指挥
尽管有千丝万缕的联系,但两者面对的“智能”截然不同,这也导致了它们在实践中的根本差异。
软件工程面对的是确定性的“机械智能”,由我们从零构建,完全按代码逻辑运转。而上下文工程面对的是概率性的“涌现智能”,其内部运作对我们来说仍是黑箱。
这个差异,带来了工程师角色的转变:
-
工程角色:建筑师 vs. 乐队指挥
-
在软件工程中,你像一个建筑师,用代码(砖块)按照精确的蓝图建造大厦,你对系统有绝对的控制权。
-
在上下文工程中,你更像一个乐队指挥。你无法改变乐手(LLM)的演奏习惯(模型权重),只能通过精准的提示和手势(上下文),来启发和协调整个乐团,引导它们合奏出动人的乐章。
-
工程手段:精确指令 vs. 概率诱导
-
在软件工程中,代码即法律,输入 A 必然得到 B。
-
在上下文工程中,上下文是线索,而非指令。你提供的一切都是为了调整模型内部的概率分布,让它“更想”生成你期望的结果。输入 A,你只能说“大概率”得到 B。这更像是说服,而非命令。
-
思维方式:演绎推理 vs. 经验归纳
-
软件工程是自上而下的演绎推理,从需求出发,通过严密的逻辑推导出整个系统。
-
上下文工程则是自下而上的经验归纳。你像个科学家,先提出假设(这个上下文能出好结果),然后通过大量实验来验证或证伪。洞察力和实验设计能力至关重要。
-
价值核心:创造逻辑 vs. 资源调度
-
软件工程的核心价值是创造和维护逻辑,产出是代码资产。
-
上下文工程的核心价值在于高效调度信息。我们从编写业务代码中解放出来,转而构建一个服务于 LLM 的信息调度系统。这个系统本身不产出答案,但它确保 LLM 能产出好答案。
总结
所以,回到我们最初的问题。上下文工程与软件工程之间那若即若离的血缘关系,现在已经清晰:它不是颠覆,而是我们工程思维在AI时代的自然演进与升华。我们工程师的定位,也不再是代码的堆砌者,而是智能的引导者。
我们不再仅仅是那个用精确指令建造系统、追求确定性的建筑师。如今,我们手握的不再只是键盘,更是一根无形的指挥棒。我们成为了用启发式信息引导不确定性智能的乐队指挥,在人与AI的协同演奏中,去交付“被唤醒”的智能,而不是“被完成”的软件。这不是对工程师价值的挑战,而是我们价值升维的机遇。
在不远的未来,我们的技术方案将不再是“这个功能应该用什么架构和算法来实现?”,而是“为了让 AI 实现这个功能,你会为AI设计一个怎样的信息供给策略?”