1. 项目背景与核心价值
去年我在为某金融科技公司做技术咨询时,他们提出了一个典型需求:需要在不泄露商业机密的前提下,让内部员工能快速查询行业政策、产品文档和技术手册。传统方案要么需要全文检索系统+人工标注,要么采购商业问答产品但存在数据安全隐患。这正是Spring AI的用武之地——用不到200行代码,我们基于通义千问大模型搭建了完全自主可控的企业级问答系统,整套方案部署在客户内网,所有数据不出域,响应速度控制在800ms以内。
这种轻量级AI解决方案特别适合三类场景:
- 企业内部知识库问答(HR政策/IT帮助文档)
- 行业垂直领域智能客服(医疗/法律/金融)
- 产品说明书智能解析(电子产品/机械设备)
2. 技术架构设计
2.1 整体架构图
code复制[客户端] --> [Spring Boot API] --> [向量数据库]
↓
[通义千问API]
↑
[知识库文档预处理管道]
2.2 核心组件选型
大模型服务:
- 通义千问Qwen-72B-Chat(商用API版)
- 选择理由:对中文长文本理解优于GPT-3.5,支持最大32k tokens上下文
向量数据库:
- Milvus 2.3.x(Docker部署)
- 优势:比FAISS更易扩展,支持动态schema
文本嵌入模型:
- bge-small-zh-v1.5(本地部署)
- 实测在金融/法律领域NER识别准确率89%
3. 关键实现步骤
3.1 知识库预处理
python复制# 文档分块策略
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", "。", "!", "?"]
)
# 向量化处理
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5",
model_kwargs={'device': 'cuda'},
encode_kwargs={'normalize_embeddings': True}
)
关键参数说明:chunk_overlap设置20%可避免关键信息被切断,bge模型需要开启normalize_embeddings以获得更好的余弦相似度计算效果
3.2 Spring AI集成配置
java复制@Configuration
public class AiConfig {
@Bean
public ChatClient chatClient() {
return new TongYiChatClient.Builder()
.apiKey("your_api_key")
.model("qwen-72b-chat")
.temperature(0.3f) // 控制回答确定性
.maxTokens(2000)
.build();
}
@Bean
public VectorStore vectorStore() {
return new MilvusVectorStore.Builder()
.host("localhost")
.port(19530)
.collectionName("qa_docs")
.dimension(768) // bge-small模型维度
.build();
}
}
3.3 混合检索策略
java复制public List<Document> hybridSearch(String query) {
// 语义搜索
List<Document> vectorResults = vectorStore.similaritySearch(
SearchRequest.query(query)
.withTopK(3)
.withSimilarityThreshold(0.7)
);
// 关键词搜索作为fallback
if(vectorResults.isEmpty()) {
return keywordSearch(query);
}
return vectorResults;
}
4. 性能优化实战
4.1 缓存策略设计
java复制@Cacheable(value = "aiAnswers",
key = "#question.hashCode()",
unless = "#result.contains('不确定')")
public String getAnswer(String question) {
// 实际查询逻辑
}
4.2 异步处理管道
java复制@Async
public CompletableFuture<Answer> processQuestionAsync(String question) {
// 耗时操作放入线程池
return CompletableFuture.supplyAsync(() -> {
return ragService.generateAnswer(question);
}, taskExecutor);
}
5. 生产环境部署要点
5.1 安全配置清单
- API网关增加JWT认证
- 问答记录审计日志
- 敏感词过滤中间件
- 请求频率限制(50次/分钟/IP)
5.2 监控指标
prometheus复制# HELP ai_requests_total Total Q&A requests
# TYPE ai_requests_total counter
ai_requests_total{status="success"} 1425
ai_requests_total{status="failure"} 23
# HELP ai_response_time Response time in ms
# TYPE ai_response_time histogram
ai_response_time_bucket{le="500"} 892
ai_response_time_bucket{le="1000"} 1321
6. 踩坑实录
-
中文分句问题:
- 错误做法:直接按英文句号分割
- 正确方案:使用HanLP的句子分割器
-
向量维度不匹配:
- 现象:Milvus报错"Dimension not match"
- 排查:检查bge模型输出维度应为768
-
通义API超时:
- 解决方案:设置重试机制
java复制.withRetryTemplate(new RetryTemplateBuilder() .maxAttempts(3) .fixedBackoff(1000) .build())
7. 效果评估方法
在我的电商客户案例中,我们使用以下评估框架:
| 指标 | 基准值 | 优化后 | 测量方法 |
|---|---|---|---|
| 首答准确率 | 62% | 89% | 人工标注100个问题 |
| 平均响应时间 | 1.4s | 720ms | Prometheus监控 |
| 意图识别准确率 | 75% | 93% | 混淆矩阵分析 |
实现关键提升的两个技巧:
- 在RAG检索阶段加入业务词典增强
- 对高频问题配置预生成答案
这套方案目前已在3个行业10+企业落地,最典型的客户在系统上线后,IT支持工单减少了37%。对于想快速验证效果的同学,建议先从200-300份PDF规格说明书这样的结构化文档开始试点,通常2人天就能完成POC验证。