别再死磕 Prompt 了!上下文工程 (Context Engineering) 的简单学习

导语

大家好,我是你们的老朋友。最近在和很多初中级开发同学交流时发现,大家一提到 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(脱离工程约束)。
  • 可能是完全不符合大学生口味的"养生枸杞茶"(脱离背景约束)。

它解决了什么具体问题?

  1. 解决幻觉问题 :通过 constraints 注入事实边界,让 AI 在围栏内跳舞。
  2. 解决工程对接问题 :通过 outputRequirements 强制 JSON 输出,让 AI 从"聊天机器人"变成"微服务 API"。
  3. 解决知识滞后问题 :这就是 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 架构中,如何保证大模型输出的可靠性?

精炼回答

主要靠三层防护:

  1. 输入端:通过上下文工程(Context Engineering),用结构化的 System Prompt 明确背景和强约束(如成本限制),从源头减少幻觉。
  2. 模型端:针对结构化输出任务,调低 Temperature 参数,降低随机性。
  3. 输出端:采用防御性编程,对 AI 返回的结果进行 JSON Schema 校验和异常捕获,不信任任何未经代码验证的 AI 输出。

3. 问:RAG 和上下文工程是什么关系?

精炼回答

RAG(检索增强生成)是上下文工程最高阶、最典型的应用场景之一。上下文工程是方法论(如何解构、注入、约束),而 RAG 是具体的技术手段(通过向量检索把静态/动态资料变成上下文)。

相关推荐
用户34232323763172 小时前
定时器与 PWM 输出详解
后端
Jason_chen3 小时前
Linux 6.2 CAN/CANFD机制详解
后端
Apifox3 小时前
Apifox 6 月更新|Apifox CLI 全面升级、导入导出优化、OAuth 2.0 支持自动刷新令牌
前端·后端·测试
悟空瞎说3 小时前
NestJS 接口设计避坑:摒弃万能用户更新接口,落地单一职责与最小权限原则
后端·nestjs
smallyoung4 小时前
Spring AI 2.0 VectorStore实战:从原理到RAG落地
人工智能·后端
jiayou644 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
青丘4 小时前
Spring AI整合Milvus向量数据库实战
后端
古茗前端团队5 小时前
急招!前端|测试|后端|产品(名额多,速来)
前端·后端·架构