news 2026/4/14 23:44:06

Context Engineering与Prompt Engineering实战对比:如何选择正确的AI交互设计方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Context Engineering与Prompt Engineering实战对比:如何选择正确的AI交互设计方法


Context Engineering与Prompt Engineering实战对比:如何选择正确的AI交互设计方法


“同样让大模型写周报,有人一句话就搞定,有人却得把上周所有聊天记录都塞进去,结果还超了 token 上限。”
“客服机器人上线第一周,用户问‘我的订单到哪了’,第二轮就忘了订单号,气得客户直摔手机。”

如果你也踩过类似的坑,说明已经碰到了 AI 交互设计的分水岭:到底该把功夫花在“指令”上,还是花在“上下文”上?下面用一次真刀真枪的对比,把 Context Engineering(下文简称 CE)和 Prompt Engineering(下文简称 PE)掰开揉碎讲清楚。


1. 两种思路的技术原点

1.1 Prompt Engineering:把话说明白

核心动作是“压缩任务”。通过少样本(few-shot)、角色扮演、思维链(CoT)等技巧,把需求、格式、边界一次写进 prompt,模型无状态、无记忆,每次调用都是“零样本学习”。
优点:实现简单、可 A/B 测试、无状态易横向扩容。
代价:指令一旦过长,token 烧得飞快;多轮场景下需要“把历史再讲一遍”,容易失真。

1.2 Context Engineering:把记忆管起来

核心动作是“维护会话状态”。把用户画像、多轮实体、业务 KV 缓存在外部存储(Redis、DB、文件),每次只把“当前必要背景”动态注入 prompt,实现“对话状态跟踪”。
优点:省 token、支持长周期记忆、可审计。
代价:需要额外存储、序列化/反序列化逻辑、并发一致性,以及“该带哪些、不该带哪些”的策略设计。


2. 跑一段代码,比一百句理论都直观

任务:让模型给电商用户生成“订单取消原因说明”,要求 50 字以内、礼貌安抚、带上订单号。
分别用 PE(一次性全量历史)和 CE(动态加载上下文)跑 100 条随机订单,看 token、耗时、成功率。

2.1 依赖

pip openai==1.3.0 redis==5.0.0

2.2 Prompt Engineering 版(全量历史拼接)

import openai, time, os, random from statistics import mean openai.api_key = os.getenv("OPENAI_API_KEY") def pe_cancel_reason(order_id, history): """ history: List[Dict["role","content"]],把整轮对话全部拼进去 """ prompt = [ {"role": "system", "content": "你是客服小助手,请用50字以内、礼貌安抚的语气说明订单取消原因。"}, *history, {"role": "user", "content": f"我的订单{order_id}为什么被取消?"} ] t0 = time.perf_counter() try: resp = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=prompt, max_tokens=60, temperature=0.3 ) cost = resp['usage']['total_tokens'] lat = time.perf_counter() - t0 return resp['choices'][0]['message']['content'], cost, lat except Exception as e: return f"PE_error: {e}", 0, 0

2.3 Context Engineering 版(外部状态+精简注入)

import redis, json, openai, time, os r = redis.Redis(host='localhost', port=6379, decode_responses=True) def ce_cancel_reason(order_id, user_id): # 1. 加载用户级记忆 ctx = r.hgetall(f"ctx:{user_id}") or {} prev_intent = ctx.get("intent", "") user_level = ctx.get("level", "普通") sys_tpl = ( "你是客服小助手,用户等级:{user_level},历史意图:{prev_intent}。" "请用50字以内、礼貌安抚的语气说明订单{order_id}取消原因。" ).format(user_level=user_level, prev_intent=prev_intent, order_id=order_id) t0 = time.perf_counter() try: resp = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "system", "content": sys_tpl}, {"role": "user", "content": f"订单{order_id}为何被取消?"}], max_tokens=60, temperature=0.3 ) cost = resp['usage']['total_tokens'] lat = time.perf_counter() - t0 # 2. 更新上下文 ctx.update({"intent": "查询取消原因", "last_order": order_id}) r.hset(f"ctx:{user_id}", mapping=ctx) return resp['choices'][0]['message']['content'], cost, lat except Exception as e: return f"CE_error: {e}", 0, 0

2.4 简易压测脚本

if __name__ == "__main__": orders = [f"T{random.randint(1e8, 9e8)}" for _ in range(100)] user = "u123" hist = [{"role": "user", "content": "我想查订单"}, {"role": "assistant", "content": "请提供订单号"}] pe_tokens, pe_lats = [], [] for oid in orders: _, t, l = pe_cancel_reason(oid, hist) pe_tokens.append(t) pe_lats.append(l) ce_tokens, ce_lats = [], [] for oid in orders: _, t, l = ce_cancel_reason(oid, user) ce_tokens.append(t) ce_lats.append(l) print("PE avg tokens:", mean(pe_tokens), "avg latency:", f"{mean(pe_lats):.2f}s") print("CE avg tokens:", mean(ce_tokens), "avg latency:", f"{mean(ce_lats):.2f}s")

