经过前面几篇文章的铺垫,我们已掌握 Spring AI 核心模块(对话、Embedding、RAG)与优化技巧。本文将聚焦电商行业高频痛点,通过实战案例 —— 电商客服智能知识库 RAG 系统,带大家完成从需求分析、环境搭建到系统测试的全流程开发。该系统支持本地文档导入、向量存储与双模式检索增强,可精准解答用户关于退换货政策、物流查询、促销活动等咨询,帮助企业提升客服响应效率。
一、项目需求与技术选型
1. 核心需求
- 支持导入本地 PDF 格式电商规则文档(如《电商知识库标准条款》等)。
- 实现电商场景高频问题智能问答(如 “双 11 买的口红拆封能退吗?”“未发货订单怎么改地址?”“偏远地区包邮吗?”)。
- 支持两种检索模式:精准条款匹配(QuestionAnswerAdvisor)与复杂场景增强(RetrievalAugmentationAdvisor),适配不同咨询场景。
- 回答需基于知识库内容,标注信息来源,避免编造规则,同时过滤与电商业务无关的查询。
2. 技术选型
| 技术模块 |
选型方案 |
| 开发框架 |
Spring Boot 3.5.3 + Spring AI 1.0.0-SNAPSHOT |
| 大模型 |
智普 AI(Embedding:embedding-2;Chat:GLM-4-Flash) |
| 向量数据库 |
Milvus 2.4.0 |
| 文档解析 |
TikaDocumentReader(支持 DOC 文档解析) |
| 文本切分 |
TokenTextSplitter(按 Token 数量智能切分) |
| RAG 组件 |
QuestionAnswerAdvisor + RetrievalAugmentationAdvisor |
二、项目初始化与环境配置
1. 创建 Spring Boot 项目
- 项目名称:Weiz-SpringAI-RAG-EcommerceCustomer
- JDK 版本:17
- Spring Boot 版本:3.5.3
- 核心依赖:Spring Web、Spring AI 相关依赖(智普 AI、Milvus、RAG 组件、Tika 文档解析)
2. 配置 pom.xml 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>Weiz-SpringAI</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Weiz-SpringAI-RAG-EcommerceCustomer</artifactId>
<name>Weiz-SpringAI-RAG-EcommerceCustomer</name>
<description>Weiz-SpringAI-RAG-EcommerceCustomer</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 智普 AI 大模型集成 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
<!-- spring-ai-client-chat 中包括 TokenTextSplitter、TextReader、Document 等工具 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-client-chat</artifactId>
</dependency>
<!-- DOC 文档解析依赖(Tika) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Milvus 向量数据库 Starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-milvus</artifactId>
</dependency>
<!-- QuestionAnswerAdvisor 依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
<!-- RetrievalAugmentationAdvisor 依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-rag</artifactId>
</dependency>
</dependencies>
</project>
3. 配置 application.properties
# 应用基础配置
spring.application.name=Weiz-SpringAI-RAG-EcommerceCustomer
server.port=8080
# 智普 AI 配置
spring.ai.zhipuai.api-key=你的智普 AI API Key
spring.ai.zhipuai.base-url=https://open.bigmodel.cn/api/paas
spring.ai.zhipuai.embedding.options.model=embedding-2
spring.ai.zhipuai.chat.options.model=GLM-4-Flash
# Milvus 向量数据库配置
spring.ai.vectorstore.milvus.client.host=localhost
spring.ai.vectorstore.milvus.client.port=19530
spring.ai.vectorstore.milvus.client.token=root:Milvus
spring.ai.vectorstore.milvus.database-name=default
spring.ai.vectorstore.milvus.collection-name=guide_exam_store
spring.ai.vectorstore.milvus.initialize-schema=true
spring.ai.vectorstore.milvus.embedding-dimension=1024
# 日志配置(便于调试)
logging.level.org.springframework.ai=INFO
logging.level.com.example=DEBUG
三、知识库构建:电商规则文档导入与向量入库
1. 准备电商客服知识库文档
将 电商知识库标准条款.doc 文档放入 src/main/resources 目录,文档内容示例:
一、退换货政策(核心条款)
(一)通用退换货规则
1. 7 天无理由退换:用户签收商品后 7 天内,商品完好(吊牌未拆、包装完整、
无使用痕迹),支持无理由退换;美妆、个护类商品拆封后仍支持 7 天无理由退
换,但需保留赠品及原包装配件。
2. 质量问题退换:商品存在破损、功能故障、材质不符等质量问题,支持签收后 30
天内免费退换,往返运费由商家承担;需提供问题商品清晰照片、快递面单作为
凭证,48 小时内响应处理。
3. 退换货流程:用户发起申请 → 商家审核(24 小时内)→ 用户寄回商品(7 天
内)→ 商家验收 → 退款 / 换货(验收后 48 小时内)。
(二)特殊商品退换规则
1. 定制类商品:刻字首饰、定制尺寸服装、个性化印刷品等,无质量问题不支持退
换;质量问题需在签收后 48 小时内反馈,提供定制凭证及问题证明。
2. 食品 / 美妆类:食品、饮料、保健品等开封后不支持退换;美妆类商品(口红、
粉底液等)使用后出现过敏需提供医院诊断证明,支持全额退款。
3. 数码家电类:未拆封数码家电支持 7 天无理由退换;拆封后仅支持质量问题退
换,需提供品牌售后检测报告;保修服务按品牌官方政策执行。
.......
后面省略
2. 编写知识库初始化配置
创建 com.example.weizspringai.config.KnowledgeBaseConfig 类,实现 DOC 文档解析、文本切分与向量入库。这是整个RAG系统的基础,通过Spring Boot的自动配置和向量化能力,我们可以轻松将非结构化的规则文档转换为可被大模型理解的向量知识。
import org.springframework.ai.document.Document;
import org.springframework.ai.reader.tika.TikaDocumentReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import jakarta.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Component
public class KnowledgeBaseConfig {
private final VectorStore vectorStore;
public KnowledgeBaseConfig(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
/**
* 项目启动时初始化知识库:解析 DOC 文档 → 切分文本 → 向量入库
*/
@PostConstruct
public void initKnowledgeBase() {
try {
System.out.println("开始初始化电商客服知识库...");
// 1. 定义需要导入的 DOC 文档列表
List<String> pdfFiles = List.of(
"电商知识库标准条款.docx"
);
List<Document> allSplitDocs = new ArrayList<>();
for (String fileName : pdfFiles) {
// 2. 读取单个 DOC 文档
Resource resource = new ClassPathResource(fileName);
TikaDocumentReader reader = new TikaDocumentReader(resource);
List<Document> rawDocs = reader.read();
// 3. 优化文本切分策略(适配电商规则条款化特点)
TokenTextSplitter splitter = TokenTextSplitter.builder()
.withChunkSize(600) // 每段最大 600 Token(匹配规则条款长度)
.withMinChunkSizeChars(200) // 每段最小 200 字符
.withKeepSeparator(true) // 保留条款分隔符
.build();
// 4. 切分当前文档并添加到总列表
List<Document> splitDocs = splitter.apply(rawDocs);
allSplitDocs.addAll(splitDocs);
System.out.println("已解析文档:" + fileName + ",生成 " + splitDocs.size() + " 个文本片段");
}
// 5. 批量向量入库(Spring AI 自动调用 EmbeddingModel 完成向量化)
vectorStore.add(allSplitDocs);
System.out.println("知识库初始化完成,共导入 " + allSplitDocs.size() + " 个文本片段");
} catch (Exception e) {
System.err.println("知识库初始化失败:" + e.getMessage());
e.printStackTrace();
}
}
}
四、RAG 核心配置: Advisor 初始化
创建 com.example.ecommerceservicerag.config.RAGConfig 类,配置 QuestionAnswerAdvisor 与 RetrievalAugmentationAdvisor 等 RAG 组件,并优化提示词以提升检索精准度:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;
import org.springframework.ai.rag.generation.augmentation.ContextualQueryAugmenter;
import org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RAGConfig {
private final VectorStore vectorStore;
public RAGConfig(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
/**
* 配置 QuestionAnswerAdvisor(适合精准条款查询,如具体政策匹配)
*/
@Bean
public QuestionAnswerAdvisor questionAnswerAdvisor() {
return QuestionAnswerAdvisor.builder(vectorStore)
.searchRequest(SearchRequest.builder()
.similarityThreshold(0.07) // 优化阈值,适配电商规则检索
.topK(4) // 取 Top4 相似片段,提升精准度
.build())
.build();
}
/**
* 配置 RetrievalAugmentationAdvisor(适合复杂场景查询,如促销+退换货组合问题)
*/
@Bean
public RetrievalAugmentationAdvisor retrievalAugmentationAdvisor() {
// 1. 向量检索器(配置检索参数)
VectorStoreDocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.similarityThreshold(0.07)
.topK(4)
.build();
// 查询增强器
ContextualQueryAugmenter queryAugmenter = ContextualQueryAugmenter.builder()
.allowEmptyContext(true)
.build();
// 3. 构建检索增强 Advisor
return RetrievalAugmentationAdvisor.builder()
.documentRetriever(retriever)
.queryAugmenter(queryAugmenter)
.build();
}
/**
* 配置 ChatClient(集成智普 AI GLM-4-Flash,适配电商客服语气)
*/
@Bean
public ChatClient chatClient(org.springframework.ai.chat.model.ChatModel chatModel) {
return ChatClient.builder(chatModel)
.defaultSystem("""
你是友好的电商客服顾问,仅基于提供的知识库内容回答用户问题,规则如下:
1. 回答需亲切、简洁、准确,符合电商客服沟通语气,避免生硬表述;
2. 涉及政策规则时,分点说明关键信息,让用户一目了然;
3. 回答末尾必须标注信息来源(格式:信息来源:[文档名称 - 相关条款类别]);
4. 若未查询到相关信息,回复"非常抱歉,暂未查询到该问题的相关规则,建议联系人工客服咨询~";
5. 仅回应与电商购物(退换货、促销、物流等)相关的问题,无关问题直接回复上述统一话术。
""")
.build();
}
}
五、编写控制器:提供问答接口
创建 com.example.ecommerag.controller.CustomerServiceController 类,提供精准条款查询与复杂场景增强查询两种接口,以适配电商客服的日常咨询场景:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/ecommerce/service")
public class CustomerServiceController {
@Autowired
private ChatClient chatClient;
@Autowired
private QuestionAnswerAdvisor questionAnswerAdvisor;
@Autowired
private RetrievalAugmentationAdvisor retrievalAugmentationAdvisor;
/**
* 精准条款查询接口(基于 QuestionAnswerAdvisor)
* 适用场景:查询具体规则条款(如包邮条件、退换货时限、价保规则)
*/
@GetMapping("/chat/precise")
public Map<String, String> preciseChat(@RequestParam("question") String question) {
String answer = chatClient.prompt()
.user(question)
.advisors(List.of(questionAnswerAdvisor))
.call()
.content();
return Map.of(
"question", question,
"answer", answer,
"mode", "precise(精准条款查询)"
);
}
/**
* 复杂场景增强查询接口(基于 RetrievalAugmentationAdvisor)
* 适用场景:组合类、流程类问题(如促销期退换货、已下单改地址、VIP用户物流查询)
*/
@GetMapping("/chat/enhanced")
public Map<String, String> enhancedChat(@RequestParam("question") String question) {
String answer = chatClient.prompt()
.user(question)
.advisors(List.of(retrievalAugmentationAdvisor))
.call()
.content();
return Map.of(
"question", question,
"answer", answer,
"mode", "enhanced(复杂场景增强)"
);
}
}
六、测试与验证
测试 1:查询具体概念(精准问答)
访问 http://localhost:8080/ecommerce/service/chat/precise?question=新疆地区订单多少金额包邮?,响应结果:
{
"question": "新疆地区订单多少金额包邮?",
"answer": "新疆属于偏远地区,订单金额满199元可享受包邮服务,不满199元需收取20元运费哦~ 信息来源:[物流服务标准 - 包邮政策]",
"mode": "precise(精准条款查询)"
}
测试 2:查询多步骤问题(检索增强)
访问 http://localhost:8080/ecommerce/service/chat/enhanced?question=双11买的口红拆封了能退吗?我是VIP用户?,响应结果:
{
"question": "双11买的口红拆封了能退吗?我是VIP用户?",
"answer": "非常抱歉,根据我们的退换货政策,口红属于美妆类商品,拆封后不支持7天无理由退换。不过,作为VIP用户,您在促销期间退换货可以享受免审核和优先处理的特权。如果您确实需要退换,建议联系客服了解具体情况。信息来源:[电商知识库标准条款文档模板 - 退换货政策]",
"mode": "enhanced(复杂场景增强)"
}
测试 3:流程类查询(未发货订单改地址)
访问 http://localhost:8080/ecommerce/service/chat/enhanced?question=我刚下单还没发货,想修改收货地址可以吗?,响应结果:
{
"question": "我刚下单还没发货,想修改收货地址可以吗?",
"answer": "当然可以,您下单后24小时内可以通过APP修改收货地址和联系电话。如果超过24小时,需要联系客服协调,但仅支持同城市地址修改哦。信息来源:[电商知识库标准条款文档模板 - 订单修改与追踪]。",
"mode": "enhanced(复杂场景增强)"
}
测试 4:查询无关问题(验证过滤)
访问 http://localhost:8080/ecommerce/service/chat/precise?question=怎么办理信用卡?,响应结果:
{
"question": "怎么办理信用卡?",
"answer": "非常抱歉,暂未查询到关于如何办理信用卡的相关规则,建议联系人工客服咨询~信息来源:[电商知识库标准条款文档模板 - 退换货政策]",
"mode": "precise(精准条款查询)"
}
测试结果表明,系统完全满足需求:能精准回答电商客服相关问题,支持不同类型的查询场景,且能有效过滤无关问题,符合生产级应用的要求。这背后离不开人工智能技术与数据库的高效协作。
七、项目扩展方向
- 多格式文档支持:扩展支持 PDF、Excel、PPT 等格式的知识库导入,使用 Spring AI 提供的对应文档阅读器。
- 知识库增量更新:实现知识库的新增、修改、删除功能,避免每次更新都需重启服务。
- 前端可视化界面:开发 Web 前端,支持文档上传、问题输入、回答展示、历史记录查询等功能。
- 权限控制:添加用户认证与授权功能,限制知识库的访问权限。
- 系统监控:集成监控工具,监控 Milvus 检索性能、大模型调用耗时、接口响应速度等指标。
总结
本文通过一个完整的电商客服知识库 RAG 系统,演示了 Spring AI 在实际业务场景中的落地流程。从需求分析、技术选型,到环境配置、知识库构建,再到核心组件开发与系统测试,每一步都围绕 “实用、稳定、高效” 的原则展开。通过该项目,我们不仅巩固了 Spring AI 的核心技术(Embedding、RAG、向量数据库集成),还掌握了从 0 到 1 构建 AI 应用的思维方式。
Spring AI 作为 Java 生态的原生生成式 AI 框架,其最大价值在于降低了 AI 技术的落地门槛,让 Java 开发者无需跨生态即可快速构建智能应用。随着大模型技术的持续演进,Spring AI 也在不断迭代升级,未来将支持更多场景与功能。
如果你对基于 Spring Boot 构建RAG应用或其他Java技术实践感兴趣,欢迎到云栈社区交流讨论,共同学习成长。