📚 系统概述

本项目是一个基于RAG(Retrieval-Augmented Generation)技术的医疗知识库AI问答系统,采用前后端分离架构,实现了文档上传、向量化存储、智能问答等核心功能。

♥ 核心技术栈

后端技术栈:

  • Spring Boot 3.4.2
  • Spring AI 1.0.0
  • Milvus向量数据库
  • MySQL关系型数据库
  • Redis缓存
  • 阿里云OSS对象存储
  • 阿里云百炼大模型API

前端技术栈:

  • Vue 3 + TypeScript
  • Element Plus UI组件库
  • Vite构建工具

🏗️ 系统架构设计

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   前端Vue3      │    │   后端Spring    │    │   向量数据库      │
│   (heyou-ui)    │◄──►│   Boot + AI     │◄──►│   (Milvus)      │
└─────────────────┘    └─────────────────┘    └─────────────────┘
│                       │                       │
▼                       ▼                       ▼
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   对象存储       │    │   关系数据库     │    │   大模型API      │
│  (阿里云OSS)     │    │    (MySQL)      │    │  (阿里百炼)      │
└─────────────────┘    └─────────────────┘    └─────────────────┘

🔄 核心业务流程

1. 知识库文档上传流程

详细实现步骤:

1.1 前端实现 (KnowHubView.vue)
// 文件上传处理
const uploadFile = () => {
const files: File[] = [];
fileList.value?.forEach((e) => {
files.push(e.raw as File);
});
isUploading.value = true;
uploadFileApi(files)
.then((res) => {
if (res.data.code == 0) {
ElMessage.success(res.data.data);
fileList.value = [];
loadStoreFileData();
}
})
.finally(() => {
isUploading.value = false;
});
};
1.2 后端实现 (KnowledgeController.java)
@PostMapping(value = "file/upload")
public BaseResponse upload(@RequestParam("file") List<MultipartFile> files) {
// 1. 上传到阿里OSS
String url = aliOssUtil.upload(file.getBytes(), objectName);
// 2. 文档内容提取 (支持pdf, docx, txt等)
Resource resource = file.getResource();
TikaDocumentReader reader = new TikaDocumentReader(resource);
List<Document> documents = reader.read();
// 3. 文本分片处理
List<Document> splitDocuments = tokenTextSplitter.apply(documents);
// 4. 向量化存储
vectorStore.add(splitDocuments);
// 5. 保存元数据
aliOssFileService.save(AliOssFile.builder()
.fileName(originalFilename)
.vectorId(JSON.toJSONString(splitDocuments.stream().map(Document::getId).collect(Collectors.toList())))
.url(url)
.build());
return ResultUtils.success("文件上传成功");
}

2. RAG问答流程

详细实现步骤:

2.1 后端RAG实现 (AiRagController.java)
@GetMapping(value = "/rag")
public Flux<String> generate(@RequestParam String message) {
// 1. 敏感词过滤
List<SensitiveWord> list = sensitiveWordService.list();
for (SensitiveWord sensitiveWord : list) {
if (message.contains(sensitiveWord.getWord())) {
return Flux.just("包含敏感词:" + sensitiveWord.getWord());
}
}
// 2. 向量检索 + 大模型问答
return chatClient.prompt()
.user(message)
.advisors(QuestionAnswerAdvisor.builder(vectorStore)
.searchRequest(
SearchRequest.builder()
.query(message)
.similarityThreshold(0.1d)
.topK(5)
.build()
)
.build())
.stream()
.content();
}
2.2 前端流式响应处理 (RagChatView.vue)
const sendMessage = async (apiMethod, loadingRef) => {
// 显示用户消息
messages.value.push({
role: 'user',
content: userInput.value
});
// 显示AI思考中...
const assistantMessage = {
role: 'assistant',
content: '正在思考中...',
isTyping: true
};
messages.value.push(assistantMessage);
try {
const response = await apiMethod(currentInput);
const reader = response.body?.getReader();
const decoder = new TextDecoder();
assistantMessage.content = '';
// 流式接收数据
while (true) {
const {value, done} = await reader.read();
if (done) break;
const text = decoder.decode(value);
assistantMessage.content += text;
await nextTick();
scrollToBottom();
}
} finally {
loadingRef.value = false;
assistantMessage.isTyping = false;
}
};