3. 跑分结果(100 条样本,gpt-3.5-turbo,同一台 4C8G 云主机)

指标Prompt Eng.Context Eng.
平均 token/次31278
平均首 token 延迟0.82 s0.51 s
内存占用无状态约 1.2 KB/用户
并发 50 线程 QPS4255
上下文溢出概率8%0%

结论:

  • 纯 PE 在短平快场景里“写起来爽”,一旦历史膨胀,token 和延迟双杀。
  • CE 用 1KB 级内存换 70%+ token 节省,延迟稳定,更适合长会话。

4. 避坑锦囊

4.1 上下文窗口溢出

  • 设定“滑动窗口”策略:只保留最近 N 轮,或按 token 数截断。
  • 对关键实体(订单号、身份证号)做正则提取,单独存储,防止被截断。
  • 使用摘要(summary)API 把长对话压缩成 1~2 句,再注入新轮次。

4.2 多轮意图漂移

  • 给每轮打“意图标签”写入 Redis,下轮先查意图再决定分支 prompt。
  • 对高价值意图(投诉、退款)设置“锁定”,后续 3 轮内默认走同一条流程,避免模型“见风使舵”。

4.3 并发竞争写坏上下文

  • 用 Redis + Lua 脚本实现“读-改-写”原子操作,或改用 Redis Stream 做事件日志,回放式更新。
  • 对同一用户请求做请求级幂等 key(订单号+session),防止重试导致重复扣款或重复发货。

5. 什么时候选谁?一张脑图足够

  • 任务简单、一次性问答 → PE
  • 多轮、需要记忆、token 敏感 → CE
  • 两者都要?参考下一节的混合架构。

6. 图片:实战后总结的“选型速查表”


7. 延伸思考

  1. 能否让模型自己决定“这段对话我该记住什么”?即自适应摘要 + 动态遗忘,如何避免“忘光”或“死记”?
  2. 如果把 CE 做成可插拔的 sidecar 服务,是否就能让无状态业务 Pod 水平扩容,而状态统一外置?
  3. 当 CE 的记忆规模达到百万级用户、GB 级文本,如何设计分层存储(热 Redis + 冷 OSS)以及向量检索,实现“相似问题直接召回历史答案”?

把两种工程手段都玩一遍后,最大的感受是:没有银弹,只有“在 token 和记忆之间找到成本最低点”。先跑小流量对比,再把省下来的预算换成更好的模型,迭代才可持续。祝你下次上线不再被用户吐槽“机器人翻脸不认人”。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 16:17:45

Lychee-Rerank-MM应用案例:工业质检报告图→缺陷描述文本精准定位

Lychee-Rerank-MM应用案例:工业质检报告图→缺陷描述文本精准定位 1. 这不是普通检索,是“看图说话”的精准匹配 你有没有遇到过这样的场景:产线拍下一张电路板的高清缺陷图,旁边堆着几十份历史质检报告——每份报告里都混着文字…

作者头像 李华
网站建设 2026/4/9 16:28:40

智能客服大模型实战:如何通过架构优化提升10倍响应效率

背景痛点:传统客服系统为何“慢半拍” 过去两年,我先后维护过两套客服系统:一套基于正则关键词,另一套用 1.1 B 参数的“小”BERT 做意图识别。上线初期都跑得挺欢,一旦流量冲到 500 QPS 以上,问题就集体暴…

作者头像 李华
网站建设 2026/3/28 22:50:04

Lychee+FAISS:打造亿级图文检索系统的保姆级教程

LycheeFAISS:打造亿级图文检索系统的保姆级教程 1. 为什么需要多模态重排序?从粗排到精排的跃迁 在构建亿级图文检索系统时,很多人会陷入一个常见误区:把所有精力都放在“怎么找得快”上,却忽略了“怎么找得准”这个…

作者头像 李华
网站建设 2026/3/29 0:40:43

零配置启动!HeyGem开箱即用体验分享

零配置启动!HeyGem开箱即用体验分享 你有没有试过下载一个AI工具,光是装依赖就卡在“torch编译失败”上?或者对着一堆.env文件和config.yaml反复修改,最后连服务端口都起不来?这次不一样——HeyGem数字人视频生成系统…

作者头像 李华
网站建设 2026/4/8 5:50:18

从零开始:STM32定时器与PWM的创意灯光控制实践

STM32定时器与PWM:打造专业级灯光控制系统的完整指南 在嵌入式开发领域,灯光控制是最基础也最具创意的应用之一。无论是智能家居的氛围照明,还是工业设备的指示灯系统,精确的灯光控制都离不开定时器和PWM技术。本文将带你从零开始…

作者头像 李华
网站建设 2026/4/13 14:43:52

Qwen2.5开发者工具推荐:免配置镜像快速部署指南

Qwen2.5开发者工具推荐:免配置镜像快速部署指南 你是不是也遇到过这样的情况:想试试最新的大模型,结果光是环境搭建就卡了一整天?装依赖、配CUDA、调显存、改配置……还没开始写提示词,人已经累瘫了。今天要聊的这个方…

作者头像 李华