1. 项目概述:智能客服中的上下文工程实战
在电商客服场景中,订单查询是最基础也最频繁的需求之一。传统的关键词匹配式客服系统经常让用户陷入"问题描述→转人工→重新描述"的死循环。我们团队最近为某跨境电商平台实施的智能客服系统,通过上下文工程技术将订单查询准确率从62%提升到89%,平均处理时间缩短40%。
这个项目的核心突破点在于:当用户询问"我那件黑色T恤发货了吗"时,系统能自动关联用户历史订单、当前会话上下文和业务规则(如只查询完成状态的订单),而不需要用户反复提供订单编号或商品信息。下面我将分享从需求分析到工程落地的完整过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心技术架构设计
2.1 上下文分层管理模型
我们采用四级上下文结构,每层采用不同的管理策略:
| 层级 | 内容类型 | 管理策略 | 示例 | 保留时长 |
|---|---|---|---|---|
| 系统层 | 身份定义/业务规则 | KV缓存固定 | "你是XX电商客服,优先使用订单号查询..." | 永久 |
| 会话层 | 用户画像/当前任务 | 动态注入+钉住 | "用户张三是VIP会员,本次咨询物流问题" | 当前会话 |
| 记忆层 | 历史对话片段 | 滑动窗口+摘要 | "5分钟前确认过订单E123456状态" | 最近3轮 |
| 知识层 | 订单数据/政策文档 | RAG按需检索 | "订单E123456: 黑色T恤, 已发货" | 单次查询 |
2.2 关键组件交互流程
- 请求接入层:接收用户原始query(如"我的T恤到哪了")
- 上下文组装引擎:
- 固定部分:加载预编译的system prompt(含客服行为规范)
- 动态部分:注入用户画像、最近对话摘要
- 检索部分:通过订单号提取器获取候选订单
- LLM处理层:生成结构化查询语句
- 数据验证层:确保只查询符合条件(状态=完成)的订单
- 响应生成层:组合查询结果与自然语言模板
关键设计原则:系统层内容要足够精简(控制在800token内),为动态内容留出空间。我们实测发现当system prompt超过1500token时,模型对后续注入内容的注意力会显著下降。
3. 订单查询的上下文工程实现
3.1 订单关联的三种策略
策略A:显式订单号匹配
python复制def extract_order_id(text):
# 匹配E+8位数字的模式
pattern = r'E\d{8}'
return re.findall(pattern, text) or []
策略B:商品特征检索
当用户说"黑色T恤"时:
- 通过用户ID获取最近10笔订单
- 用商品标题生成embedding
- 计算与query的余弦相似度
策略C:对话状态跟踪
维护一个对话状态机:
mermaid复制graph TD
A[收到查询] --> B{含订单号?}
B -->|是| C[直接查询]
B -->|否| D[请求补充信息]
D --> E{提供商品特征?}
E -->|是| F[模糊查询]
E -->|否| G[列出最近3单]
3.2 动态上下文注入示例
这是我们的实际上下文组装代码片段:
python复制def build_order_context(user_query, user_id):
context = []
# 系统层(KV缓存优化)
context.append(SYSTEM_PROMPT)
# 会话层(钉住关键信息)
context.append(f"用户ID:{user_id} 会员等级:{get_user_level(user_id)}")
# 记忆层(滑动窗口)
last_chats = get_recent_chats(user_id, limit=3)
context.extend([f"上次对话:{chat}" for chat in last_chats])
# 知识层(RAG检索)
if "订单" in user_query:
orders = search_orders(user_query, user_id)
context.append(f"相关订单:{json.dumps(orders)}")
return "\n".join(context)
4. 性能优化与效果验证
4.1 成本控制方案
我们采用三种成本优化手段:
- 前缀缓存:将650token的system prompt编译为缓存键,相同会话中复用
- 对话摘要:将历史对话压缩为"用户咨询物流问题,已确认订单E123"的形式
- 条件触发:仅当query包含特定关键词时才触发订单检索
实测数据对比:
| 优化手段 | Token消耗 | 响应时间 | 准确率 |
|---|---|---|---|
| 原始方案 | 3200 | 4.2s | 62% |
| 优化方案 | 1800 | 2.7s | 89% |
4.2 典型问题处理实录
案例1:模糊查询
用户问:"我买的那件衣服发货了吗"
处理流程:
- 检索用户最近3单含"衣服"的商品
- 自动排除未支付订单
- 当找到唯一匹配时直接返回结果
- 多匹配时生成选项列表
案例2:状态过滤
用户问:"为什么我的T恤还没到"
系统行为:
- 只查询状态为"已发货"的订单
- 自动关联物流单号
- 忽略已完成/已退货的订单
5. 工程实践中的经验总结
-
上下文压缩技巧:
- 用"用户咨询物流问题(涉及订单E123)"替代完整对话历史
- 将商品特征编码为"颜色=黑,品类=T恤"的结构化数据
-
错误预防机制:
python复制def validate_order(order): # 确保只处理完成状态的订单 if order['status'] != 'completed': raise IgnoreOrder # 验证商品名称包含"T恤" if 'T恤' not in order['items'][0]['name']: raise NotMatch -
效果监控指标:
- 上下文命中率:85%的查询能关联到正确订单
- 人工介入率:从38%降至11%
- 平均对话轮次:2.7轮→1.4轮
这个项目的关键收获是:在有限上下文窗口内,通过分层管理+动态装载,可以实现比单纯扩大模型窗口更好的效果。我们现在正在将这套架构扩展到退货处理、优惠咨询等更多客服场景。
