# 智医古籍通
**Repository Path**: liu-xinjin0/project
## Basic Information
- **Project Name**: 智医古籍通
- **Description**: 本项目是一个基于阿里云通义千问大语言模型的中医学习辅助系统,旨在帮助中医学习者和从业者快速理解古籍、查询方剂、辅助临床思路。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2025-10-04
- **Last Updated**: 2025-11-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 智医古籍通 - 基于大语言模型的中医经典问答与方剂辅助推荐系统

[](https://spring.io/projects/spring-boot)
[](https://vuejs.org/)
[](https://www.mysql.com/)
[](https://redis.io/)
[](LICENSE)
**一个融合传统中医智慧与现代AI技术的智能学习辅助平台**
[功能特性](#功能特性) • [技术架构](#技术架构) • [快速开始](#快速开始) • [在线演示](#在线演示) • [文档](#文档)
---
## 📖 项目简介
**智医古籍通**是一个基于阿里云通义千问大语言模型的中医学习辅助系统,旨在帮助中医学习者和从业者快速理解古籍、查询方剂、辅助临床思路。
### 核心痛点
- 📚 **古籍晦涩难懂** - 中医经典典籍文言文深奥,初学者难以理解
- 🔍 **检索效率低下** - 传统纸质书籍查询费时费力
- 💊 **症状方剂对应复杂** - 需要长期经验积累才能准确匹配
- 🎯 **缺乏智能工具** - 现有工具功能单一,交互体验差
### 解决方案
本系统通过集成大语言模型,提供三种AI医师角色(仲景先生、华佗助手、扁鹊老师),实现智能问答、症状匹配、方剂查询等功能,让中医学习更加高效便捷。
---
## ✨ 功能特性
### 🤖 智能古籍问答
- **三种AI医师角色**
- 🏛️ **仲景先生** - 经典权威,精通《伤寒论》,注重六经辨证
- ⚕️ **华佗助手** - 临床实用,融合现代经验,注重实践应用
- 🔍 **扁鹊老师** - 通俗易懂,深入浅出,适合初学者
- **实时流式输出** - 类似ChatGPT的逐字显示体验
- **多轮对话** - 支持上下文连续对话
- **历史记录** - 自动保存对话历史,支持一键恢复
### 💊 症状方剂推荐
- **智能症状输入**
- 自由文本输入(支持逗号、空格分隔)
- 25个常见症状快速标签
- 症状去重和智能合并
- **AI智能推荐**
- 基于症状的方剂匹配
- 匹配度评分(0-100分)
- 详细推荐理由和辨证分析
- **完整方剂信息**
- 组成药材(君臣佐使)
- 功效主治
- 用法用量
- 禁忌注意事项
### 📚 方剂知识查询
- **多维度搜索**
- 方剂名称搜索
- 功效主治搜索
- 类别筛选(解表剂、泻下剂等)
- 出处筛选(伤寒论、金匮要略等)
- **详细信息展示**
- 方剂基本信息
- 组成药材表格
- 方解分析
- 临床应用
- 相关方剂推荐
- **收藏管理**
- 一键收藏方剂
- 添加个人笔记
- 收藏列表管理
### 👤 用户中心
- **个人信息管理**
- 基本信息修改
- 密码修改(BCrypt加密)
- 头像上传(支持图片裁剪)
- **学习统计**
- 问答次数统计
- 匹配次数统计
- 收藏数量统计
- 学习天数统计
- **历史记录管理** ⭐ 新增
- 问答历史(支持恢复会话)
- **关键词搜索**(支持防抖、高亮显示)
- 症状匹配历史(支持恢复状态)
- 方剂查询历史(支持删除)
- 收藏管理
- **数据导出功能** ⭐ 新增
- **问答记录导出**(JSON/Markdown格式)
- **收藏列表导出**(JSON/Markdown格式)
- **学习统计报告**(JSON/Markdown格式)
- 自动生成带时间戳的文件名
- 支持引用出处和统计信息
---
## 🏗️ 技术架构
### 系统架构图
```
┌─────────────────────────────────────────────────────────┐
│ 用户层 (Browser) │
│ Chrome / Firefox / Safari / Edge │
└─────────────────────────────────────────────────────────┘
↕ HTTPS
┌─────────────────────────────────────────────────────────┐
│ 前端层 (Frontend) │
│ Vue 3 + Element Plus + Pinia + Vite │
│ Port: 3000 (Dev) │
└─────────────────────────────────────────────────────────┘
↕ RESTful API + SSE (JSON)
┌─────────────────────────────────────────────────────────┐
│ 后端层 (Backend) │
│ Spring Boot 3 + Spring Security + Spring JPA │
│ Port: 8080 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 认证服务 │ │ 问答服务 │ │ 方剂服务 │ │
│ └──────────┘ └────┬─────┘ └──────────┘ │
│ ┌──────────┐ ┌────┴─────┐ ┌──────────┐ │
│ │ 症状匹配 │ │ RAG服务 │ │ 用户服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
↕ ↕ ↕ ↕ ↕
┌──────────┐ ┌─────────┐ ┌────────┐ ┌──────────────┐
│MySQL 8.0 │ │Redis 6.0│ │Qdrant │ │阿里云DashScope│
│(持久化) │ │ (缓存) │ │(向量库)│ │ (LLM+Embedding)│
└──────────┘ └─────────┘ └────────┘ └──────────────┘
```
### 技术栈
#### 后端技术
| 技术 | 版本 | 说明 |
|------|------|------|
| **Spring Boot** | 3.2.0 | 核心框架 |
| **Spring Security** | 3.2.0 | 安全认证 |
| **Spring Data JPA** | 3.2.0 | ORM框架 + Specification动态查询 |
| **Spring WebFlux** | 3.2.0 | 调用AI API + SSE |
| **MySQL** | 8.0+ | 关系型数据库 |
| **Redis** | 6.0+ | 缓存 + 限流 + Token黑名单 + 会话存储 |
| **JWT** | 0.12.3 | Token认证 (HS512) |
| **Lombok** | 1.18.30 | 简化代码 |
| **SpringDoc OpenAPI** | 2.2.0 | API文档 (Swagger) |
| **Spring Boot Actuator** | 3.2.0 | 系统监控与健康检查 |
| **Jackson** | 2.15+ | JSON序列化 + Java 8日期时间支持 |
| **Qdrant Client** | 1.7.0 | 向量数据库Java客户端 |
| **Maven** | 3.9+ | 构建工具 |
#### 前端技术
| 技术 | 版本 | 说明 |
|------|------|------|
| **Vue 3** | 3.3.0 | 核心框架 (Composition API) |
| **Element Plus** | 2.4.0 | UI组件库 |
| **Pinia** | 2.1.0 | 状态管理 |
| **Vue Router** | 4.2.0 | 路由管理 |
| **Axios** | 1.5.0 | HTTP请求 |
| **Vite** | 4.4.9 | 构建工具 |
| **SCSS** | - | CSS预处理器 |
#### AI服务
| 服务 | 说明 |
|------|------|
| **阿里云通义千问** | qwen-plus模型 |
| **功能** | 古籍问答 + 症状匹配 |
| **特性** | 流式输出 (SSE) |
#### RAG检索
| 技术 | 版本/型号 | 说明 |
|------|----------|------|
| **Qdrant** | Latest | 开源向量数据库 |
| **DashScope Embedding** | text-embedding-v2 | 阿里云文本向量化API(1536维) |
| **检索策略** | Cosine Similarity | 余弦相似度匹配 |
| **数据存储** | Docker Volume | 持久化向量数据 |
---
## 🚀 快速开始
### 环境要求
- **JDK**: 17+
- **Node.js**: 16+
- **MySQL**: 8.0+
- **Redis**: 6.0+ (可选)
- **Maven**: 3.9+
### 1. 克隆项目
```bash
git clone https://github.com/yourusername/zhiyi-gujitong.git
cd zhiyi-gujitong
```
### 2. 数据库初始化
```bash
# 创建数据库
mysql -u root -p
mysql> CREATE DATABASE zhiyi_gujitong DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql> exit;
# 执行建表脚本
mysql -u root -p zhiyi_gujitong < database/schema.sql
# 导入示例数据
mysql -u root -p zhiyi_gujitong < database/data.sql
```
### 3. 后端启动
```bash
cd zhiyi-backend
# 修改配置文件
vim src/main/resources/application.yml
# 修改数据库密码、JWT密钥、通义千问API Key
# 启动后端
mvn spring-boot:run
# 或者打包运行
mvn clean package -DskipTests
java -jar target/gujitong-backend-1.0.0.jar
```
后端启动成功后访问: http://localhost:8080
Swagger文档: http://localhost:8080/swagger-ui/index.html
### 4. 前端启动
```bash
cd zhiyi-frontend
# 安装依赖
npm install
# 或使用 pnpm
pnpm install
# 启动开发服务器
npm run dev
# 生产构建
npm run build
```
前端启动成功后访问: http://localhost:3000
### 5. Redis启动 (可选)
```bash
# 如果未安装Redis,可跳过此步
# 限流功能需要Redis支持
redis-server
```
---
## 📸 功能展示
### 🏠 首页
点击查看
- 系统介绍
- 功能导航
- 快速入口
### 🤖 古籍问答
点击查看
- AI医师选择器(三种角色)
- 流式输出效果(逐字显示)
- 会话历史列表
- 多轮对话支持
### 💊 症状匹配
点击查看
- 症状输入界面
- 常见症状标签
- AI推荐结果卡片
- 匹配度评分展示
### 📚 方剂查询
点击查看
- 方剂搜索界面
- 多维度筛选
- 方剂详情页面
- 组成药材表格
---
## 📚 项目文档
- [需求规格说明书](docs/需求规格说明书.md) - 完整的需求文档
- [数据库设计文档](docs/数据库设计文档.md) - 数据库表结构和设计
- [API接口文档](docs/API接口文档.md) - RESTful API详细说明
- [项目实施总结](docs/项目实施总结文档.md) - 实际实现情况总结
- [RAG古籍检索使用说明](docs/RAG古籍检索使用说明.md) - RAG系统使用指南
- [Qdrant部署指南](docs/Qdrant部署指南.md) - 向量数据库部署文档
- [古籍数据准备与向量化指南](docs/古籍数据准备与向量化指南.md) - ⭐ 详细的数据导入和向量化教程
- [快速开始-RAG功能](docs/快速开始-RAG功能.md) - ⚡ 5分钟快速体验RAG检索
---
## 🗂️ 项目结构
```
zhiyi-gujitong/
├── zhiyi-backend/ # 后端项目
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/zhiyi/gujitong/
│ │ │ │ ├── annotation/ # 自定义注解
│ │ │ │ ├── aspect/ # AOP切面
│ │ │ │ ├── common/ # 公共类
│ │ │ │ ├── config/ # 配置类
│ │ │ │ ├── controller/ # 控制器
│ │ │ │ ├── dto/ # 数据传输对象
│ │ │ │ ├── entity/ # 实体类
│ │ │ │ ├── enums/ # 枚举
│ │ │ │ ├── exception/ # 异常处理
│ │ │ │ ├── interceptor/ # 拦截器
│ │ │ │ ├── repository/ # 数据访问层
│ │ │ │ ├── service/ # 服务层
│ │ │ │ ├── task/ # 定时任务
│ │ │ │ ├── util/ # 工具类
│ │ │ │ ├── vo/ # 视图对象
│ │ │ │ └── ZhiyiApplication.java
│ │ │ └── resources/
│ │ │ ├── application.yml
│ │ │ ├── application-dev.yml
│ │ │ ├── application-prod.yml
│ │ │ ├── db/ # 数据库脚本
│ │ │ └── prompts/ # AI提示词模板
│ │ └── test/ # 测试代码
│ └── pom.xml
│
├── zhiyi-frontend/ # 前端项目
│ ├── public/
│ ├── src/
│ │ ├── api/ # API接口
│ │ │ ├── modules/
│ │ │ │ ├── auth.js
│ │ │ │ ├── qa.js
│ │ │ │ ├── symptom.js
│ │ │ │ ├── formula.js
│ │ │ │ ├── favorite.js
│ │ │ │ └── user.js
│ │ │ ├── index.js
│ │ │ └── request.js
│ │ ├── assets/ # 静态资源
│ │ │ ├── images/
│ │ │ ├── fonts/
│ │ │ └── styles/
│ │ ├── components/ # 组件
│ │ │ ├── Chat/ # 聊天组件
│ │ │ ├── Common/ # 通用组件
│ │ │ ├── Formula/ # 方剂组件
│ │ │ ├── Layout/ # 布局组件
│ │ │ ├── Symptom/ # 症状组件
│ │ │ └── User/ # 用户组件
│ │ ├── router/ # 路由
│ │ ├── stores/ # Pinia状态管理
│ │ │ ├── modules/
│ │ │ │ ├── user.js
│ │ │ │ ├── chat.js
│ │ │ │ ├── symptom.js
│ │ │ │ ├── formula.js
│ │ │ │ └── app.js
│ │ │ ├── plugins/
│ │ │ │ └── persist.js
│ │ │ └── index.js
│ │ ├── utils/ # 工具函数
│ │ ├── views/ # 页面
│ │ │ ├── auth/ # 认证页面
│ │ │ ├── book-qa/ # 问答页面
│ │ │ ├── formula/ # 方剂页面
│ │ │ ├── home/ # 首页
│ │ │ ├── symptom/ # 症状匹配
│ │ │ └── user/ # 用户中心
│ │ ├── App.vue
│ │ └── main.js
│ ├── .env.development
│ ├── .env.production
│ ├── package.json
│ └── vite.config.js
│
├── database/ # 数据库脚本
│ ├── schema.sql # 建表脚本
│ └── data.sql # 初始数据
│
├── docs/ # 文档目录
│ ├── 需求规格说明书.md
│ ├── 数据库设计文档.md
│ ├── API接口文档.md
│ └── 项目实施总结文档.md
│
└── README.md # 本文件
```
---
## 🔧 配置说明
### 后端配置 (application.yml)
```yaml
# 数据库配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/zhiyi_gujitong
username: root
password: YOUR_PASSWORD # 修改为你的数据库密码
# JWT配置
jwt:
secret: YOUR_JWT_SECRET_KEY # 修改为你的JWT密钥(至少512位)
expiration: 7200000 # 2小时
# 通义千问配置
qianwen:
api-key: YOUR_QIANWEN_API_KEY # 修改为你的通义千问API Key
api-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
model: qwen-plus
```
### 前端配置 (.env.development)
```bash
# API地址
VITE_API_BASE_URL=http://localhost:8080
# 应用标题
VITE_APP_TITLE=智医古籍通
```
---
## 🎯 核心功能实现
### 1. 流式输出 (SSE)
**后端实现**:
```java
@PostMapping("/ask/stream")
public Flux> askStream(@RequestBody QaRequest request) {
return qaService.askStream(request, userId)
.map(chunk -> ServerSentEvent.builder()
.data(chunk)
.build());
}
```
**前端实现**:
```javascript
const response = await fetch('/api/v1/qa/ask/stream', {
method: 'POST',
body: JSON.stringify(data)
})
const reader = response.body.getReader()
const decoder = new TextDecoder()
while (true) {
const { done, value } = await reader.read()
if (done) break
const chunk = decoder.decode(value)
aiMessage.content += chunk // 逐字追加
}
```
### 2. JWT认证
**Token生成**:
```java
String token = Jwts.builder()
.setSubject(userId.toString())
.claim("username", user.getUsername())
.claim("userType", user.getUserType())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(Keys.hmacShaKeyFor(secret.getBytes()), SignatureAlgorithm.HS512)
.compact();
```
**Token验证**:
```java
@Component
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, ...) {
String token = request.getHeader("Authorization");
if (!jwtUtil.validateToken(token)) {
throw new AuthenticationException("Token无效");
}
Long userId = jwtUtil.getUserIdFromToken(token);
request.setAttribute("userId", userId);
return true;
}
}
```
### 3. Spring Data JPA
**方法名查询**:
```java
@Repository
public interface FormulaRepository extends JpaRepository {
// JPA自动实现
Optional findByFormulaName(String name);
Page findByCategoryAndStatus(String category, Integer status, Pageable pageable);
}
```
**JPQL查询**:
```java
@Query("SELECT f FROM Formula f WHERE f.status = 1 AND " +
"(f.formulaName LIKE %:keyword% OR f.efficacy LIKE %:keyword%)")
Page searchByKeyword(@Param("keyword") String keyword, Pageable pageable);
```
---
## 📊 数据统计
### 代码量
- **后端代码**: ~15,000 行
- **前端代码**: ~12,000 行
- **配置文件**: ~1,500 行
- **文档**: ~8,000 行
### 模块统计
- **后端模块**: 60+ 类文件
- **前端组件**: 30+ 组件
- **API接口**: 30+ 接口
- **数据库表**: 14 张表
---
## ✅ 项目完成度
| 模块 | 完成度 | 说明 |
|------|--------|------|
| 用户认证 | ✅ 100% | 注册、登录、JWT认证、Token黑名单 |
| 古籍问答 | ✅ 100% | 三种AI角色、流式输出、RAG检索、历史记录、搜索 |
| RAG检索 | ✅ 100% | Qdrant向量数据库、DashScope Embedding、古籍引用展示 |
| 症状匹配 | ✅ 100% | 智能推荐、历史恢复 |
| 方剂查询 | ✅ 100% | 搜索、详情、收藏、动态排序、历史删除 |
| 用户中心 | ✅ 100% | 个人信息、历史记录、统计、头像上传、数据导出 |
| 系统监控 | ✅ 100% | Actuator健康检查、错误提示优化 |
| 性能优化 | ✅ 100% | Redis缓存、N+1查询优化、防抖处理 |
| **总体完成度** | **✅ 100%** | 所有核心功能已全部实现 |
### 最近完成 (2025-10-29) 🎉
- ✅ **历史记录搜索** - 支持关键词搜索、防抖、高亮显示
- ✅ **方剂历史删除** - 后端API + 前端集成
- ✅ **数据导出功能** - JSON/Markdown双格式,支持问答、收藏、统计
- ✅ **Redis缓存优化** - 方剂分类、来源书籍、QA会话缓存
- ✅ **性能优化** - 修复N+1查询问题,查询性能提升10倍以上
- ✅ **Markdown导出修复** - 修复响应拦截器Blob处理问题
- ✅ **方剂排序功能** - 使用JPA Specification实现动态排序
### 最新完成 (2025-10-31) 🎉
- ✅ **RAG古籍检索系统** - 基于Qdrant + DashScope Embedding实现
- 智能语义检索,准确匹配相关古籍
- 自动附带书名、篇章、页码、原文片段
- 原文、白话文、注释三位一体展示
- 相关度评分,可信度更高
### 待完成功能
- ❌ 账号注销(合规需求)
- ❌ 批量操作(批量删除历史记录等)
- ❌ PDF格式导出(可选)
---
## 🐛 已知问题
1. **单元测试覆盖率不足** - 需要补充Service层测试
2. **部分功能UI预留但未实现** - 如批量删除历史记录、账号注销等
3. **RAG检索需要古籍数据** - 首次使用需要向量化古籍内容(详见[RAG古籍检索使用说明](docs/RAG古籍检索使用说明.md))
**已修复问题**:
- ✅ ~~Redis缓存策略~~ - 已优化,实现了方剂分类、来源书籍、QA会话缓存
- ✅ ~~方剂排序无效~~ - 已修复,使用JPA Specification实现
- ✅ ~~Markdown导出异常~~ - 已修复响应拦截器Blob处理
- ✅ ~~N+1查询性能问题~~ - 已优化,性能提升10倍以上
详见: [项目实施总结文档.md](docs/项目实施总结文档.md#9-已知问题与todo)
---
## 🔮 后续规划
### 已完成 ✅ (2025-10-29)
- [x] ~~实现头像上传功能~~ ✅ 已完成
- [x] ~~Token黑名单机制~~ ✅ 已完成
- [x] ~~系统监控接口(Actuator)~~ ✅ 已完成
- [x] ~~数据导出功能~~ ✅ 已完成(JSON/Markdown双格式)
- [x] ~~性能优化和压力测试~~ ✅ 已完成(N+1查询优化、防抖)
- [x] ~~方剂数据Redis缓存~~ ✅ 已完成(分类、来源、QA会话)
- [x] ~~历史记录搜索~~ ✅ 已完成(关键词高亮、防抖)
- [x] ~~方剂排序功能~~ ✅ 已完成(Specification动态排序)
### 下一期计划 🚀 (2-3周)
**优先级1: 古籍RAG检索系统** ⭐⭐⭐⭐⭐
- [ ] Week 1: 古籍数据收集与向量化
- 四大经典(黄帝内经、伤寒论、金匮要略、神农本草经)
- 部署Qdrant向量数据库
- 使用智谱AI Embedding
- [ ] Week 2: RAG检索服务开发
- 检索API实现
- 提示词工程优化
- 引用出处展示
- [ ] Week 3: 前端集成与优化
- UI改造(展示古籍引用)
- 性能测试
- 用户体验优化
**优先级2: 智能推荐算法** ⭐⭐⭐⭐
- [ ] 用户行为数据建模
- [ ] 协同过滤算法实现
- [ ] 基于内容的推荐
- [ ] A/B测试与效果评估
### 长期规划 (3-6月)
- [ ] 知识图谱构建
- [ ] 移动端适配(响应式设计)
- [ ] 微信小程序开发
- [ ] 单元测试完善(覆盖率>80%)
- [ ] 部署与运维(Docker + CI/CD)
---
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
### 提交规范
```bash
feat: 新功能
fix: 修复bug
docs: 文档更新
style: 代码格式调整
refactor: 重构
test: 测试相关
chore: 构建/工具变动
# 示例
git commit -m "feat(chat): 添加流式输出功能"
git commit -m "fix(auth): 修复JWT Token验证错误"
```
---
## 📄 许可证
本项目采用 [MIT](LICENSE) 许可证。
---
## 👥 团队成员
- **项目负责人**: [Your Name]
- **后端开发**: [Backend Developer]
- **前端开发**: [Frontend Developer]
- **UI设计**: [UI Designer]
---
## 📧 联系方式
- **项目主页**: https://github.com/yourusername/zhiyi-gujitong
- **问题反馈**: https://github.com/yourusername/zhiyi-gujitong/issues
- **邮箱**: dev@zhiyigujitong.com
---
## 🙏 致谢
- 感谢 [阿里云通义千问](https://tongyi.aliyun.com/) 提供强大的AI能力
- 感谢 [Spring Boot](https://spring.io/projects/spring-boot) 和 [Vue.js](https://vuejs.org/) 社区
- 感谢所有开源项目的贡献者
---
**⭐ 如果这个项目对你有帮助,请给一个Star!⭐**
Made with ❤️ by Zhiyi Team
[⬆ 回到顶部](#智医古籍通---基于大语言模型的中医经典问答与方剂辅助推荐系统)