共计 1913 个字符,预计需要花费 5 分钟才能阅读完成。
从客服对话崩溃说起
上周调试电商客服机器人时遇到典型场景:用户先问 ” 这件红色 T 恤有货吗?”,得到肯定答复后继续问 ” 那 M 码呢?”,结果系统竟要求重新确认商品类型——这就是典型的上下文丢失(Context Loss)。这种反人类的交互体验背后,是缺乏有效的上下文工程(Context Engineering)设计。

技术选型:三套解决方案对比
- 有限状态机(Finite State Machine)
- 适用场景:预定流程的简单对话(如电话菜单)
- 优势:确定性状态跳转,调试直观
-
劣势:状态爆炸问题(N 个话题需要 N²个转移规则)
-
RNN/LSTM 时序模型
- 适用场景:短时依赖的连续对话(3- 5 轮)
- 优势:自动学习上下文关联
-
劣势:长距离依赖衰减(超过 10 轮准确率骤降)
-
Transformer 架构
- 适用场景:多话题交错的长对话
- 优势:Attention 机制直接建模任意位置依赖
- 劣势:计算复杂度 O(n²) 带来的性能挑战
Python 实现:滑动上下文窗口
from collections import deque
class ContextWindow:
"""
实现滑动窗口的上下文管理器
时间复杂度:O(1) 入队 / 出队操作
空间复杂度:O(n) n 为窗口大小
"""
def __init__(self, max_size=5):
self.window = deque(maxlen=max_size) # 固定长度双端队列
def add_utterance(self, role: str, content: str):
"""添加对话语句并自动淘汰旧内容"""
self.window.append({"role": role, "content": content})
def get_context(self) -> list:
"""获取当前完整上下文"""
return list(self.window)
# 使用示例
ctx = ContextWindow(3) # 保留最近 3 轮对话
ctx.add_utterance("user", "红色 T 恤有货吗?")
ctx.add_utterance("bot", "查询中...")
ctx.add_utterance("bot", "有现货")
print(ctx.get_context()) # 完整上下文
对话状态树设计
@startuml
state "初始状态" as init
state "商品查询" as query
state "尺码确认" as size
state "库存检查" as stock
init --> query : 用户提及商品
query --> size : 用户询问具体尺码
size --> stock : 确认尺码有效性
stock --> query : 返回库存状态
@enduml
性能优化实战技巧
内存管理三原则
- LRU 缓存淘汰 :最近最少使用的上下文优先移除
- 实体压缩 :将 ” 用户 12345″ 压缩为 ”UID:12345″
- 二进制序列化 :使用 Protocol Buffers 替代 JSON
长对话分块策略
- 按话题切分 :检测对话主题变化时自动分块
- 时间窗口切分 :每 30 分钟自动创建新上下文块
- 关键事件标记 :下单、支付等操作作为分界点
生产环境避坑指南
上下文漂移检测
def detect_drift(new_utterance: str, context: list) -> bool:
"""基于余弦相似度检测话题偏移"""
from sklearn.feature_extraction.text import TfidfVectorizer
texts = [item['content'] for item in context] + [new_utterance]
vectors = TfidfVectorizer().fit_transform(texts)
last_sim = cosine_similarity(vectors[-2], vectors[-1])[0][0]
return last_sim < 0.3 # 相似度阈值
敏感信息擦除
- 正则匹配手机号 / 银行卡等模式
- 命名实体识别(NER)定位个人信息
- 在上下文编码阶段自动替换为 [REDACTED]
延伸思考
上下文版本兼容方案
- 为每个上下文附加 schema 版本号
- 设计向下兼容的字段扩展规则
- 维护版本迁移转换器(Version Migrator)
微服务上下文共享
- 通过分布式追踪 ID(如 OpenTelemetry)串联
- 上下文快照存入 Redis 集群
- 定义 gRPC 上下文传播协议
写在最后
实现一个真正理解上下文的 Agent,就像教小朋友记住对话的前因后果。刚开始可能需要设计明确的记忆规则(状态机),随着理解能力增强可以放手让它自主把握重点(Transformer)。建议从简单的滑动窗口开始,逐步尝试加入 Attention 机制,最终你会收获一个『善解人意』的智能助手。
正文完
