RAG(Retrieval-Augmented Generation)检索增强生成是一种将信息检索技术与生成式AI相结合的创新架构。它通过以下方式实现智能化内容生成:
传统生成模型与RAG架构对比:
维度 | 传统生成模型 | RAG架构 |
---|---|---|
知识更新周期 | 依赖训练数据时效性 | 实时检索最新数据 |
内容准确性 | 存在幻觉风险 | 基于事实文档生成 |
领域适应性 | 需要重新训练模型 | 通过更新知识库快速适配 |
可解释性 | 黑盒生成过程 | 可追溯参考文档 |
本案例采用的技术架构:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.aigroupId>
<artifactId>spring-ai-alibaba-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.aigroupId>
<artifactId>spring-ai-pgvector-store-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.aigroupId>
<artifactId>spring-ai-pdf-document-readerartifactId>
dependency>
dependencies>
spring:
ai:
dashscope:
api-key: ${AI_DASHSCOPE_API_KEY}
vectorstore:
pgvector:
dimensions: 1536 # 匹配模型维度
distance-type: cosine_distance
// 文档解析与存储
public void importDocument() {
// 1.PDF文档解析
DocumentReader reader = new PagePdfDocumentReader(springAiResource);
List<Document> documents = reader.get();
// 2.文本分块处理
List<Document> splitDocuments = new TokenTextSplitter()
.apply(documents);
// 3.向量化存储
vectorStore.add(splitDocuments);
}
文本分块策略优化建议:
@PostMapping("/rag/importFile")
public ResponseEntity<String> handleFileUpload(
@RequestPart MultipartFile file) {
// 1.文档类型自动检测
DocumentReader reader = new TikaDocumentReader(file.getResource());
// 2.统一处理流程
List<Document> docs = reader.get();
List<Document> splitDocs = new TokenTextSplitter().apply(docs);
vectorStore.add(splitDocs);
return ResponseEntity.ok("成功入库"+splitDocs.size()+"个文本块");
}
支持的文件类型扩展:
文件类型 | 处理方式 | 适用场景 |
---|---|---|
PagePdfDocumentReader | 技术文档 | |
Word | TikaDocumentReader | 业务报告 |
HTML | TikaDocumentReader | 网页内容抓取 |
Markdown | TextDocumentReader | 开发文档 |
public Flux<ChatResponse> generate(String message) {
return ChatClient.builder(chatModel)
.defaultAdvisors(new RetrievalRerankAdvisor(
vectorStore,
rerankModel,
SearchRequest.defaults(),
systemPrompt,
0.1 // 相关性阈值
))
.build()
.prompt()
.user(message)
.stream();
}
检索优化策略:
系统提示模板(system-qa.st):
你是一个专业的AI助手,请根据以下上下文回答问题:
${context}
要求:
1. 使用中文回答
2. 答案需标注引用来源
3. 不确定时明确告知
4. 保持回答简洁专业
当前问题:${question}
提示词设计要点:
PgVector索引配置策略:
CREATE INDEX ON items
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
参数调优建议:
参数 | 推荐值 | 说明 |
---|---|---|
m | 16-24 | 构建时的连接数 |
ef_construction | 64-128 | 索引构建时的搜索范围 |
ef_search | 40-100 | 实际查询时的搜索范围 |
// 实现伪代码示例
public List<Document> retrieveWithCache(String query) {
String cacheKey = generateCacheKey(query);
if (cache.exists(cacheKey)) {
return cache.get(cacheKey);
}
List<Document> results = vectorStore.search(query);
cache.set(cacheKey, results, TTL);
return results;
}
缓存方案选择:
缓存类型 | 适用场景 | 优势 |
---|---|---|
本地缓存 | 高频重复查询 | 零网络延迟 |
Redis缓存 | 分布式环境 | 数据一致性高 |
向量语义缓存 | 相似查询处理 | 提升缓存命中率 |
典型架构:
用户提问 → 语义检索 → 权限过滤 → 生成回答 → 审核输出
安全增强措施:
功能扩展点:
特色功能实现:
// 文献关联分析
public List<Document> findRelatedPapers(String paperId) {
Document target = getPaperEmbedding(paperId);
return vectorStore.similaritySearch(
SearchRequest.query(target.getEmbedding())
.withTopK(10)
.withFilter(metadataFilter)
);
}