🗄️ 数据存储设计

1. 关系型数据库表结构

-- 知识库文件表
CREATE TABLE ali_oss_file (
id INT PRIMARY KEY AUTO_INCREMENT,
file_name VARCHAR(255) NOT NULL COMMENT '文件名',
url VARCHAR(500) NOT NULL COMMENT '文件链接地址',
vector_id TEXT COMMENT '向量ID列表',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_time DATETIME NOT NULL COMMENT '更新时间'
);
-- 敏感词表
CREATE TABLE sensitive_word (
id INT PRIMARY KEY AUTO_INCREMENT,
word VARCHAR(100) NOT NULL COMMENT '敏感词',
category_id INT COMMENT '分类ID',
create_time DATETIME NOT NULL
);

2. 向量数据库存储

使用Milvus向量数据库存储文档向量,配置如下:

spring:
ai:
vectorstore:
milvus:
client:
host: "192.168.0.101"
port: 19530
collectionName: "vector_store"
embeddingDimension: 1536
indexType: IVF_FLAT
metricType: COSINE
initializeSchema: true

🔧 核心技术详解

1. 文档处理技术

使用Apache Tika进行多格式文档内容提取:

// 支持的文档格式:txt, pdf, docx, doc, md, excel等
TikaDocumentReader reader = new TikaDocumentReader(resource);
List<Document> documents = reader.read();

2. 文本分片策略

使用TokenTextSplitter进行智能分片:

@Bean
public TokenTextSplitter tokenTextSplitter() {
return new TokenTextSplitter();
}

分片优势:

  • 避免文本过长超出模型token限制
  • 提高检索精度
  • 保持语义完整性

3. 向量检索优化

.advisors(QuestionAnswerAdvisor.builder(vectorStore)
.searchRequest(
SearchRequest.builder()
.query(message)
.similarityThreshold(0.1d)  // 相似度阈值
.topK(5)                    // 返回前5个最相关文档
.build()
)
.build())

4. 对话记忆管理

.defaultAdvisors(
PromptChatMemoryAdvisor.builder(chatMemory).build(),
SimpleLoggerAdvisor.builder().build()
)

🛡️ 安全与权限控制

1. JWT认证机制

@Configuration
public class ApplicationConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtTokenUserInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/api/v1/user/login", "/api/v1/user/register");
}
}

2. 敏感词过滤

// 敏感词过滤
List<SensitiveWord> list = sensitiveWordService.list();
for (SensitiveWord sensitiveWord : list) {
if (message.contains(sensitiveWord.getWord())) {
return Flux.just("您好,您输入的内容包含敏感词:" + sensitiveWord.getWord());
}
}

🚀 部署架构

1. 环境配置

# application.yml
server:
port: 8989
spring:
datasource:
url: jdbc:mysql://localhost:3306/heyou-rag
username: root
password: root
data:
redis:
host: localhost
port: 6379
password: redis
aliyun:
alioss:
endpoint: oss-cn-chengdu.aliyuncs.com
bucket-name: heyou-mall
spring:
ai:
dashscope:
api-key: ${ALI_API_KEY}

2. 容器化部署

# Dockerfile
FROM openjdk:17-jdk-slim
COPY target/xushu-rag-ai-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8989
ENTRYPOINT ["java", "-jar", "/app.jar"]
# docker-compose.yml
version: '3.8'
services:
backend:
build: .
ports:
- "8989:8989"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- mysql
- redis
- milvus

🔍 性能优化策略

1. 缓存优化

  • Redis缓存用户会话
  • 向量检索结果缓存
  • 敏感词列表缓存

2. 数据库优化

  • 索引优化
  • 分页查询
  • 连接池配置

3. 文件存储优化

  • 阿里OSS CDN加速
  • 文件压缩处理
  • 分片上传支持

📊 系统监控

1. 日志记录

@Aspect
@Slf4j
public class LoggingAspect {
@Around("@annotation(loggable)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long executionTime = System.currentTimeMillis() - start;
log.info("{} executed in {} ms", joinPoint.getSignature(), executionTime);
return proceed;
}
}

2. API监控

  • 请求响应时间统计
  • 错误率监控
  • 用户行为分析

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