导语 :
大家好,我是你们的老朋友。最近在和很多初中级开发同学交流时发现,大家一提到 AI 落地,第一反应还是"怎么写一个完美的 Prompt"。但现实往往是:Prompt 写得再花哨,AI 依然会"一本正经地胡说八道"。
为什么?因为大模型不是魔法,它是基于概率预测的 Transformer。从 2024 年开始,业界已经悄然从 Prompt Engineering(提示词工程) 演进到了 Context Engineering(上下文工程) 。今天,我们就用一段"奶茶店研发"的 Node.js 代码,带大家彻底搞懂:如何像架构师一样,为 AI 搭建一个靠谱的工程化上下文。
一、 核心概念:什么是"上下文工程"?
如果把大模型比作一匹千里马(比如现在的 Claude 4、Gemini 3),那么 Prompt 只是你喊出的一声"驾!" ,而 Context Engineering(上下文工程)则是给马配上的马鞍、缰绳和导航仪(Harness Engineering) 。
在提供的代码中,我们并没有写一句诸如"你是一个天才,请帮我..."的废话,而是将任务解构为结构化的数据:
javascript
编辑
less
// 核心思想:上下文的解构化
const context = {
// 1. 需求背景:你是谁?做这件事的目的是什么?
background: '你是大学附近的奶茶店的老板,客户多是17-22岁学生,客单价15-20元',
// 2. 约束条件:相关事实,限制条件(防幻觉的护栏)
constraints: '夏季要清爽, 成本控制在8元内',
// 3. 输出要求:要颜值高(适合拍照发朋友圈),请输出JSON格式...
outputRequirements: `...`
}
设计初衷 :大模型的预训练知识是"静态"的,而我们的业务需求是"动态"的。上下文工程的核心,就是通过代码将动态的业务资料、约束条件注入到 Prompt 中,让 AI 在回答前"先查阅资料,再作答",从而大幅降低幻觉,实现确定性交付。
二、 痛点与场景:为什么我们需要它?
在实际业务中,如果你只给 AI 一句 帮我设计一款夏季奶茶,你会得到什么?
- 可能是成本 50 元的顶级原料(脱离业务约束)。
- 可能是长篇大论的散文,而不是后端能直接解析的 JSON(脱离工程约束)。
- 可能是完全不符合大学生口味的"养生枸杞茶"(脱离背景约束)。
它解决了什么具体问题?
- 解决幻觉问题 :通过
constraints注入事实边界,让 AI 在围栏内跳舞。 - 解决工程对接问题 :通过
outputRequirements强制 JSON 输出,让 AI 从"聊天机器人"变成"微服务 API"。 - 解决知识滞后问题 :这就是 RAG(检索增强生成)的雏形。未来的订单服务、法律专家系统,都是把数据库里的动态数据作为
context传给 AI。
三、 重难点剖析(核心干货)
难点 1:上下文的"解构化"与"结构化"组装
设计者为什么这么写?
新手写 Prompt 喜欢写一大段自然语言,但 LLM 对结构化标签的注意力机制(Attention)更好。代码中将背景、约束、输出要求拆分为独立的变量,最后通过模板字符串拼接:
javascript
编辑
javascript
const systemPrompt = `
你是一个专业的饮品专家,请根据上下文信息完成任务。
【背景】 ${context.background}
【约束】 ${context.constraints}
【输出要求】 ${context.outputRequirements}
`
如何攻克/理解?
把 System Prompt 当作一份 "API 接口文档" 来写。用 【】 这种明确的 Markdown 标签做物理隔离,大模型在解析时能精准定位到"约束"和"背景"的边界,不会把客单价和成本搞混。
难点 2:AI 调用的"防御性编程"与容错机制
设计者为什么这么写?
大模型是概率模型,它永远可能出错 。代码中嵌套了两层 try...catch:
javascript
编辑
javascript
try {
// 1. 第一层容错:网络/API 级别的容错
const completion = await client.chat.completions.create({...});
const aiResponse = completion.choices[0].message.content;
try {
// 2. 第二层容错:业务/数据解析级别的容错
// 即使 API 调用成功,AI 也可能返回带有 markdown 标记的 JSON,导致直接 parse 失败
const jsonData = JSON.parse(aiResponse);
console.log('成功解析为JSON 对象', jsonData);
} catch (error) {
console.log('解析JSON 失败'); // 实际工程中这里应该触发重试或降级
}
} catch (error) {
console.log(error.message); // 捕获 apiKey 错误、限流、超时等
}
如何攻克/理解?
记住一句话:不要信任大模型的输出格式。在工程化落地(FDE)中,AI 只是流水线上的一个"黑盒节点"。必须用传统的软件工程思维(异常捕获、重试机制、格式校验)去兜底。
四、 避坑指南与最佳实践
基于这段代码和当前 AI 工程化的趋势,新手极易踩以下坑:
表格
| 常见踩坑 | 错误示范 | 最佳实践(正确示范) |
|---|---|---|
| Prompt 揉成一团 | 你是一个奶茶店老板,成本8元内,客单价15-20,给我个json |
使用代码中的解构化思想,将背景、约束、输出格式分块,用结构化标签包裹。 |
| 盲目信任 JSON | 直接 JSON.parse(aiResponse) 不做任何处理 |
AI 经常返回 json ... |
解析前必须用正则清洗,或使用 zod / valibot 等库进行 Schema 校验。 |
||
| Temperature 乱设 | 写业务逻辑/JSON 生成时 temperature: 1.0 |
需要确定性输出(如代码、JSON、事实问答)时,将 temperature 调低(0.1 - 0.3) ;只有纯创意发散时才调高(0.7+)。 |
| 忽视上下文长度 | 把整个代码库/文档全塞进 Prompt | 遵循"上下文工程"原则,只检索最相关的片段注入。Token 就是钱,也是注意力瓶颈。 |
五、 面试高频考点
如果你在面试中遇到 AI 落地或架构设计相关的问题,这段代码背后的原理可以直接拿来当弹药:
1. 问:Prompt Engineering 和 Context Engineering 有什么本质区别?
精炼回答 :
Prompt Engineering 侧重于"如何向 AI 提问",依赖语言技巧,结果具有不确定性;而 Context Engineering 侧重于"为 AI 构建工作环境",通过代码将动态业务数据、约束条件、外部工具(MCP/Skills)结构化地注入给 AI。它是从"写提示词"到"软件工程化"的升级,是解决大模型幻觉、实现企业级确定性交付的核心。
2. 问:在你的 AI 架构中,如何保证大模型输出的可靠性?
精炼回答 :
主要靠三层防护:
- 输入端:通过上下文工程(Context Engineering),用结构化的 System Prompt 明确背景和强约束(如成本限制),从源头减少幻觉。
- 模型端:针对结构化输出任务,调低 Temperature 参数,降低随机性。
- 输出端:采用防御性编程,对 AI 返回的结果进行 JSON Schema 校验和异常捕获,不信任任何未经代码验证的 AI 输出。
3. 问:RAG 和上下文工程是什么关系?
精炼回答 :
RAG(检索增强生成)是上下文工程最高阶、最典型的应用场景之一。上下文工程是方法论(如何解构、注入、约束),而 RAG 是具体的技术手段(通过向量检索把静态/动态资料变成上下文)。