Spring ai智能客服
完整架构:Spring AI RAG 智能知识库 AWS 无服务器方案
整体链路分两大模块:
文档入库链路:S3 上传文件 → Lambda 触发 → 文档解析 / 切片 → 调用 Embedding → 向量入库
客服问答链路:前端请求 → API Gateway → Lambda(内置 Spring AI)→ RAG 检索向量库 → LLM 生成流式客服回答
一、整体架构图
plaintext
【运营端】上传PDF/Word/TXT
↓
S3 Bucket(知识库存储桶)
↓ S3 Put事件触发
Lambda 1:文档向量化处理函数
├ Tika解析文档
├ TokenTextSplitter文本分块
├ 调用Bedrock/OpenAI Embedding生成向量
└ 写入向量库(Pinecone / OpenSearch Serverless / Aurora PGVector)
【用户端】客服提问
↓ HTTPS
API Gateway REST/HTTP API
↓ 转发
Lambda 2:Spring AI RAG问答服务
├ 接收用户query
├ 向量库相似度检索TopN知识库片段
├ Spring AI ChatClient组装Prompt(知识库+客服约束)
├ 调用LLM(Bedrock通义千问/Anthropic)
└ 流式SSE返回回答给前端
二、依赖与技术选型
-
AWS 云服务
S3:存储原始知识库文档
Lambda:无服务器计算,运行 Spring Boot/Spring AI
API Gateway:对外暴露 HTTP 问答接口
Amazon OpenSearch Serverless / Pinecone:向量数据库
Amazon Bedrock:提供 Embedding、LLM 大模型(免密钥管理)
IAM:函数执行权限(S3 读写、向量库、Bedrock 调用)
CloudWatch:日志、监控、告警 -
代码技术栈
Spring Boot 3 + Spring AI 1.x
Tika:PDF/Word/Excel/TXT 解析
TokenTextSplitter:文本切片
Spring AI Bedrock 集成
Spring AI VectorStore(OpenSearch/Pinecone)
Lambda Web Adapter:让 Spring Boot 可直接部署在 Lambda
SSE 流式输出:实现打字机效果客服回复
三、模块 1:S3 上传触发 Lambda 文档向量化函数
3.1 核心逻辑
S3 文件上传事件进入 Lambda,获取 bucket + 文件 key
Lambda 读取 S3 文件流,Tika 提取纯文本
文本分块(500token,重叠 100)
调用 Bedrock Embedding 接口生成向量
批量写入向量库,附带元数据(文件名、文档分类、上传时间)
3.2 Lambda 部署方式
Spring Boot 打包为容器镜像推送到 ECR(依赖多,ZIP 包容易超限)
核心代码片段(事件处理入口)
java
运行
// S3事件入口
public class S3DocumentHandler implements RequestHandler<S3Event, String> {
private final S3Client s3Client;
private final DocumentService docService;public S3DocumentHandler() {
this.s3Client = S3Client.create();
this.docService = new DocumentService();
}@Override
public String handleRequest(S3Event event, Context context) {
for (S3EventRecord record : event.getRecords()) {
String bucket = record.getS3().getBucket().getName();
String key = record.getS3().getObject().getKey();
// 读取S3文件
InputStream is = s3Client.getObject(GetObjectRequest.builder()
.bucket(bucket).key(key).build()).responseStream();
// 解析、切片、向量化入库
docService.processFile(is, key);
}
return "success";
}
}
DocumentService 核心处理
java
运行
@Service
public class DocumentService {
private final Tika tika = new Tika();
private final DocumentSplitter splitter = new TokenTextSplitter(500,100);
private final EmbeddingClient embeddingClient;
private final VectorStore vectorStore;
public void processFile(InputStream stream, String fileName) throws Exception {
// 1.解析全文
String text = tika.parseToString(stream);
Document doc = new Document(text);
doc.getMetadata().put("fileName", fileName);
doc.getMetadata().put("category", "customer_service");
// 2.切片
List
// 3.自动向量化存入向量库
vectorStore.add(chunks);
}
}
3.3 S3 触发器配置
S3 桶 → 事件通知 → 创建事件
事件类型:所有对象创建
目标:Lambda 函数(文档处理函数)
IAM 权限:Lambda 执行角色需要s3:GetObject、向量库读写、bedrock:InvokeModel权限
四、模块 2:API Gateway + Lambda Spring AI 流式问答服务
4.1 核心能力
接收用户 question
RAG 检索知识库向量片段
客服专用 System Prompt 约束(只能基于知识库回答,无匹配则引导人工)
SSE 流式分段输出回答,前端实时展示
4.2 Lambda 运行 Spring Boot 方案
使用 AWS Lambda Web Adapter,标准 Spring Boot 项目无需改造 Web 结构,直接打包 Docker 镜像部署 Lambda,API Gateway 转发 HTTP 请求。
application.yml 核心配置
yaml
spring:
ai:
bedrock:
aws:
region: us-east-1
chat:
model: anthropic.claude-3-haiku-20240307-v1:0
embedding:
model: amazon.titan-embed-text-v2:0
vectorstore:
opensearch:
host: xxx.aos.us-east-1.on.aws
port: 443
index-name: cs_knowledge_base
4.3 RAG 配置类(检索增强)
java
运行
@Configuration
public class RagConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder builder, VectorStore vectorStore) {
String systemPrompt = """
你是电商智能客服,仅允许根据【知识库参考内容】回答用户问题:
1. 知识库无相关内容统一回复:抱歉,该问题暂无解答,请联系人工客服。
2. 回答简洁口语化,禁止编造信息。
3. 用户咨询退货、物流、优惠券优先匹配知识库。
""";
return builder
.defaultSystem(systemPrompt)
// 检索top3相似度片段,阈值0.6过滤低相关内容
.defaultAdvisors(vectorStore.retrievalAdvisor(SearchRequest.builder()
.topK(3)
.similarityThreshold(0.6)
.build()))
.build();
}
}
4.4 流式问答 Controller(SSE 输出)
java
运行
@RestController
@RequestMapping("/api/cs")
public class CsChatController {
private final ChatClient chatClient;
public CsChatController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping(value = "/stream/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux
return chatClient.prompt()
.user(question)
.stream()
.content();
}
}
4.5 API Gateway 配置
创建 HTTP API,后端集成 Lambda 问答函数
开启 SSE 支持(流式响应)
CORS 配置允许前端跨域访问
可增加 API 密钥、限流、JWT 鉴权做客服登录校验
五、向量库选型对比(AWS 环境)
Amazon OpenSearch Serverless(推荐 AWS 原生)
托管免运维,和 IAM 打通,适合中小规模知识库,无缝对接 Lambda。
Aurora PostgreSQL PGVector
已有 RDS 业务可复用,向量 + 业务数据一体,百万级以内友好。
Pinecone
高性能专用向量库,海量知识库,需外网访问,配置跨账号权限。
六、完整权限配置(IAM 关键策略)
两个 Lambda 执行角色都需要以下权限:
Bedrock:bedrock:InvokeModel(调用 Embedding、LLM)
S3:s3:GetObject(文档读取)
向量库:OpenSearch/PGVector 读写权限
CloudWatch Logs:输出日志排查问题
七、端到端完整测试流程
知识库入库
上传售后 FAQ.pdf 到 S3 桶
S3 触发文档处理 Lambda
自动解析、切片、生成向量存入 OpenSearch
客服问答测试
请求流式接口:
plaintext
GET https://xxx.execute-api.us-east-1.amazonaws.com/api/cs/stream/chat?question=退货流程是什么
返回 SSE 流式文本,逐段输出客服回答;若无匹配知识库,统一返回引导人工话术。
八、生产优化点
文档去重:上传前根据文件 MD5 判断是否已存在,避免重复向量
分类检索:元数据增加category,不同业务客服只检索对应分类知识库
对话记忆:搭配 Spring AI ChatMemory,Redis 存储多轮会话上下文
失败重试 DLQ:S3 处理失败消息转入 SQS 死信队列,防止文档丢失
冷启动优化:Lambda 预置并发、SnapStart(Java)降低首次问答延迟
日志审计:每条问答记录用户提问、检索片段、回答存入 DynamoDB,用于知识库迭代
九、和你之前知识串联
IoT 设备 MQTT 上报故障 → IoT Core 转发至 Lambda
Lambda 解析物模型标准化故障字段
调用本套 Spring AI RAG 流式接口,自动推送故障对应解决方案给用户客服端
浙公网安备 33010602011771号