1. 项目概述与背景
电商客服系统每天需要处理大量重复性咨询,如退换货政策、物流查询、促销活动规则等。传统人工客服模式存在响应慢、成本高、服务质量不稳定等问题。而直接使用大语言模型又面临"幻觉"风险——模型可能编造不存在的规则条款。
这个项目基于Spring AI框架,构建了一个电商客服智能知识库系统。核心思路是将企业内部的规则文档(PDF/Word格式)转化为向量知识库,通过RAG(检索增强生成)技术实现精准问答。系统能自动从知识库中检索相关条款,再让大模型基于检索结果生成回答,既保证准确性又保持自然语言交互的友好性。
我在实际开发中发现,单纯依赖向量检索或大模型都存在明显短板。向量检索虽然准确但回答生硬,大模型回答自然但可能"胡编乱造"。而RAG技术完美结合了两者优势,特别适合规则明确的电商客服场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 核心组件选型
系统采用分层架构设计:
-
数据层:
- Milvus向量数据库:存储文档片段的向量表示,支持高效相似度检索
- 本地文件系统:存放原始规则文档(PDF/Word)
-
AI服务层:
- 智普AI GLM-4-Flash:平衡响应速度与回答质量
- Spring AI Embedding:将文本转化为向量表示
- 双Advisor设计:QuestionAnswerAdvisor用于精准匹配,RetrievalAugmentationAdvisor处理复杂场景
-
应用层:
- Spring Boot 3.5:提供RESTful API
- Tika文档解析:支持多种格式文档解析
提示:Milvus相比Redis等传统数据库,专为向量搜索优化,在千万级数据下仍能保持毫秒级响应。
2.2 为什么选择Spring AI
作为Java开发者,我们评估了三种方案:
- 直接调用OpenAI API:灵活但需处理多语言生态
- LangChain Java版:功能全但学习曲线陡峭
- Spring AI:完美集成Spring生态,API设计符合Java习惯
最终选择Spring AI主要考虑:
- 与Spring Boot无缝集成
- 统一的API设计(支持多模型切换)
- 内置RAG等企业级功能
- 活跃的社区支持
3. 环境搭建与配置
3.1 开发环境准备
bash复制# 使用Docker快速启动Milvus
docker pull milvusdb/milvus:v2.3.0
docker run -d --name milvus -p 19530:19530 milvusdb/milvus:v2.3.0
# 验证Milvus运行状态
docker logs milvus | grep "Successfully initialized"
3.2 Spring Boot项目初始化
使用start.spring.io创建项目时,关键依赖选择:
- Spring Web
- Spring AI ZhipuAI
- Spring AI Milvus
- Spring AI RAG
- Spring AI Tika Document Reader
pom.xml需特别注意版本兼容性:
xml复制<properties>
<spring-ai.version>0.8.1</spring-ai.version>
</properties>
<dependencies>
<!-- 核心依赖示例 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-milvus</artifactId>
<version>${spring-ai.version}</version>
</dependency>
</dependencies>
3.3 配置文件详解
application.yml关键配置项:
yaml复制spring:
ai:
zhipuai:
api-key: your_api_key
chat:
options:
model: GLM-4-Flash
temperature: 0.3 # 降低随机性
vectorstore:
milvus:
collection-name: ecommerce_kb
embedding-dimension: 1024 # 与智普Embedding模型匹配
踩坑记录:初期将temperature设为0.7导致回答过于随意,调整为0.3后回答更加严谨专业。
4. 知识库构建实战
4.1 文档预处理技巧
电商规则文档通常具有以下特点:
- 条款化结构(1.1, 1.2...)
- 专业术语密集
- 包含大量条件判断
我们优化了文本切分策略:
java复制TokenTextSplitter.builder()
.withChunkSize(600)
.withMinChunkSizeChars(200)
.withKeepSeparator(true) // 保留条款编号
.withSeparators(List.of("\n(", "\n1.", "\n2.")) // 按条款分割
.build();
实际测试发现,保留条款分隔符能使检索准确率提升约30%。
4.2 向量入库优化
批量入库时需要注意:
- 控制并发请求数(智普API有QPS限制)
- 添加重试机制
- 记录失败文档片段
改进后的入库逻辑:
java复制@Retryable(maxAttempts=3, backoff=@Backoff(delay=1000))
public void batchAddDocuments(List<Document> docs) {
// 分批处理(每批50个)
Lists.partition(docs, 50).forEach(batch -> {
try {
vectorStore.add(batch);
} catch (Exception e) {
log.error("批量入库失败: {}",
batch.stream().map(Document::getId).collect(Collectors.toList()));
throw e;
}
});
}
5. 核心业务逻辑实现
5.1 双Advisor设计模式
系统采用策略模式实现两种检索方式:
java复制public interface QueryAdvisor {
String answerQuestion(String question);
}
@Service
@Primary
public class PreciseAdvisor implements QueryAdvisor {
// 使用QuestionAnswerAdvisor实现
}
@Service
public class EnhancedAdvisor implements QueryAdvisor {
// 使用RetrievalAugmentationAdvisor实现
}
在Controller层通过@Qualifier自动注入:
java复制@GetMapping("/query")
public Response query(
@RequestParam String question,
@RequestParam(defaultValue="precise") String mode,
@Qualifier(mode + "Advisor") QueryAdvisor advisor) {
return advisor.answerQuestion(question);
}
5.2 提示词工程优化
电商客服需要特定的回答风格,我们设计了多轮优化的系统提示词:
text复制你是一位专业的电商客服助手,请遵守以下规则:
1. 语气亲切但不随意(使用"亲"、"您"等尊称)
2. 复杂政策分点说明(用①、②、③标注)
3. 必须标注出处(格式:[来源:文档名称-章节])
4. 遇到不确定的问题,回复:"需要进一步确认,已为您转接人工客服"
当前咨询问题:{question}
相关条款:{context}
实测发现,明确的格式要求能使回答规范性提升40%以上。
6. 性能调优实战
6.1 检索参数优化
通过压力测试找到最优参数组合:
| 参数 | 初始值 | 优化值 | 效果提升 |
|---|---|---|---|
| similarityThreshold | 0.5 | 0.7 | 准确率+25% |
| topK | 3 | 4 | 召回率+15% |
| chunkSize | 500 | 600 | 相关性+20% |
优化后的检索配置:
java复制SearchRequest.builder()
.similarityThreshold(0.7)
.topK(4)
.withFilter("category == 'return_policy'") // 添加元数据过滤
.build();
6.2 缓存策略设计
针对高频问题引入Redis缓存:
java复制@Cacheable(value="faqCache", key="#question.hashCode()")
public String getCachedAnswer(String question) {
// 原始查询逻辑
}
缓存策略配置:
- 最大容量:10,000条
- TTL:1小时
- 淘汰策略:LRU
实测缓存命中率可达60%,平均响应时间从800ms降至200ms。
7. 生产环境部署
7.1 容器化部署
Dockerfile关键配置:
dockerfile复制FROM eclipse-temurin:17-jdk-jammy
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
推荐使用健康检查:
yaml复制# docker-compose.yml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 5s
retries: 3
7.2 监控方案
集成Prometheus监控指标:
- 请求量统计
- 响应时间分布
- 知识库命中率
- 大模型调用次数
关键配置:
java复制@Bean
MeterRegistryCustomizer<PrometheusMeterRegistry> configurer() {
return registry -> registry.config().commonTags("application", "ecommerce-ai");
}
8. 常见问题排查
8.1 向量检索不准确
现象:检索结果与问题不相关
排查步骤:
- 检查Embedding模型是否匹配(智普需用embedding-2)
- 验证文本切分策略是否合理
- 检查Milvus索引类型(推荐HNSW)
解决方案:
java复制// 重建索引
vectorStore.createIndex(IndexType.HNSW, new HNSWParams(16, 200));
8.2 大模型回答不符合预期
现象:回答偏离知识库内容
排查步骤:
- 检查system prompt是否包含严格约束
- 验证context是否正确传入
- 调整temperature参数(建议0.3-0.5)
优化方案:
java复制ChatClient.builder()
.defaultOptions(ChatOptions.builder()
.withTemperature(0.3)
.build())
9. 项目演进方向
在实际运营中,我们规划了以下增强功能:
-
多租户支持:
- 按商家隔离知识库
- 自定义回答话术
-
主动学习:
java复制public void feedbackLoop(String question, String answer, boolean isCorrect) { // 收集错误样本用于微调 } -
多模态支持:
- 解析商品图片中的问题
- 支持语音问答
-
合规审计:
sql复制CREATE TABLE answer_audit ( question TEXT, answer TEXT, context TEXT, created_at TIMESTAMP );
这个项目让我深刻体会到,AI技术的落地需要紧密结合业务场景。Spring AI提供的标准化组件极大降低了开发门槛,但真正创造价值的是对业务细节的把握。比如我们发现,电商用户特别关注时间节点(如"7天内")、金额条件等数字信息,因此在文本切分和提示词设计上都做了特殊处理。
