一、项目背景与挑战
1.1 问题场景
在航空服务场景中,传统客服系统存在两大痛点:
- 用户需通过固定菜单层层选择(如"按1查询订单,按2修改...")
- 复杂业务咨询依赖人工客服(如行李政策、改签规则)
1.2 解决方案
设计智能对话系统实现:
- 自然语言交互:用户直接说出需求(如"帮我改签到明天上午的航班")
- 业务自动化:对接订单系统完成退改签等操作
- 知识即时查询:整合航空公司最新政策文档
二、技术架构设计
2.1 系统分层架构
▌ 对话服务层(Spring Boot)
├─ WebSocket/SSE通信模块
├─ 大模型接口适配器(通义API)
├─ Function Calling业务路由
▌ 业务逻辑层
├─ 订单管理服务(模拟实现)
├─ 规则引擎(退改签条件校验)
▌ 数据存储层
├─ Redis向量数据库(政策文档)
├─ 内存缓存(对话上下文)
2.2 技术选型对比
| 需求 | 可选方案 | 最终选择 | 选型理由 |
|---|---|---|---|
| 流式响应 | HTTP轮询/SSE/WebSocket | SSE | 兼容性好,实现简单 |
| 对话记忆 | Redis/内存缓存 | 内存缓存 | 轻量无依赖,适合小规模场景 |
| 文档向量化 | ES/Sentence-BERT | Sentence-BERT | 本地化部署,无需额外API |
三、关键技术实现
3.1 多轮对话管理 // 对话上下文缓存实现 public class DialogContextHolder { private static final Map<String, Deque> contextMap = new ConcurrentHashMap<>();
public static void addMessage(String sessionId, Message message) {
Deque<Message> queue = contextMap.computeIfAbsent(sessionId, k -> new ArrayDeque<>(3));
if (queue.size() >= 3) queue.pollFirst();
queue.offerLast(message);
}
} 技术收获:
- 掌握
ConcurrentHashMap线程安全操作 - 理解LRU缓存淘汰策略的实际应用 3.2 Function Calling业务闭环
// 退订功能定义
@Function(name = "cancel_booking", description = "退订指定订单")
public BookingResult cancelBooking(@Parameter("订单号") String orderNo) {
// 1. 校验订单有效性
Booking booking = bookingService.validateOrder(orderNo);
// 2. 执行退订逻辑
return bookingService.cancel(booking);
}
// 大模型调用配置 ChatModel model = OpenAiChatModel.builder() .functions(List.of(cancelBooking)) .build(); 技术收获:
- 学习如何将业务API转化为大模型可理解的语义接口
- 实践事务管理保证退订操作的原子性
3.3 RAG增强的知识库
实现流程:
- 文档解析:Apache Tika提取PDF文本
- 分块处理:按段落切分(每段≤500字符)
- 向量存储:Sentence-BERT生成嵌入 → Redis Hash存储
- 检索增强:用户问题向量化 → KNN相似度查询 → 注入Prompt
技术收获:
- 掌握非结构化数据处理流程
- 实践向量相似度计算的实际应用