十二
小项目实战:企业智能客服
Enterprise Customer Service Bot
把前面学的串起来,搭一个"企业智能客服":能查订单(Function Calling)、能查物流(Function Calling)、能读产品文档回答(RAG)、能多轮对话(ChatMemory)。用户问"我订单 12345 到哪了",AI 自己调物流工具;问"你们退货政策是啥",AI 自己去 RAG 里找文档回答。
论系统设计
用户问题进来 → ChatClient 判断意图 →
① 如果是查订单/物流 → 走 @Tool 调真实业务接口;
② 如果是问产品/政策 → 走 RAG 检索产品文档;
③ 拿工具结果或检索片段 → 拼成 Prompt → 大模型组织成人话回答;
④ ChatMemory 记住上下文,支持追问。
进阶:再上 AgentScope,让"意图识别 Agent"把任务分发给"查询 Agent"和"文档 Agent"。学习阶段先把单 ChatClient + Tools + RAG 跑通。
项目搭建清单
搭这个智能客服,依赖和配置如下:
pom.xml 关键依赖
<dependencies>
<artifactId>spring-boot-starter-web</artifactId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<!-- RAG 用的向量库,这里以 Redis 为例 -->
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
<!-- PDF 读取 -->
<artifactId>spring-ai-pdf-document-reader</artifactId>
</dependencies>
application.yml
spring:
ai:
alibaba:
chat:
options:
model: qwen-plus
api-key: ${DASHSCOPE_API_KEY}
vectorstore:
redis:
index: product-idx
# Redis 连接信息以实际环境为准
一个客服接口整合 Tools + RAG
@RestController
@RequestMapping("/cs")
public class CustomerServiceController {
@Autowired private OrderTools orderTools; // 查订单/物流的工具
@GetMapping("/ask")
public String ask(String q, String sessionId) {
return chatClient.prompt(q)
// 人设:你是企业客服,礼貌、专业、不知道就说不知道,别编
.system("你是企业客服助手,基于工具和文档回答,不确定就说转人工。")
// 注册工具:查订单、查物流
.tools(orderTools)
// RAG:自动检索产品文档拼进上下文
.advisors(a -> a.advisors(
MessageChatMemoryAdvisor.builder(chatMemory).build(),
QuestionAnswerAdvisor.builder(vectorStore).build())
.param(ChatMemory.CONVERSATION_ID, sessionId))
.call()
.content();
}
}
测试一下
# 问订单:AI 自动调 trackLogistics 工具
GET /cs/ask?q=我订单12345到哪了&sessionId=u1
# 问政策:AI 自动去 RAG 找文档
GET /cs/ask?q=你们支持七天无理由退货吗&sessionId=u1
# 追问:因为有 ChatMemory,AI 记得上一轮
GET /cs/ask?q=那运费谁出呢&sessionId=u1
验证清单
搭完按这几条验收:
| 验证项 | 预期 |
|---|---|
| 问订单物流 | AI 调 trackLogistics,返回真实物流。 |
| 问退货政策 | AI 从 RAG 找到文档,基于文档回答。 |
| 追问上下文 | 带同一个 sessionId,AI 记得上一轮。 |
| 问不知道的事 | AI 说不知道/转人工,不编。 |
| 停掉物流接口 | AI 友好提示,不崩。 |
观察 AI 的决策日志
# 打开 SimpleLoggerAdvisor,看 AI 每次:
# 1. 收到的 system + user prompt 长啥样
# 2. 决定调了哪个工具、传了啥参数
# 3. 工具返回了什么
# 4. 最终回答是什么
# 出问题时对着日志一步步看,比瞎猜强十倍
客服机器人最容易被问崩的情况
① 用户问一个你根本没接工具、也没文档覆盖的问题,AI 开始编。② 用户连续追问,历史越攒越长,开始答非所问。③ 工具报错,AI 拿到异常信息不知道怎么处理。对策:system prompt 里写死"不知道就说不知道,转人工";历史截断;工具异常返回友好错误让 AI 转达。
记
实战心法
① 先跑通"Hello World"对话,再加工具、再加 RAG,别一口吃胖子。
② AI 是助手不是神,工具结果要校验,幻觉要兜底。
③ 版本和 API 变化快,遇到报错先查 spring-ai-alibaba 官方最新文档。