### **从零到一:基于大模型的智能航空助手开发实践*——一名Java后端开发者的AI工程化探索

79 阅读2分钟

一、项目背景与挑战

1.1 问题场景
在航空服务场景中,传统客服系统存在两大痛点:

  • 用户需通过固定菜单层层选择(如"按1查询订单,按2修改...")
  • 复杂业务咨询依赖人工客服(如行李政策、改签规则)

1.2 解决方案
设计智能对话系统实现:

  • 自然语言交互:用户直接说出需求(如"帮我改签到明天上午的航班")
  • 业务自动化:对接订单系统完成退改签等操作
  • 知识即时查询:整合航空公司最新政策文档

二、技术架构设计

2.1 系统分层架构 ▌ 对话服务层(Spring Boot)
├─ WebSocket/SSE通信模块
├─ 大模型接口适配器(通义API)
├─ Function Calling业务路由
▌ 业务逻辑层
├─ 订单管理服务(模拟实现)
├─ 规则引擎(退改签条件校验)
▌ 数据存储层
├─ Redis向量数据库(政策文档)
├─ 内存缓存(对话上下文)
2.2 技术选型对比

需求可选方案最终选择选型理由
流式响应HTTP轮询/SSE/WebSocketSSE兼容性好,实现简单
对话记忆Redis/内存缓存内存缓存轻量无依赖,适合小规模场景
文档向量化ES/Sentence-BERTSentence-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增强的知识库
实现流程

  1. 文档解析:Apache Tika提取PDF文本
  2. 分块处理:按段落切分(每段≤500字符)
  3. 向量存储:Sentence-BERT生成嵌入 → Redis Hash存储
  4. 检索增强:用户问题向量化 → KNN相似度查询 → 注入Prompt

技术收获

  • 掌握非结构化数据处理流程
  • 实践向量相似度计算的实际应用