diff --git a/.env.example b/.env.example index 5a9b6eb..3376377 100644 --- a/.env.example +++ b/.env.example @@ -1,14 +1,14 @@ # ==================== 部署模式说明 ==================== -# 1. 默认 Docker 一体化部署(./start.sh / docker-compose.yml): +# 1. 全量 Docker 部署(./scripts/deploy-full.sh / docker-compose.yml): # 只使用当前文件(根目录 .env)和 Docker Compose 注入的环境变量,不读取 backend/.env。 -# 2. 直接运行后端或外接中间件部署: -# `start-external.sh` 也只读取当前文件; +# 2. 半部署 / 应用部署(./scripts/deploy-app-only.sh): +# 只启动 backend/frontend,不启动 MySQL/Redis; # 外接中间件时可直接在这里填写 MYSQL_* / REDIS_*,脚本会转换给后端使用。 # ==================== 数据库配置 ==================== # MySQL 初始化参数(Docker 内置 MySQL)。 # 当后端也运行在 Docker 中时,数据库主机应为服务名 `mysql`。 -# 使用 `./start-external.sh` 时,请改成外部 MySQL 地址或服务名。 +# 使用 `./scripts/deploy-app-only.sh` 时,请改成外部 MySQL 地址或服务名。 MYSQL_HOST=mysql MYSQL_ROOT_PASSWORD=change_this_password MYSQL_DATABASE=imeeting @@ -19,7 +19,7 @@ MYSQL_PORT=3306 # ==================== 缓存配置 ==================== # Redis 初始化参数(Docker 内置 Redis)。 # 当后端也运行在 Docker 中时,Redis 主机应为服务名 `redis`。 -# 使用 `./start-external.sh` 时,请改成外部 Redis 地址或服务名。 +# 使用 `./scripts/deploy-app-only.sh` 时,请改成外部 Redis 地址或服务名。 REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD=change_this_password diff --git a/.gitignore b/.gitignore index 70f3274..4fd6cd4 100644 --- a/.gitignore +++ b/.gitignore @@ -29,11 +29,8 @@ backend/uploads/ backend/logs/ backend/venv/ backend/test/ -# Only keep the latest full-deploy SQL entrypoints in repo -backend/sql/* -!backend/sql/imeeting-schema-latest.sql -!backend/sql/imeeting-seed-latest.sql -backend/sql/migrations/ +# Full-deploy SQL entrypoints are kept under scripts/sql/. +backend/sql/ backend/scripts/ 资料/ diff --git a/DOCKER_README.md b/DOCKER_README.md deleted file mode 100644 index 0150d15..0000000 --- a/DOCKER_README.md +++ /dev/null @@ -1,439 +0,0 @@ -# Docker部署快速开始 - -本目录包含完整的Docker Compose部署配置,支持一键部署iMeeting应用。 - -## 📋 文件说明 - -| 文件 | 说明 | -|------|------| -| `docker-compose.yml` | Docker Compose配置文件 | -| `.env.example` | 环境变量模板 | -| `.dockerignore` | Docker构建忽略文件 | -| `start.sh` ⭐ | 一键启动脚本(推荐) | -| `stop.sh` | 停止服务脚本 | -| `manage.sh` | 服务管理脚本 | -| `DOCKER_README.md` | 本文档 | - -## 🏗️ 系统架构 - -``` -方式一:直接访问 - 用户 → http://服务器IP → iMeeting Frontend(Web) (80) → Frontend/Backend - -方式二:域名访问(HTTPS) - 用户 → https://domain → 接入服务器Nginx (SSL) → iMeeting服务器 (80) → Frontend/Backend -``` - -**4个服务容器**: -- **Frontend**: React前端应用 -- **Backend**: FastAPI后端服务 -- **MySQL**: 数据库 -- **Redis**: 缓存 - -**数据持久化**: -- `./data/` - 所有数据存储在此目录 - -## 🚀 快速开始 - -### 方式一:使用启动脚本(推荐) - -```bash -# 1. 复制并配置环境变量 -cp .env.example .env -vim .env # 配置 BASE_URL、密码等 - -# 2. 一键启动 -./start.sh -``` - -说明: -- 完整 Docker 一体化部署不会读取 `backend/.env` - -脚本会自动完成: -- ✅ 检查Docker依赖 -- ✅ 创建必要目录 -- ✅ 启动所有服务 -- ✅ 等待健康检查 - -说明: -- 后端镜像现在依赖系统级 `ffmpeg/ffprobe` 做音频预处理,已在 `backend/Dockerfile` 中安装,无需宿主机额外安装。 - -### 方式二:手动启动 - -```bash -# 1. 配置环境变量 -cp .env.example .env -vim .env # 配置主环境变量 - -# 2. 启动所有服务 -docker-compose up -d - -# 3. 查看服务状态 -docker-compose ps -``` - -## 🌐 访问地址 - -启动成功后: - -**直接访问(HTTP)**: -- **HTTP访问**: http://localhost 或 http://服务器IP -- **API文档**: http://localhost/docs 或 http://服务器IP/docs -- **API路径**: http://localhost/api/ 或 http://服务器IP/api/ - -**域名访问(HTTPS)**: -- 需要在接入服务器配置Nginx反向代理 -- 参考本文“域名和 HTTPS 配置”章节 -- 访问示例:https://imeeting.yourdomain.com - -## ⚙️ 环境变量配置 - -### 必须配置项 - -编辑根目录 `.env` 文件,修改以下配置: - -```bash -# Docker 一体化部署下,后端容器访问内置 MySQL/Redis 使用服务名 -MYSQL_HOST=mysql -REDIS_HOST=redis - -# 生产环境必改密码 -MYSQL_ROOT_PASSWORD=change_this_password -MYSQL_PASSWORD=change_this_password -REDIS_PASSWORD=change_this_password -``` - -### 可选配置项 - -```bash -# 应用访问地址(用于生成外链,以及音频转录时给云端拉取音频文件) -# 如果使用云端音频转录,必须改成外部可访问的域名或公网地址,不能填写 localhost / 127.0.0.1 / 容器名 -BASE_URL=http://localhost # 生产环境改为: https://your-domain.com - -# Nginx端口(默认80/443) -HTTP_PORT=80 -HTTPS_PORT=443 - -# 如需调整容器对外端口 -# BACKEND_PORT=8000 -# HTTP_PORT=80 -``` - -### 外接 MySQL / Redis 部署 - -如果使用 `./start-external.sh`,直接修改根目录 `.env` 即可,不需要 `backend/.env`: - -```bash -cp .env.example .env -vim .env -``` - -根目录 `.env` 里需要重点配置: - -- `MYSQL_HOST` / `MYSQL_PORT` / `MYSQL_USER` / `MYSQL_PASSWORD` / `MYSQL_DATABASE` -- `REDIS_HOST` / `REDIS_PORT` / `REDIS_DB` / `REDIS_PASSWORD` -- `BASE_URL` - -说明: -- `start-external.sh` 会优先读取 `.env` 中的 `DB_*`;如果未设置,则自动回退到 `MYSQL_*` - -### 音频预处理依赖 - -- Docker 部署:后端容器内已安装 `ffmpeg` -- 非 Docker 部署:请确保服务器可执行 `ffmpeg` 和 `ffprobe` - -## 📦 数据目录 - -所有数据存储在 `./data/` 目录: - -``` -data/ -├── mysql/ # MySQL数据库文件 -├── redis/ # Redis持久化文件 -├── uploads/ # 用户上传的文件(音频、图片等) -└── logs/ # 日志文件 - ├── backend/ - ├── frontend/ - └── frontend/ -``` - -**重要提示**: -- 定期备份 `data/` 目录 -- 生产环境建议挂载独立数据盘到 `./data/` - -## 🔧 日常管理 - -### 使用管理脚本(推荐) - -```bash -./manage.sh -``` - -交互式菜单提供以下功能: -1. 查看服务状态 -2. 查看实时日志 -3. 重启所有服务 -4. 重启单个服务 -5. 进入容器终端 -6. **备份数据库** -7. 恢复数据库 -8. 清理Redis缓存 -9. 更新服务 -10. 查看资源使用 -11. 导出日志 - -### 常用命令 - -```bash -# 查看服务状态 -docker-compose ps - -# 查看日志 -docker-compose logs -f # 所有服务 -docker-compose logs -f frontend # 前端Web日志 -docker-compose logs -f backend # 后端日志 -tail -f data/logs/frontend/*.log # 前端容器日志目录 - -# 重启服务 -docker-compose restart # 重启所有 -docker-compose restart frontend # 重启前端 - -# 停止服务 -./stop.sh # 交互式停止 -docker-compose down # 停止并删除容器 -``` - -## 🔐 域名和HTTPS配置 - -iMeeting服务器本身仅提供HTTP服务。如需通过域名访问(HTTPS),需要在接入服务器配置Nginx反向代理。 - -### 配置接入服务器 - -完整配置步骤请参考本文档中的反向代理章节 - -**简要步骤**: -1. 在接入服务器安装Nginx -2. 使用Let's Encrypt获取SSL证书 -3. 配置Nginx反向代理到iMeeting服务器IP -4. 配置DNS A记录指向接入服务器 - -**配置示例**: -```nginx -server { - listen 443 ssl http2; - server_name imeeting.yourdomain.com; - - ssl_certificate /etc/letsencrypt/live/imeeting.yourdomain.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/imeeting.yourdomain.com/privkey.pem; - - location / { - proxy_pass http://iMeeting服务器IP:80; - # ... 其他配置 - } -} -``` - -详见:本文档中的反向代理章节 - -## 🔍 故障排查 - -### 查看日志 - -```bash -# 服务日志 -docker-compose logs -f - -# 文件日志 -tail -f data/logs/frontend/*.log -tail -f data/logs/backend/*.log -``` - -### 检查服务状态 - -```bash -docker-compose ps -``` - -所有服务应显示 `healthy` 状态。 - -### 测试连接 - -```bash -# 测试Nginx -curl http://localhost/health - -# 测试HTTPS -curl -k https://localhost/health - -# 测试API文档 -curl http://localhost/docs -``` - -### 常见问题 - -| 问题 | 解决方法 | -|------|----------| -| 端口被占用 | 修改.env中的HTTP_PORT | -| 502错误 | 检查backend和frontend是否健康 | -| 数据库连接失败 | 检查根目录 `.env` 中的数据库配置;外接中间件模式确认 `MYSQL_HOST` / `DB_HOST` 是否正确 | -| 前端无法访问API | 检查VITE_API_BASE_URL配置 | -| 音频转录拉不到音频文件 | 检查 `BASE_URL` 是否为云端可访问的完整地址 | -| 如何配置HTTPS | 参考本文档中的反向代理章节 | - -详见:`DOCKER_README.md` 故障排查章节 - -## 📊 服务组件 - -| 服务 | 容器名 | 内部端口 | 外部端口 | 健康检查 | -|------|--------|----------|----------|----------| -| Frontend(Web) | imeeting-frontend | 80 | 80 | ✅ | -| Backend | imeeting-backend | 8000 | 8000 | ✅ | -| MySQL | imeeting-mysql | 3306 | - | ✅ | -| Redis | imeeting-redis | 6379 | - | ✅ | - -外部仅暴露Nginx的80端口(HTTP),其他服务通过内部网络通信。 -如需HTTPS,请在接入服务器配置SSL。 - -## 🔄 更新部署 - -### 更新代码 - -```bash -# 拉取最新代码 -git pull - -# 重新构建 -docker-compose build - -# 重启服务 -docker-compose up -d -``` - -### 仅更新前端 - -```bash -cd frontend -npm run build -cd .. -docker-compose build frontend -docker-compose up -d frontend -docker-compose restart frontend -``` - -### 仅更新后端 - -```bash -docker-compose build backend -docker-compose up -d backend -``` - -## 💾 备份与恢复 - -### 备份数据库 - -```bash -# 使用管理脚本 -./manage.sh # 选择"6) 备份数据库" - -# 或手动执行 -docker-compose exec mysql mysqldump -uroot -p imeeting > backup.sql -``` - -### 备份所有数据 - -```bash -# 备份data目录 -tar czf imeeting_backup_$(date +%Y%m%d).tar.gz data/ - -# 备份配置 -tar czf imeeting_config_$(date +%Y%m%d).tar.gz .env frontend/nginx.conf -``` - -### 恢复数据 - -```bash -# 恢复数据库 -docker-compose exec -T mysql mysql -uroot -p imeeting < backup.sql - -# 恢复data目录 -tar xzf imeeting_backup_20240101.tar.gz -``` - -## 🛡️ 安全提示 - -生产环境部署前,请务必: - -1. ✅ **修改所有默认密码** - - MYSQL_ROOT_PASSWORD - - MYSQL_PASSWORD - - REDIS_PASSWORD - -2. ✅ **配置真实SSL证书** - - 使用Let's Encrypt或商业证书 - - 不要使用自签名证书 - -3. ✅ **设置文件权限** - ```bash - chmod 600 .env - 确保接入层反向代理证书文件权限正确 - ``` - -4. ✅ **启用防火墙** - ```bash - ufw allow 80/tcp - ufw allow 443/tcp - ufw enable - ``` - -5. ✅ **定期备份数据** - - 设置自动备份脚本 - - 异地备份 - -6. ✅ **监控日志** - - 定期检查错误日志 - - 设置日志轮转 - -## 📚 更多信息 - -详细的部署说明、配置选项、性能优化等,请查看: - -- **部署说明**: [DOCKER_README.md](DOCKER_README.md) -- **前端代理配置**: [frontend/nginx.conf](frontend/nginx.conf) - -## 🆘 获取帮助 - -如遇问题: - -1. 查看日志:`docker-compose logs -f` -2. 查看健康状态:`docker-compose ps` -3. 查看详细文档:`DOCKER_README.md` -4. 提交Issue到项目仓库 - -## 📞 快速命令参考 - -```bash -# 启动 -./start.sh # 一键启动(推荐) -docker-compose up -d # 启动所有服务 - -# 管理 -./manage.sh # 管理菜单(推荐) -docker-compose ps # 查看状态 -docker-compose logs -f # 查看日志 -docker-compose restart # 重启服务 - -# 停止 -./stop.sh # 停止服务(推荐) -docker-compose down # 停止并删除容器 - -# 备份 -./manage.sh # 选择备份功能 -tar czf backup.tar.gz data/ # 备份所有数据 - -# 更新 -git pull && docker-compose build && docker-compose up -d -``` - ---- - -**祝您使用愉快!** 🎉 diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md deleted file mode 100644 index de5cc84..0000000 --- a/IMPLEMENTATION_PLAN.md +++ /dev/null @@ -1,27 +0,0 @@ -# UI Modernization & Standardization Plan - -## Stage 1: Foundation (Global Theme & Layout) -**Goal**: Establish a consistent visual base and layout structure. -**Success Criteria**: -- Global `ConfigProvider` with a modern theme (v5 tokens). -- A reusable `MainLayout` component replacing duplicated header/sidebar logic. -- Unified navigation experience across Admin and User dashboards. -**Status**: Complete - -## Stage 2: Component Standardization -**Goal**: Replace custom, inconsistent components with Ant Design standards. -**Success Criteria**: -- `ListTable` and `DataTable` replaced by `antd.Table`. (Complete) -- `FormModal` and `ConfirmDialog` replaced by `antd.Modal`. (Complete) -- `Toast` and custom notifications replaced by `antd.message` and `antd.notification`. (Complete) -- Custom `Dropdown`, `Breadcrumb`, and `PageLoading` replaced by `antd` equivalents. (Complete) -**Status**: Complete - -## Stage 3: Visual Polish & UX -**Goal**: Enhance design details and interactive experience. -**Success Criteria**: -- Modernized dashboard cards with subtle shadows and transitions. (Complete) -- Standardized `Empty` states and `Skeleton` loaders. (Complete) -- Responsive design improvements for various screen sizes. (Complete) -- Clean up redundant CSS files and components. (In Progress) -**Status**: In Progress diff --git a/README.md b/README.md index f241cbe..0da2855 100644 --- a/README.md +++ b/README.md @@ -1,178 +1,50 @@ # iMeeting - 智慧会议平台 -## 项目简介 +iMeeting 是一个基于 AI 技术的智能会议记录与内容管理平台,支持会议音频上传、异步语音转录、说话人识别、AI 会议纪要生成、知识库沉淀和后台管理。 -iMeeting 是一个基于 AI 技术的智能会议记录与内容管理平台,通过自动化的语音转录、说话人识别和 AI 摘要功能,帮助专业人士高效管理会议内容,从繁琐的记录工作中解放出来。 +## 快速入口 -## 核心价值 +### 全量部署 -- **解放生产力** - 自动化的会议转录和摘要,让用户从繁琐的记录工作中解放出来 -- **信息不丢失** - 精准记录每一次会议的细节,确保关键信息和决策得到妥善保存 -- **高效回顾** - 通过时间轴、发言人和关键词,快速定位会议内容 -- **便捷分享** - 轻松分享会议纪要、材料和关键节点给相关人员 +启动前端、后端、MySQL 和 Redis: + +```bash +cp .env.example .env +vim .env +./scripts/deploy-full.sh +``` + +### 半部署 + +只启动前端和后端,MySQL / Redis 使用外部服务: + +```bash +cp .env.example .env +vim .env +./scripts/deploy-app-only.sh +``` + +## 常用文档 + +- 部署文档:[design/deployment.md](./design/deployment.md) +- 项目设计:[design/project.md](./design/project.md) +- 数据库设计:[design/database.md](./design/database.md) +- AI 集成方案:[design/ai-integration.md](./design/ai-integration.md) +- 代码结构规范:[design/code-structure-standards.md](./design/code-structure-standards.md) + +## 目录说明 + +```text +backend/ 后端 FastAPI 服务 +frontend/ 前端 React 应用 +scripts/ 部署脚本和全量部署 SQL +design/ 项目设计、部署和技术文档 +``` ## 技术栈 -### 平台端 (Backend) -- **框架**: Python 3.9+ / FastAPI -- **数据库**: MySQL 5.7+ -- **缓存**: Redis 5.0+ -- **AI服务**: 阿里云通义千问 (Dashscope) - - 语音识别: Paraformer-v2 - - 说话人分离 - - 大语言模型摘要 -- **存储**: 本地对象存储 -- **身份认证**: JWT / Python-JOSE -- **部署**: Docker / Nginx - -### 客户端 (Frontend) -- **框架**: React 19.1 + Vite 7.0 -- **UI组件**: Ant Design 5.27 -- **路由**: React Router DOM 7.7 -- **Markdown**: @uiw/react-md-editor 4.0 -- **可视化**: Markmap (思维导图) -- **其他工具**: - - Axios (HTTP 客户端) - - html2canvas + jsPDF (导出功能) - - QRCode.react (二维码生成) - - Lucide React (图标库) - -## 功能模块 - -### 平台功能 - -| 功能模块 | 功能描述 | 状态 | -|---------|---------|------| -| **用户管理** | 用户创建、编辑、删除、密码重置、角色权限管理 | ✅ 已完成 | -| **会议管理** | 会议创建、编辑、删除、参会人员管理 | ✅ 已完成 | -| **音频处理** | 音频文件上传、存储、格式验证 | ✅ 已完成 | -| **异步转录服务** | 基于Paraformer的异步语音识别 | ✅ 已完成 | -| **说话人分离** | 基于CAM++ ,支持自定义标签 | ✅ 已完成 | -| **AI 摘要生成** | 异步生成会议纪要,支持自定义 Prompt | ✅ 已完成 | -| **任务状态管理** | 转录任务和 LLM 任务的状态追踪 | ✅ 已完成 | -| **声纹采集** | 用户声纹数据采集和管理 | ✅ 已完成 | -| **身份认证** | JWT Token 认证、登录登出、Token 刷新 | ✅ 已完成 | -| **图片上传** | 会议相关图片上传,支持 Markdown 引用 | ✅ 已完成 | -| **多会议知识模块** | 基于多会议摘要的知识总结 | ✅ 已完成 | -| **完整的对外接口** | 提供基于PC客户端、手机客户端、专用设备的服务接口 | ✅ 已完成 | -| | | | -| *待扩展功能* | *以下功能将在后续版本中添加* | | -| **对话模式的M-Agent** | 对话模式的会议Agent| | -| **平台多租户**| 云平台支持多租户| | - -### PC客户端功能 - -| 功能模块 | 功能描述 | 状态 | -|---------|---------|------| -| **用户登录** | 登录界面、Token 存储、自动登录 | ✅ 已完成 | -| **会议列表** | 会议展示、筛选、搜索 | ✅ 已完成 | -| **会议采集** | 支持快速会议和自定义会议 | ✅ 已完成 | -| **导出功能** | 会议纪要预览 | ✅ 已完成 | -| **响应式设计** | 适配不同屏幕尺寸 | ✅ 已完成 | -| | | | -| *待扩展功能* | *以下功能将在后续版本中添加* | | -| **声纹采集界面** | 声纹录制、上传、状态管理 | | -| **会议总结概览** | 获取按会议ID的总结一览| | - -### 手机客户端功能 -| 功能模块 | 功能描述 | 状态 | -|---------|---------|------| - -## 快速开始 - -### 环境要求 - -- Node.js 22.12+ -- Python 3.12+ -- MySQL 5.7+ -- Redis 5.0+ -- Docker (可选) - -### 安装与运行 - -#### 后端启动 - -```bash -cd backend -pip install -r requirements.txt -python app/main.py -``` - -默认运行在 `http://localhost:8000` - -#### 前端启动 - -```bash -cd frontend -npm install -npm run dev -``` - -默认运行在 `http://localhost:5173` - -#### 使用 Conda 一键启动前后端 - -项目根目录提供了 Conda 启动脚本,会分别创建并使用独立环境启动前后端: - -- 后端环境: `imetting_backend` (Python 3.12) -- 前端环境: `imetting_frontend` (Node.js 22) - -```bash -./start-conda.sh -``` - -### 配置说明 - -详细的配置文档请参考: -- 数据库设计: [database.md](./database.md) -- 项目详细设计: [project.md](./project.md) -- AI 集成文档: [AI.md](./AI.md) - -## 核心特性 - -### 异步任务处理 - -系统采用异步任务架构,支持大文件和长时间处理: - -- **语音转录任务**: 基于阿里云 Dashscope 的异步 API,支持任务状态追踪 -- **AI 摘要任务**: 使用 FastAPI BackgroundTasks,支持进度更新和轮询 - -### 数据安全 - -- JWT Token 认证机制 -- 基于角色的权限控制 (RBAC) -- 密码 bcrypt 加密 -- Token 黑名单机制 - -### 高性能 - -- Redis 缓存任务状态 -- 异步处理避免阻塞 -- 分页查询优化 -- 音频流式传输 - -## API 文档 - -启动后端服务后,访问以下地址查看 API 文档: - -- Swagger UI: `http://localhost:8000/docs` -- ReDoc: `http://localhost:8000/redoc` - -## 未来规划 - -- [ ] 实时转录 - 支持对正在进行的会议进行实时语音转文字 -- [ ] 日历集成 - 与 Google Calendar、Outlook Calendar 集成 -- [ ] 行动项提取 - AI 自动识别会议中的待办事项 -- [ ] 跨会议搜索 - 对所有会议内容进行全文语义搜索 -- [ ] 移动端应用 - 开发 iOS 和 Android 原生应用 -- [ ] 多语言支持 - 支持中英文等多语言界面 -- [ ] 会议协作 - 支持多人实时协作编辑会议纪要 -- [ ] 数据分析 - 会议统计分析和可视化报表 - -## 许可证 - -[请添加许可证信息] - -## 联系方式 - -[请添加联系方式] +- 后端:Python / FastAPI +- 前端:React / Vite / Ant Design +- 数据库:MySQL +- 缓存:Redis +- 部署:Docker Compose diff --git a/ROADMAP.md b/ROADMAP.md deleted file mode 100644 index 1bd1800..0000000 --- a/ROADMAP.md +++ /dev/null @@ -1,908 +0,0 @@ -# iMeeting 产品路线图 - -## 项目概述 - -iMeeting 是一个智能会议管理和知识库系统,旨在通过 AI 技术提升会议效率,自动生成会议纪要,并从多次会议中提炼知识。 - ---- - -## Phase 1: 基础会议管理与知识库系统(已完成) - -### 核心功能 - -#### 1. 会议管理 -- **会议创建与录音**:支持创建会议并关联音频文件 -- **音频转录**:基于阿里云 DashScope 的语音识别,支持异步转录 -- **AI 总结生成**:使用大语言模型(通义千问)自动生成会议纪要 -- **提示词模版**:支持预定义和自定义提示词模版,适配不同会议场景 -- **标签系统**:支持为会议添加标签,方便分类和检索 - -#### 2. 知识库系统 -- **基于会议的知识提炼**:从多个会议纪要中提炼知识库内容 -- **自定义提示词**:用户可以指定特定的分析角度和总结需求 -- **Markdown 输出**:知识库内容以 Markdown 格式存储和展示 -- **标签关联**:支持知识库的标签分类 -- **共享机制**:支持知识库的个人/共享模式 - -#### 3. 用户权限管理 -- **用户认证**:基于 JWT 的用户登录与会话管理 -- **角色权限**:区分普通用户和管理员 -- **菜单权限**:动态菜单权限控制系统 - -#### 4. 管理后台 -- **用户管理**:用户创建、编辑、删除、权限配置 -- **系统监控**:在线用户、任务监控、系统资源监控 -- **提示词仓库**:集中管理所有提示词模版 - -### 技术架构 - -#### 后端技术栈 -- **框架**:FastAPI(Python) -- **数据库**:MySQL 8.0 -- **缓存**:Redis 5.0+ -- **AI 服务**:阿里云 DashScope(通义千问) -- **对象存储**:七牛云 OSS -- **异步任务**:FastAPI BackgroundTasks - -#### 前端技术栈 -- **框架**:React 18 -- **路由**:React Router -- **UI 组件**:Ant Design + 自定义组件 -- **Markdown 渲染**:react-markdown - -#### 数据模型(核心表) -- `users`:用户表 -- `meetings`:会议表 -- `knowledge_bases`:知识库表 -- `prompts`:提示词模版表 -- `transcription_tasks`:转录任务表 -- `summary_tasks`:总结任务表 -- `knowledge_base_tasks`:知识库生成任务表 -- `tags`:标签表 - ---- - -## Phase 2: 知识库系统大升级(规划中) - -### 升级目标 - -将知识库系统从单一的"会议纪要汇总"升级为功能完整的"AI 知识助手",参考 NotebookLM 的交互模式,提供多维度的知识管理和音频播客生成能力。 - ---- - -### 1. 输入来源扩展 - -#### 1.1 功能需求 -- ✅ **会议来源**(已支持):从多个会议纪要中提炼 -- 🆕 **外部文件上传**: - - 支持 PDF、Word、TXT、Markdown 文件 - - 支持音频文件(MP3、WAV、M4A) - - 支持视频文件(MP4、AVI、MOV)提取音频 - - 单个知识库可混合多种来源 - -#### 1.2 技术方案 - -##### 文档解析 -```python -# 依赖库选型 -- PDF: PyPDF2 / pdfplumber(文本提取) -- Word: python-docx(DOCX 文件) -- Markdown: 直接读取 -- TXT: 直接读取,支持多种编码(UTF-8、GBK) -``` - -**技术评估**: -- ✅ **可行性**:高,Python 生态成熟 -- ⚠️ **挑战**: - - PDF 中的表格、图片识别(可选用 OCR) - - 大文件处理(需要分块上传和处理) -- 💰 **成本**:无额外费用,依赖开源库 - -##### 音频/视频处理 -```python -# 依赖库选型 -- 音频提取: ffmpeg-python(视频转音频) -- 音频格式转换: pydub -``` - -**技术评估**: -- ✅ **可行性**:高,现有转录流程可复用 -- ⚠️ **挑战**: - - 视频文件较大,需要优化存储和处理 - - 需要增加进度反馈 -- 💰 **成本**: - - 视频存储成本增加(七牛云存储费用) - - 转录费用与现有一致(按时长计费) - -##### 数据库设计 -```sql --- 新增表:知识库来源文件表 -CREATE TABLE kb_source_files ( - file_id INT AUTO_INCREMENT PRIMARY KEY, - kb_id INT NOT NULL COMMENT '关联的知识库ID', - file_type ENUM('pdf', 'docx', 'txt', 'markdown', 'audio', 'video') NOT NULL, - file_name VARCHAR(255) NOT NULL, - file_url VARCHAR(512) NOT NULL COMMENT '文件存储URL', - file_size BIGINT COMMENT '文件大小(字节)', - extracted_text TEXT COMMENT '提取的文本内容', - upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (kb_id) REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE -); - --- 修改知识库表 -ALTER TABLE knowledge_bases -ADD COLUMN source_type ENUM('meetings', 'files', 'mixed') DEFAULT 'meetings' COMMENT '内容来源类型'; -``` - ---- - -### 2. 提示词模版升级 - -#### 2.1 功能需求 -- ✅ **选择模版**(已支持):从提示词仓库选择预设模版 -- 🆕 **附加提示词**:在模版基础上追加自定义需求 -- 🆕 **结构化输出**:生成标题 + 多级内容(章节、小节) -- 🆕 **输出格式控制**:支持指定输出结构(JSON Schema) - -#### 2.2 技术方案 - -##### 提示词组合 -```python -def build_knowledge_prompt( - template_prompt: str, # 基础模版 - additional_prompt: str, # 附加提示词 - output_format: dict # 输出格式控制 -) -> str: - """ - 组合提示词策略: - 1. 基础模版(定义分析维度和风格) - 2. 附加提示词(用户自定义需求) - 3. 输出格式要求(结构化 JSON 或 Markdown) - """ - return f""" -{template_prompt} - -## 用户补充要求 -{additional_prompt} - -## 输出格式要求 -请按照以下结构输出(Markdown 格式): -# 标题 -## 章节1 -### 小节1.1 -内容... -### 小节1.2 -内容... -## 章节2 -... -""" -``` - -**技术评估**: -- ✅ **可行性**:高,现有提示词系统可直接扩展 -- 📊 **优化方向**: - - 使用通义千问的 `response_format` 参数实现结构化输出 - - 提供可视化的输出结构编辑器 -- 💰 **成本**:无额外成本 - -##### 结构化输出(通义千问支持) -```python -# 通义千问支持 JSON Schema 格式控制 -response_format = { - "type": "json_schema", - "json_schema": { - "name": "knowledge_base_output", - "schema": { - "type": "object", - "properties": { - "title": {"type": "string"}, - "sections": { - "type": "array", - "items": { - "type": "object", - "properties": { - "section_title": {"type": "string"}, - "subsections": { - "type": "array", - "items": { - "type": "object", - "properties": { - "subsection_title": {"type": "string"}, - "content": {"type": "string"} - } - } - } - } - } - } - } - } - } -} -``` - ---- - -### 3. 音频概览生成(TTS 播客) - -#### 3.1 功能需求 -- 🆕 **文字转语音**:将知识库内容转换为音频 -- 🆕 **播客式对话**(类似 NotebookLM): - - 双人对话形式(主持人 + 嘉宾) - - 自然的问答式讲解 - - 语气生动,易于理解 - -#### 3.2 技术方案 - -##### 方案一:基础 TTS(快速实现) - -**服务选型**: -```python -# 1. 阿里云语音合成(推荐) -- 优势:已集成 DashScope,音质自然,支持多音色 -- 成本:约 0.002 元/次(100字符) -- 特性:支持 SSML 标签控制语速、停顿 - -# 2. 微软 Azure TTS -- 优势:音质最佳,支持神经网络语音 -- 成本:约 $4/百万字符 -- 特性:支持情感控制、多语言 - -# 3. OpenAI TTS -- 优势:音质优秀,与 GPT 集成度高 -- 成本:约 $15/百万字符 -- 特性:6 种不同音色可选 -``` - -**实现流程**: -```python -async def generate_basic_audio(kb_content: str) -> str: - """ - 基础 TTS 实现 - 1. 文本预处理(分段、去除特殊字符) - 2. 调用 TTS API - 3. 音频文件合并 - 4. 上传到七牛云 - """ - # 分段处理(避免单次请求过长) - segments = split_text_by_paragraphs(kb_content, max_length=500) - - audio_files = [] - for segment in segments: - audio = await tts_service.synthesize( - text=segment, - voice="zhichu", # 阿里云音色 - rate=1.0, # 语速 - pitch=0 # 音调 - ) - audio_files.append(audio) - - # 合并音频 - final_audio = merge_audio_files(audio_files) - audio_url = upload_to_qiniu(final_audio, "kb_audio") - - return audio_url -``` - -**技术评估**: -- ✅ **可行性**:高,实现简单 -- ⚠️ **局限性**: - - 单调朗读,无对话感 - - 缺乏停顿和情感 -- 💰 **成本**: - - 阿里云 TTS:约 0.02 元/千字 - - 10 万字知识库:约 2 元/次 - ---- - -##### 方案二:播客式对话(NotebookLM 风格) - -**技术架构**: - -``` -输入: 知识库内容 (Markdown) - ↓ -1. 内容理解与脚本生成 - - 使用 LLM 将内容改写为对话脚本 - - 双人角色:主持人(引导)+ 专家(讲解) - ↓ -2. 对话脚本优化 - - 添加开场白和结束语 - - 插入自然的停顿和过渡 - - 添加情感标记(SSML) - ↓ -3. 多音色 TTS 合成 - - 主持人音色:女声,温和亲切 - - 专家音色:男声,稳重专业 - ↓ -4. 音频后处理 - - 添加背景音乐(轻音乐) - - 音量均衡化 - - 添加片头片尾 - ↓ -输出: 播客式音频文件 (MP3) -``` - -**LLM 脚本生成示例**: -```python -PODCAST_SCRIPT_PROMPT = """ -你是一个播客制作专家。请将以下知识库内容改写为一段双人对话脚本: -- 主持人(Host):提出问题,引导话题,语气轻松友好 -- 专家(Expert):讲解内容,回答问题,语气专业自信 - -要求: -1. 开场白介绍今天的主题 -2. 通过问答形式逐步展开知识点 -3. 加入自然的过渡语("那么..."、"接下来...") -4. 结束时做简短总结 - -知识库内容: -{kb_content} - -请输出 JSON 格式: -{{ - "title": "播客标题", - "intro": {{ - "host": "开场白...", - "expert": "回应..." - }}, - "dialogues": [ - {{"speaker": "host", "text": "问题1..."}}, - {{"speaker": "expert", "text": "解答1..."}}, - ... - ], - "outro": {{ - "host": "总结...", - "expert": "结束语..." - }} -}} -""" - -async def generate_podcast_script(kb_content: str) -> dict: - """使用 LLM 生成播客脚本""" - response = await llm_service.call( - prompt=PODCAST_SCRIPT_PROMPT.format(kb_content=kb_content), - response_format={"type": "json_object"} - ) - return json.loads(response) - -async def synthesize_podcast(script: dict) -> str: - """合成播客音频""" - audio_segments = [] - - # 片头音乐 - audio_segments.append(load_intro_music()) - - # 开场白 - for speaker, text in script["intro"].items(): - voice = VOICES[speaker] # {"host": "xiaoyun", "expert": "zhichu"} - audio = await tts_service.synthesize(text, voice=voice) - audio_segments.append(audio) - audio_segments.append(silence(duration=0.5)) # 停顿 0.5 秒 - - # 主体对话 - for dialogue in script["dialogues"]: - speaker = dialogue["speaker"] - text = dialogue["text"] - voice = VOICES[speaker] - audio = await tts_service.synthesize(text, voice=voice) - audio_segments.append(audio) - audio_segments.append(silence(duration=0.3)) - - # 结束语 - for speaker, text in script["outro"].items(): - voice = VOICES[speaker] - audio = await tts_service.synthesize(text, voice=voice) - audio_segments.append(audio) - - # 片尾音乐 - audio_segments.append(load_outro_music()) - - # 合并所有音频 - final_audio = merge_with_background_music(audio_segments) - - # 上传到七牛云 - audio_url = upload_to_qiniu(final_audio, "kb_podcast") - return audio_url -``` - -**技术评估**: -- ✅ **可行性**:中等 - - LLM 脚本生成:成熟方案 - - 多音色 TTS:阿里云、Azure 均支持 - - 音频后处理:需要 ffmpeg 或 pydub -- ⚠️ **挑战**: - - 脚本质量依赖 LLM prompt 优化 - - 音频合成时长较长(需要异步处理) - - 音频文件较大,存储成本增加 -- 💰 **成本**(以 5000 字知识库为例): - - LLM 脚本生成(输入 5000 字 + 输出 3000 字):约 0.05 元 - - TTS 合成(约 3000 字对话):约 0.06 元 - - **总成本:约 0.11 元/次** - -**音频处理库**: -```python -# 新增依赖 -ffmpeg-python==0.2.0 # 音频处理 -pydub==0.25.1 # 音频编辑 -``` - ---- - -##### 方案对比 - -| 特性 | 方案一:基础 TTS | 方案二:播客对话 | -|------|------------------|------------------| -| **实现难度** | 低(1-2 天) | 中(3-5 天) | -| **音频质量** | 单调朗读 | 自然对话 | -| **用户体验** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | -| **成本** | 0.02 元/千字 | 0.11 元/5000 字 | -| **适用场景** | 快速阅读 | 深度学习 | - -**推荐方案**: -- 🚀 **Phase 2.1**:先实现方案一(基础 TTS),快速上线 -- 🎯 **Phase 2.2**:再实现方案二(播客对话),提升体验 - ---- - -### 4. NotebookLM 式交互 - -#### 4.1 功能需求 -- 🆕 **知识库问答**:基于知识库内容的智能问答 -- 🆕 **引用溯源**:回答时显示来源(段落、页码) -- 🆕 **相关内容推荐**:基于用户提问推荐相关知识点 -- 🆕 **多轮对话**:支持上下文记忆的连续对话 - -#### 4.2 技术方案 - -##### 方案一:基于向量数据库的 RAG(推荐) - -**技术架构**: -``` -知识库内容 - ↓ -1. 文本分块 (Chunking) - - 按段落或语义分块(500-1000 字/块) - - 保留元数据(来源、章节、页码) - ↓ -2. 向量化 (Embedding) - - 使用阿里云通义千问 Embedding API - - 或使用 OpenAI text-embedding-3-small - ↓ -3. 存储到向量数据库 - - Milvus(开源,功能强大) - - 或 Qdrant(轻量,易部署) - - 或 PostgreSQL + pgvector(复用现有数据库) - ↓ -4. 用户提问 - ↓ -5. 向量检索 - - 将问题向量化 - - 检索 Top-K 相似内容块 - ↓ -6. LLM 生成回答 - - 将检索结果作为上下文 - - 生成准确回答 + 来源引用 -``` - -**实现示例**: -```python -from dashscope import TextEmbedding -from qdrant_client import QdrantClient -from qdrant_client.models import Distance, VectorParams, PointStruct - -# 1. 向量化服务 -class EmbeddingService: - def embed_text(self, text: str) -> List[float]: - """将文本转换为向量""" - response = TextEmbedding.call( - model='text-embedding-v3', - input=text - ) - return response.output['embeddings'][0]['embedding'] - -# 2. 向量数据库 -class VectorStore: - def __init__(self): - self.client = QdrantClient(host="localhost", port=6333) - - def create_collection(self, kb_id: int): - """为知识库创建向量集合""" - self.client.create_collection( - collection_name=f"kb_{kb_id}", - vectors_config=VectorParams(size=1536, distance=Distance.COSINE) - ) - - def add_chunks(self, kb_id: int, chunks: List[dict]): - """添加文本块到向量库""" - points = [] - for i, chunk in enumerate(chunks): - embedding = embedding_service.embed_text(chunk['text']) - points.append(PointStruct( - id=i, - vector=embedding, - payload={ - "text": chunk['text'], - "source": chunk['source'], - "section": chunk['section'] - } - )) - self.client.upsert(collection_name=f"kb_{kb_id}", points=points) - - def search(self, kb_id: int, query: str, top_k: int = 3): - """搜索相似内容""" - query_vector = embedding_service.embed_text(query) - results = self.client.search( - collection_name=f"kb_{kb_id}", - query_vector=query_vector, - limit=top_k - ) - return results - -# 3. RAG 问答 -async def answer_question(kb_id: int, question: str, chat_history: List[dict] = None): - """基于知识库回答问题""" - # 检索相关内容 - results = vector_store.search(kb_id, question, top_k=3) - - # 构建上下文 - context = "\n\n".join([ - f"[来源: {r.payload['section']}]\n{r.payload['text']}" - for r in results - ]) - - # 构建 prompt - prompt = f""" -基于以下知识库内容回答用户问题。如果无法从内容中找到答案,请明确告知。 - -知识库内容: -{context} - -用户问题:{question} - -请提供准确的回答,并在回答中标注来源章节。 -""" - - # 调用 LLM - response = await llm_service.call(prompt, chat_history=chat_history) - - # 返回回答 + 来源 - return { - "answer": response, - "sources": [ - {"section": r.payload['section'], "text": r.payload['text'][:200]} - for r in results - ] - } -``` - -**技术评估**: -- ✅ **可行性**:高 - - 向量数据库:Qdrant(轻量级)或 pgvector(复用 MySQL) - - Embedding:阿里云通义千问 Embedding API(0.0007 元/千 tokens) -- 📊 **优势**: - - 回答准确性高(基于实际内容) - - 支持引用溯源 - - 检索速度快(毫秒级) -- 💰 **成本**(以 10 万字知识库为例): - - 向量化:约 0.07 元(一次性) - - 每次问答检索:免费(本地向量库) - - LLM 生成:约 0.01 元/次 - ---- - -##### 方案二:基于 LLM 长上下文(备选) - -**技术方案**: -```python -async def answer_with_full_context(kb_content: str, question: str): - """直接将整个知识库作为上下文""" - prompt = f""" -你是一个知识库助手。请基于以下知识库内容回答用户问题。 - -知识库内容: -{kb_content} - -用户问题:{question} - -请提供准确的回答,并标注引用的段落。 -""" - response = await llm_service.call(prompt) - return response -``` - -**技术评估**: -- ✅ **可行性**:中等 - - 通义千问支持 128K tokens 上下文 - - 约 10 万字中文 -- ⚠️ **局限性**: - - 大文本上下文成本高 - - 无法精确定位来源 - - 不支持多知识库联合查询 -- 💰 **成本**: - - 每次问答(10 万字上下文):约 0.15 元 - - **比 RAG 方案贵 10 倍以上** - -**推荐方案**:**方案一(RAG)** 为主,方案二作为小规模知识库的快速方案。 - ---- - -##### 数据库设计 - -```sql --- 知识库对话历史表 -CREATE TABLE kb_chat_history ( - chat_id INT AUTO_INCREMENT PRIMARY KEY, - kb_id INT NOT NULL COMMENT '关联知识库ID', - user_id INT NOT NULL COMMENT '用户ID', - question TEXT NOT NULL COMMENT '用户提问', - answer TEXT NOT NULL COMMENT 'AI回答', - sources JSON COMMENT '回答来源(JSON数组)', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (kb_id) REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE, - FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE, - INDEX idx_kb_user (kb_id, user_id), - INDEX idx_created_at (created_at) -); - --- 知识库向量块表 -CREATE TABLE kb_text_chunks ( - chunk_id INT AUTO_INCREMENT PRIMARY KEY, - kb_id INT NOT NULL COMMENT '关联知识库ID', - chunk_text TEXT NOT NULL COMMENT '文本块内容', - chunk_metadata JSON COMMENT '元数据(章节、页码等)', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (kb_id) REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE, - INDEX idx_kb_id (kb_id) -); -``` - ---- - -### 5. 前端交互升级 - -#### 5.1 新增页面/组件 - -``` -知识库详情页 -├── 📄 内容展示区 -│ ├── Markdown 渲染(已有) -│ └── 音频播放器(新增) -│ ├── 播放/暂停 -│ ├── 进度条 -│ ├── 倍速调节 -│ └── 下载音频 -│ -├── 💬 智能问答区(新增) -│ ├── 对话输入框 -│ ├── 对话历史列表 -│ ├── 来源引用卡片 -│ └── 相关问题推荐 -│ -└── 📊 知识库信息 - ├── 来源文件列表(新增) - └── 标签、创建时间等(已有) -``` - -#### 5.2 技术实现 - -```jsx -// 音频播放器组件 -import ReactAudioPlayer from 'react-audio-player'; - -const KnowledgeAudioPlayer = ({ audioUrl }) => { - return ( -
{src.text}...
-