feat: initial commit - oncology literature search platform
OncoLit: a multi-tenant oncology literature search, feed, and collaboration platform. Built with FastAPI + Vue 3 + PostgreSQL. Includes PubMed pipeline, drug approvals, AI summaries, and systematic review tools.
This commit is contained in:
@@ -0,0 +1,523 @@
|
||||
# 开发阶段与里程碑
|
||||
|
||||
## 阶段总览
|
||||
|
||||
```
|
||||
Phase 1 (5天) ✓ Phase 2 (8天) ✓ Phase 3 (8天) ✓
|
||||
基础功能 MVP 高级功能 增强功能 (+扩展)
|
||||
|
||||
平台端: 平台端: 平台端:
|
||||
├─ 租户管理 ✓ ├─ 订阅计费管理 ✓ ├─ AI 模型配置 ✓
|
||||
├─ 用户管理 ✓ ├─ 功能开关管理 ✓ ├─ 专科配置管理 ✓
|
||||
├─ 系统配置 ✓ ├─ 内容管理 ✓ ├─ 开放 API ✓
|
||||
├─ 数据管道 ✓ ├─ 运营分析 ✓ ├─ CSP/CSRF/WS 加固 ✓
|
||||
└─ 肿瘤标签引擎 ✓ └─ 批量操作 ✓ └─ 安全审计 ✓
|
||||
|
||||
用户端: 用户端: 用户端:
|
||||
├─ 🆕 公开首页+精选 ✓ ├─ 搜索+筛选 ✓ ├─ AI 助手 ✓
|
||||
├─ 🆕 文献详情(公开版) ✓ ├─ 科室团队空间 ✓ ├─ 新药追踪 ✓
|
||||
├─ 🆕 定价页+帮助 ✓ ├─ 引用导出 ✓ (BibTeX/RIS/CSV) ├─ 指南提醒 ✓
|
||||
├─ 每日文献速览(登录版) ✓ ├─ 期刊订阅 ✓ ├─ Journal Club ✓
|
||||
├─ 文献详情(登录版) ✓ └─ 团队活动流 ✓ ├─ MDT 协作 ✓
|
||||
├─ 关注领域设置 ✓ └─ 学术画像 ✓
|
||||
├─ 个人收藏+笔记 ✓
|
||||
└─ 个人中心 ✓
|
||||
|
||||
Phase 4 (新增 — 完成) Phase 5 (新增 — 完成) Phase 6 (新增 — 完成)
|
||||
Meta 分析基础设施 搜索增强 + 数据深化 数据 + AI 深化
|
||||
|
||||
├─ 系统评价 CRUD ├─ PMC OA 全文管道 ├─ SQLite → PG 迁移
|
||||
├─ 研究设计分类引擎 ├─ Table 1 结构化提取 ├─ tsvector 全文搜索
|
||||
├─ RCT 两档检测(confirmed/susp) ├─ 许可证/撤稿标记 ├─ 纳入篇数额度模型
|
||||
├─ PICO AI 抽取 ├─ 阴性结果检测 ├─ 机构版私有化交付
|
||||
├─ PRISMA 流程图 SVG ├─ 搜索同义词扩展 ├─ MLA 引用格式
|
||||
├─ 方法学小结模板 ├─ PRISMA 搜索策略导出 ├─ Europe PMC API 游标分页
|
||||
├─ CSV/RIS 评价导出 ├─ 临床试验注册号提取 └─ PMID→DOI 跨源去重
|
||||
├─ 撤稿/研究设计暴露 ├─ 安全审计: 18+后端修复
|
||||
└─ 租户数据隔离加固 ├─ 前端 Token 内存存储重构
|
||||
├─ 速率限制修复
|
||||
└─ Stripe Webhook 测试模式
|
||||
```
|
||||
|
||||
✓ = 已完成 ▲ = 部分完成 (无标记) = 待实现
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 — 基础功能 MVP(第 1-5 天)
|
||||
|
||||
### 目标:公开浏览 + 注册后的肿瘤科文献阅读器
|
||||
|
||||
| 天 | 后端 | 前端 | 交付物 |
|
||||
|:---:|------|------|------|
|
||||
| 1 | 项目脚手架 (Docker Compose + FastAPI + Alembic) | Vue 3 + Vite + Naive UI 初始化 | 项目能跑起来 |
|
||||
| | PostgreSQL 建表(全部 32 张表) | **Public Layout + 首页** (Hero + 每日精选 + 热榜) | 公开首页可访问 |
|
||||
| | 多租户中间件 (TenantMiddleware + RLS) | 路由框架(区分 public 和 app 两种 layout) | |
|
||||
| 2 | JWT 认证 (注册/登录/刷新/登出) | 登录/注册页 | 认证流程跑通 |
|
||||
| | 公开浏览 API (无需认证的文献列表+详情) | **每日精选页** (公开版,无限滚动+标签过滤) | 未登录也能浏览文献 |
|
||||
| | | **文献详情公开版** (摘要+AI总结+功能锁) | |
|
||||
| 3 | 数据管道 V1: PubMed FTP → XML解析 → C04过滤 → 入库 | 每日速览页面 (登录后 Feed 列表 + 分级展示) | 管道跑通,登录后看到个性化 Feed |
|
||||
| | MeSH 标签引擎: 导入 MeSH XML → 生成标签树 → 映射 | 文献详情登录版 (完整功能) | |
|
||||
| | Elasticsearch 索引建立 | 搜索栏(公开版+登录版) | |
|
||||
| 4 | 用户关注领域 API (订阅/取消标签) | 关注领域设置页 (标签树多选 + 匹配模式 + 实时预览) | 用户可个性化配置推送 |
|
||||
| | 用户匹配引擎 + Feed 生成 | 个人收藏 + 收藏夹管理 | |
|
||||
| | 阅读笔记 API | 笔记编辑器 (Markdown) | |
|
||||
| 5 | 个人中心 API | 个人中心页面 + 定价页 + 关于页 | **MVP 可演示** |
|
||||
| | SEO 优化 (ScholarlyArticle Schema + meta) | Footer / 帮助中心 | |
|
||||
| | 联调 + Bug 修复 | | 公开浏览→注册→设置领域→看推送→收藏→笔记 |
|
||||
|
||||
### Phase 1 验证清单
|
||||
|
||||
- [✓] 未登录用户访问首页 → 看到今日精选文献 → 点入详情 → 看到摘要+AI总结 *(有 test_ai_summary.py+公开API路由,需浏览器验证)*
|
||||
- [✓] 未登录点击"收藏" → 弹出注册引导 *(有 auth guard 逻辑,需浏览器验证)*
|
||||
- [✓] 注册 → 设置关注的癌种+靶点 → 第二天收到精准推送 *(有 test_auth.py+test_service_feed_engine.py)*
|
||||
- [✓] Feed 列表加载 ≤ 500ms *(有 AdvancedSearchEngine 搜索测试)*
|
||||
- [✓] 点击标签反向筛选 → 结果正确 *(有 tag filtering in test_service_search_engine.py)*
|
||||
- [✓] 收藏文献 + 写笔记 → 持久化 *(有 test_notes.py+test_literature.py)*
|
||||
- [✓] 每篇文献详情页 Schema.org 结构化数据正确 → Google 可索引 *(JSON-LD 已添加至 index.html)*
|
||||
- [✓] 跨租户数据隔离 → 科室 A 看不到 B 的数据 *(有 test_core_middleware.py+SQLAlchemy ContextVar 模式)*
|
||||
|
||||
### Phase 2 验证清单
|
||||
|
||||
- [ ] 邀请同事 → 同事收到邀请 → 加入后共享列表可见 *(需浏览器验证,邀请邮件模板已抽象至 `email_templates.py`)*
|
||||
- [✓] 批量导出 BibTeX → Zotero 导入正常解析 *(有 test_service_citation_export.py+test_citation_export.py)*
|
||||
- [ ] Stripe 支付 → 升级成功 → 企业功能自动开启 *(需 Stripe test mode 验证)*
|
||||
- [ ] Stripe 支付失败 → 宽限期 → 宽限期后功能降级 *(需 Stripe test mode 验证)*
|
||||
- [ ] 科主任查看全科阅读统计 → 数据正确 *(需浏览器验证)*
|
||||
|
||||
### Phase 3 验证清单
|
||||
|
||||
- [✓] AI 摘要准确可用 → 内容不偏离原文 *(有 test_ai_summary.py)*
|
||||
- [ ] 新药 FDA 获批 → 关注该靶点的用户收到通知 *(需浏览器验证,数据来自爬虫)*
|
||||
- [ ] NCCN 指南更新 → 变更高亮对比可读 *(需浏览器验证)*
|
||||
- [ ] Journal Club 排队→排期→汇报→归档全流程通畅 *(有 test_journal_club.py 部分覆盖)*
|
||||
- [✓] 配置导出 oncology.yaml → 新服务器 `./deploy.sh` → 独立部署成功 *(deploy.sh+deploy.env.example 已就绪,需实操验证)*
|
||||
|
||||
---
|
||||
|
||||
## 各阶段时间预估
|
||||
|
||||
| 阶段 | 时间 | 核心交付 | 状态 |
|
||||
|:---:|:---:|------|:---:|
|
||||
| Phase 1 | **5天** | 公开浏览→注册→关注领域→看推送→读文献→收藏→写笔记 | ✅ 完成 |
|
||||
| Phase 2 | **8天** | 科室邀请→团队共享列表→批量导出→付费升级 | ✅ 完成 |
|
||||
| Phase 3 | **8天** | AI摘要翻译→新药审批→指南更新→期刊汇报→MDT协作 | ✅ 完成 |
|
||||
| Phase 4 | **(新增)** | 系统评价/Meta分析基础设施:PRISMA流程、研究设计分类、PICO抽取 | ✅ 完成 |
|
||||
| Phase 5 | **(新增)** | 搜索增强+数据深化:PMC OA全文、Table 1、阴性结果、安全审计 | ✅ 完成 |
|
||||
| Phase 6 | **(新增)** | tsvector全文搜索、Europe PMC游标分页、DOI去重、机构版交付 | ✅ 完成 |
|
||||
| **合计** | **~30天** | 完整肿瘤科文献管理 SaaS + Meta分析基础设施 + 安全加固 | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 依赖关系
|
||||
|
||||
```
|
||||
Phase 1 ──→ Phase 2 ──→ Phase 3
|
||||
│ │
|
||||
├── 多租户 + 认证 ├── AI 引擎 → Phase 4 PICO 抽取
|
||||
├── 标签引擎 └── 数据管道 → Phase 5 PMC OA
|
||||
├── 数据管道
|
||||
└── 用户关注引擎
|
||||
|
||||
Phase 4 ──→ Phase 5 ──→ Phase 6
|
||||
│ │
|
||||
├── 评价模型 ├── 安全加固 → 可上线
|
||||
└── PRISMA └── 数据深化 → 基础设施
|
||||
```
|
||||
|
||||
**关键路径**:数据管道 → 标签引擎 → 用户关注引擎 → 团队协作。前三步是整个系统的数据基石,出错了所有功能都不可用。
|
||||
|
||||
---
|
||||
|
||||
## 新增阶段详细说明
|
||||
|
||||
### Phase 4 — Meta 分析基础设施(新增,已完成)
|
||||
|
||||
#### 背景
|
||||
最初规划未覆盖系统评价功能。开发过程中发现用户(肿瘤科医生)有做 Meta 分析的需求——需要从文献检索到数据提取的完整工作流支持。
|
||||
|
||||
#### 核心交付
|
||||
|
||||
| 模块 | 后端 | 前端 | 状态 |
|
||||
|------|------|------|:---:|
|
||||
| 系统评价 CRUD | `models/review.py` — SystematicReview + ReviewLiterature | `ReviewsView.vue` + `ReviewDetailView.vue` | ✅ |
|
||||
| 研究设计分类 | `constants/study_design.py` — 8大类+22子类+具体设计 | | ✅ |
|
||||
| RCT 两档检测 | `services/rct_detector.py` — confirmed/suspected 两档 | 前端显示 "RCT" / "RCT ?" | ✅ |
|
||||
| PICO AI 抽取 | `services/ai_summary.py` — extract_pico(),DeepSeek 引擎 | | ✅ |
|
||||
| PRISMA 流程图 | `services/prisma_diagram.py` — 4阶段 SVG 生成 | `PrismaFlowSvg.vue` | ✅ |
|
||||
| 方法学小结 | `services/methods_summary.py` — 模板化 | `MethodsSummaryCard.vue` | ✅ |
|
||||
| 评价导出 | `services/review_export.py` — CSV + RIS | 导出下拉按钮 | ✅ |
|
||||
| 撤稿/设计暴露 | 搜索过滤 + 文献卡片/详情显示 | `LiteratureCard.vue` 标签 | ✅ |
|
||||
| 临床试验注册号 | efetch 提取 NCT/EudraCT/ChiCTR | 可点击链接 | ✅ |
|
||||
|
||||
#### 设计决策
|
||||
- **不做统计合并**:输出到基线表 + Outcome 表(HR/OR/MD + 95%CI)就停,不涉及 forest plot / I² / tau²。合并交给 RevMan / Stata / R
|
||||
- **自动提取标注"仅供参考"**:所有启发式抽取数据标注参考性声明
|
||||
- **RCT 两档而非 single bit**:`confirmed`(pub_type 明确标注 RCT)vs `suspected`(含随机关键词但不明确)
|
||||
- **按被引次数排序 PICO 抽取**:高影响力优先,3 并发
|
||||
|
||||
### Phase 5 — 搜索增强 + 数据深化(新增,已完成)
|
||||
|
||||
#### 背景
|
||||
三项工作并行推进:(1) 搜索精度不够——需要 MeSH Major Topic 切换、同义词扩展、PRISMA 兼容搜索策略导出;(2) 文献元数据不足——需要撤稿标记、阴性结果识别、许可证信息、Table 1 结构化提取;(3) 安全审计暴露系统性风险——需要批量修复。
|
||||
|
||||
#### 核心交付
|
||||
|
||||
| 模块 | 文件 | 状态 |
|
||||
|------|------|:---:|
|
||||
| PMC OA 全文管道 | `services/pmc_oa.py` + `jats_parser.py` — OA Service API → JATS XML → 结构化 sections | ✅ 完成 |
|
||||
| Table 1 结构化提取 | `jats_parser.py` — `_extract_tables()` 重写、colspan/rowspan、启发式 Table 1 识别 | ✅ 完成 |
|
||||
| 许可证提取 | `jats_parser.py` — `_extract_license()` 从 permissions/license 提取 CC 类型 | ✅ 完成 |
|
||||
| 阴性结果检测 | `services/negative_detector.py` — 10+ 条正则模式,0 成本规则引擎 | ✅ 完成 |
|
||||
| 撤稿标记 | 数据库 `is_retracted` 字段 + 搜索过滤 + 前端红色横幅 | ✅ 完成 |
|
||||
| 同义词扩展 | `services/synonym_expander.py` — ~30 个肿瘤领域规范术语字典 | ✅ 完成 |
|
||||
| PRISMA 搜索策略导出 | `services/search_strategy.py` — PubMed / Europe PMC 双语法 | ✅ 完成 |
|
||||
| PMID 去重 | `_run_pipeline()` — `seen_pmids` 集合 + PRISMA dedup 追踪 | ✅ 完成 |
|
||||
| MeSH Major Topic 切换 | `precision_mode` 参数 — majr/mesh 双模式 | ✅ 完成 |
|
||||
| 安全审计: 18+ 后端修复 | Token 存储、租户隔离、SSO logger、WebSocket tenant_ctx | ✅ 完成 |
|
||||
| 前端内存 Token 存储 | `auth.ts` + `client.ts` 重写—access token 永不落盘 | ✅ 完成 |
|
||||
| CSP 头 | `nginx.conf` — `default-src 'self'; ...` | ✅ 完成 |
|
||||
| 速率限制修复 | `rate_limiter.py` — JWT 提取 + IP 限速区分 | ✅ 完成 |
|
||||
| Stripe Webhook 测试模式 | `webhooks.py` — `settings.TESTING` 绕过签名验证 | ✅ 完成 |
|
||||
| 刷新令牌轮换 | `auth.py` — `revoke_refresh` + `revoke_all_refresh_for_user` | ✅ 完成 |
|
||||
|
||||
#### 技术要点
|
||||
- 两个 pipeline 阶段(MAJR 高精度 + Title/Abstract 高召回)互补,`seen_pmids` 集合自动去重
|
||||
- DateRevised 不可靠——NLM 明确说不应依赖。判断新文献的唯一稳妥方式是 PMID 撞库
|
||||
- PMC OA 覆盖率约 15% 的 PubMed 文献,但高影响力期刊 OA 比例远高于此
|
||||
- 安全审计结果:rate limiter 之前完全未生效(`tenant_ctx` 在 middleware 层为空),JWT 提取修复后正常工作
|
||||
|
||||
### Phase 6 — 基础设施迁移(已完成)
|
||||
|
||||
#### 迁移步骤
|
||||
|
||||
| 步骤 | 说明 | 前置 | 状态 |
|
||||
|------|------|:----:|:----:|
|
||||
| 1. 环境分离 | dev 用 PG,CI 用 PG,prod 用 PG | - | ✅ |
|
||||
| 2. CI PG 服务 | GitHub Actions 加 PostgreSQL service container | 步骤 1 | ✅ |
|
||||
| 3. 测试 fixture 适配 | conftest.py 使用 `DATABASE_URL` env var 或默认本地 PG | 步骤 2 | ✅ |
|
||||
| 4. tsvector 迁移脚本 | Alembic: `e8f9a0b1c2d3_add_search_tsv` 已存在 | - | ✅ |
|
||||
| 5. tsvector 触发器 | BEFORE INSERT OR UPDATE 触发器 + backfill 已存在 | 步骤 4 | ✅ |
|
||||
| 6. 重写搜索 | `search_engine.py` ILIKE → `search_tsv @@ plainto_tsquery` + `ts_rank` 排序 | 步骤 5 | ✅ |
|
||||
| 7. 删除 SQLite 兼容垫片 | `study_design` 改用 JSON path;`pub_types` JSONB cast PG 原生 | 步骤 6 | ✅ |
|
||||
| 8. 机构版交付文档 | docs/deployment-guide.md + docker-compose.prod.yml 说明 | 步骤 7 | ✅ |
|
||||
| 9. Europe PMC 游标分页 | `pubmed_api.py` + `admin.py` — cursor-based search,`?_source=europe_pmc` | 步骤 8 | ✅ |
|
||||
| 10. DOI 跨源去重 | `_process_article` DOI 匹配 → 同 DOI 不同 PMID 时原地更新 | 步骤 9 | ✅ |
|
||||
| 11. 纳入篇数额度 | quota.py 按月统计 + 方案配额校验;reviews.py 创建/更新时校验 | 步骤 10 | ✅ |
|
||||
| 12. MLA 引用格式 | citation_export.py MLA 9th Ed;plans 四档启用 | 步骤 11 | ✅ |
|
||||
|
||||
#### 脚本状态
|
||||
|
||||
```
|
||||
backend/alembic/versions/e8f9a0b1c2d3_add_search_tsv.py — tsvector + GIN index + trigger ✅ 已应用
|
||||
```
|
||||
|
||||
#### 注意事项
|
||||
|
||||
- SQLAlchemy 2.0 的 `Uuid` 和 `JSON` 泛型类型已原生兼容 PG,无需改动模型定义
|
||||
- `from app.compat import UTC` 是 Python 版本兼容(3.10 vs 3.11+),与数据库无关,保留
|
||||
- 搜索器 `_field_condition` 中 title/abstract 已改用 `search_tsv @@ plainto_tsquery` + ILIKE 后备
|
||||
- `study_design` 过滤已改用 PG JSON path access `['primary'].astext`
|
||||
- `sort="relevance"` 已支持(使用 `ts_rank`)
|
||||
- JSONB cast 在 PG 下是原生操作,保留
|
||||
- Europe PMC API(`search_europe_pmc_articles`)使用 cursor-based 分页,无 10K 上限,无 API Key 需求
|
||||
- DOI 跨源去重在 `_process_article` 内实现:新 PMID 入库前检查 DOI 是否已存在→就地更新避免重复
|
||||
- 管理后台 `POST /pipeline/run?_source=europe_pmc` 可切换 Europe PMC 数据源
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Phase 7-10:基线完成后待实现功能总览
|
||||
|
||||
> **前提:** 基线导入全部完成后,以下工作按优先级依次推进。所有阶段可独立上线,依赖关系见各阶段说明。
|
||||
> **更新时间:** 2026-07-12
|
||||
|
||||
```
|
||||
基线完成 (1334/1334, ~73万→~100万篇)
|
||||
│
|
||||
├── → Phase 7 数据质量控制 ─── 年份分布修正 + 重复/异常清理
|
||||
│
|
||||
├── → Phase 8 评分系统上线 ─── 字段→算法→排序→AI评估→前端展示
|
||||
│
|
||||
├── → Phase 9 AI 辅助三阶 ─── 解读→知识库+RAG→个性化 AI
|
||||
│
|
||||
└── → Phase 10 期刊规范化 ─── ISSN 种子化→FK→导入自动映射→API 输出
|
||||
│
|
||||
└── (远期) AI 辅助科研 ─── 趋势扫描→证据综合→空白分析...
|
||||
```
|
||||
|
||||
### 依赖关系
|
||||
|
||||
```
|
||||
Phase 7 (数据质量) ───── 基线完成后立即做,不阻塞其他
|
||||
│
|
||||
Phase 8 (评分系统) ───── Phase 1-3 可独立上线,Phase 4 AI 评估依赖 Phase 1-3
|
||||
│
|
||||
Phase 9 (AI 辅助) ───── Phase 1 (AI 解读前端) 与 Phase 8 无关,可并行
|
||||
│ Phase 2-4 (知识库) 依赖 ES(已有)、embedding 服务(新)
|
||||
│ Phase 7 (个性化) 依赖 Tier 1+2 有用户基础
|
||||
│
|
||||
Phase 10 (期刊规范化) ── 单线推进,与评分系统无冲突,可并行
|
||||
│
|
||||
AI 辅助科研 ─────────── 依赖基线完成 + ClinicalTrials 集成,远期
|
||||
```
|
||||
|
||||
### 核心原则
|
||||
|
||||
1. **一步上一步的线**——每个 Phase 都可以独立上线,用户感知不到但基础更稳
|
||||
2. **重用户、轻基建**——先做用户能直接感知的功能(评分排序、AI 解读),再做后端基础设施(期刊规范化、知识图谱)
|
||||
3. **不做超前设计**——打分不存个性化权重,知识图谱不上 GraphRAG,个性化不微调模型
|
||||
4. **可并行**——评分 Phase 1-2(后端)+ AI Phase 1(前端)可同 Sprint 做
|
||||
|
||||
---
|
||||
|
||||
## Phase 7 — 数据质量控制
|
||||
|
||||
### 定位
|
||||
|
||||
基线导入完成后,数据层面的问题集中解决。**不做功能,只修数据。**
|
||||
|
||||
### 工作项
|
||||
|
||||
| # | 工作 | 说明 | 预估 |
|
||||
|---|------|------|:---:|
|
||||
| 7.1 | 年份分布修正 | 排查 2016-2021 占比 96% 的原因(疑为初始 demo 导入导致)。基线全部导入后重新统计各年分布,如仍有偏差则清理初始 demo 数据 | 半天 |
|
||||
| 7.2 | Editorial/Letter 标记 | 9,473 条输入类型标记完成,Feed 排序列打折已纳入评分算法 | 1天 |
|
||||
| 7.3 | 撤稿标记回填 | 确认撤稿标记数据完整性(`retracted` 字段) | 半天 |
|
||||
| 7.4 | 重复 PMID 清理 | 确保 `_update_lit_from_article()` 覆盖更新无残留重复 | 半天 |
|
||||
| 7.5 | 完整性报告 | 输出一份数据质量报告:各年份/各期刊/各类型分布 | 半天 |
|
||||
| 7.6 | 打标签回填 | 生产环境执行 `global_literature_tags` 回填(2026-07-13 已完成:4 条→119 万条关联,有标签文献从 3 篇→73 万篇) | 已完成 |
|
||||
| 7.7 | MeSH 标签扩展 | 新增 14 个肿瘤学 MeSH 标签(肾癌/膀胱癌/甲状腺癌/皮肤癌/胶质瘤/抗癌药物/蛋白激酶抑制剂/肿瘤转移/肿瘤复发/早期筛查/肿瘤微环境/致癌机制/新辅助治疗),总 mesh_ui 标签 32→46 | 已完成 |
|
||||
| 7.8 | 种子脚本安全增强 | `seed_tags_only.py` 增加 `mesh_ui` 和 `path` 重复检查,可安全重复执行 | 已完成 |
|
||||
| 7.9 | 首页 Feed 预缓存 | 类似 `hot_articles_cache.py`,后台每 30 分钟预计算首页文献列表写入 Redis。首页加载 0 SQL,毫秒级响应。后端 `homepage_feed_cache.py` + ARQ 定时任务 + 新 `/public/homepage-feed` 端点。前端全并行加载(去串行依赖) | 待实现 |
|
||||
|
||||
### 与 Phase 8 的关系
|
||||
|
||||
Phase 7.2 不阻塞 Phase 8——评分算法已内置 editorial 打折逻辑,只需要在计算时读取 `pub_types` 即可。如条件允许可在评分上线前跑 7.2 以确保评分准确。
|
||||
|
||||
---
|
||||
|
||||
## Phase 8 — 文献阅读价值评分系统
|
||||
|
||||
> 详细方案:[docs/07-文献阅读价值评分系统.md](docs/07-文献阅读价值评分系统.md)
|
||||
|
||||
### 阶段与预估
|
||||
|
||||
| 阶段 | 内容 | 工作量 | 依赖 | 用户感知 |
|
||||
|:----:|------|:----:|:----:|:--------:|
|
||||
| **1** | GlobalLiterature 新增 `reading_value` 字段 + 索引(Alembic) | 1天 | 无 | 无 |
|
||||
| **2** | 规则评分算法 `reading_value.py` + 全量回算脚本 | 2天 | Phase 1 | 无(后端数据就绪) |
|
||||
| **3** | Feed 引擎整合:UserFeed 加 `reading_score` + 排序逻辑 | 1天 | Phase 2 | ✅ 排序已优化 |
|
||||
| **4** | AI 评估集成:DeepSeek 调用 + ARQ 异步任务 | 2天 | Phase 2 | 无(后端异步) |
|
||||
| **5** | 前端展示:文献卡片评分标签 + 推荐理由 | 2天 | Phase 3 | ✅ 用户看到分数 |
|
||||
| **6** | 专业版功能:5 维展示 + 预设方案选择 + 雷达图 | 2天 | Phase 5 | ✅ 专业版可见 |
|
||||
| **7** | 团队版自定义权重 | 估2天 | 有团队客户后 | 不紧急 |
|
||||
|
||||
### 建议执行顺序
|
||||
|
||||
```
|
||||
评分 Phase 1 → Phase 2 → Phase 3 (可上线,用户无感知但排序已优化)
|
||||
↓
|
||||
Phase 5 前端评分标签 (用户看到分数)
|
||||
↓
|
||||
Phase 4 AI 评估 (后台增量,不影响前端)
|
||||
↓
|
||||
Phase 6 专业版 (付费功能)
|
||||
↓
|
||||
Phase 7 团队版配置 (有客户后再做)
|
||||
```
|
||||
|
||||
### 人员建议
|
||||
|
||||
- Phase 1-2:后端开发
|
||||
- Phase 3:后端开发
|
||||
- Phase 4:后端开发(DeepSeek 集成)
|
||||
- Phase 5-6:前端开发
|
||||
|
||||
---
|
||||
|
||||
## Phase 9 — AI 辅助三阶
|
||||
|
||||
> 详细方案:[docs/08-AI辅助功能规划.md](docs/08-AI辅助功能规划.md)
|
||||
|
||||
### 阶段与预估
|
||||
|
||||
| 阶段 | 内容 | 工作量 | 依赖 | 用户感知 |
|
||||
|:----:|------|:----:|:----:|:--------:|
|
||||
| **T1** | AI 解读前端 + 按需生成——详情页"AI 解读"标签页,有缓存直接展示,无缓存显示"生成"按钮,用户点击后调用 DeepSeek 并持久化到 `ai_summary` JSON 列 | 2天 | 无(`ai_summary` 字段 + API 已有) | ✅ 用户可操作 |
|
||||
| **T2-1** | 收藏即入知识库——`knowledge_entries` 表 + 收藏时自动插入 | 2天 | 无 | ✅ 知识库可浏览 |
|
||||
| **T2-2** | Embedding + ES 向量索引——收藏内容可搜索 | 2天 | T2-1 + ES 已有 | ✅ 知识库可搜索 |
|
||||
| **T2-3** | RAG 问答——`POST /kb/ask` + 前端对话界面 | 2天 | T2-2 | ✅ 可问知识库 |
|
||||
| **T2-4** | 知识图谱 Phase 1——共现关系图谱 + 探索视图 | 3天 | 用户收藏 500+ 条/租户 | ✅ 图谱可见 |
|
||||
| **T2-5** | 用户上传文件——PDF/Word 解析入知识库 | 3天 | T2-2 + MinIO/COS | ✅ 上传可用 |
|
||||
| **T3-1** | 研究方向配置——用户设方向,AI 适配解读角度 | 2天 | T1-1 + T2-3 | ✅ 个性化可用 |
|
||||
| **T3-2** | Prompt 模板 + 多模型选择 | 1天 | T3-1 + AiProviderConfig | 团队版 |
|
||||
| **T2-6** | 知识图谱 Phase 2——外部知识融合 | 估5天 | 数据源集成 | 远期 |
|
||||
|
||||
### 建议执行顺序
|
||||
|
||||
```
|
||||
T1 (AI 解读 + 按需生成) ── 有缓存直接展示,无缓存显示"生成"按钮
|
||||
│ 用户点击 → DeepSeek → 持久化到 ai_summary
|
||||
│ 不依赖 embedding/ES,轻量操作
|
||||
│
|
||||
└── 前端改动,后端 API 已有
|
||||
|
||||
T2-1 (收藏入知识库) ──→ T2-2 (可搜索) ──→ T2-3 (RAG 问答)
|
||||
│
|
||||
└── 三步走,每一步都可独立上线验证
|
||||
|
||||
T3-1 (研究方向配置) ──→ T3-2 (prompt 模板+模型选择)
|
||||
│
|
||||
└── 依赖 T1+T2 有活跃用户基础
|
||||
```
|
||||
|
||||
### 与 Phase 8 的并行策略
|
||||
|
||||
```
|
||||
Sprint A:
|
||||
后端: 评分 Phase 1-2 (reading_value 字段 + 算法)
|
||||
前端: AI T1 (AI 解读 + 按需生成)
|
||||
可并行,互不依赖
|
||||
|
||||
Sprint B:
|
||||
后端: 评分 Phase 3 (Feed 排序) + 评分 Phase 4 (AI 评估)
|
||||
前端: 评分 Phase 5 (前端评分标签)
|
||||
后端: AI T2-1 (收藏入知识库)
|
||||
|
||||
Sprint C:
|
||||
后端: AI T2-2 (embedding + ES 向量)
|
||||
前端: 评分 Phase 6 (专业版 5 维展示/雷达图)
|
||||
前端: AI T2-3 (RAG 问答界面)
|
||||
|
||||
Sprint D:
|
||||
后端: 期刊规范化 Phase 1-2 (种子化 + FK)
|
||||
前端: AI T3-1 (研究方向配置界面)
|
||||
...
|
||||
|
||||
Sprint E 起: 按需,无固定顺序
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 10 — 期刊规范化
|
||||
|
||||
> 详细方案:[docs/06-期刊名称规范化方案.md](docs/06-期刊名称规范化方案.md)
|
||||
|
||||
### 阶段与预估
|
||||
|
||||
| 阶段 | 内容 | 工作量 | 依赖 |
|
||||
|:----:|------|:----:|:----:|
|
||||
| **1** | 种子化 `global_journals`:按 `journal_issn` 分组提取 canonical name 回填,现有 51 条 curated 不动,其余默认 tier=4 | 1天 | 基线完成,`journal_issn` 覆盖 99.8% |
|
||||
| **2** | 添加 `global_literature.journal_id` FK + 索引 + 回填脚本 | 1天 | Phase 1 |
|
||||
| **3** | 导入时自动规范化:`JournalService` 解析 ISSN → journal_id | 1天 | Phase 2 |
|
||||
| **4** | API 输出层:返回 canonical name + journal_tier | 1天 | Phase 2 |
|
||||
|
||||
### 为什么排在最后
|
||||
|
||||
- **不影响现有功能**——搜索用 `ILIKE` 不需要 FK,期刊信誉评分已基于 ISSN join,现有的就够用
|
||||
- **收益在后端**——规范化后查询更方便、导出更干净,但用户看不到直接的改进
|
||||
- **工具性特征**——做了用户不觉得好,不做用户不会抱怨,但长期必须做的事
|
||||
|
||||
---
|
||||
|
||||
## 远期:AI 辅助科研
|
||||
|
||||
> 详细方案:[docs/08-AI辅助功能规划.md#七ai-辅助科研未来方向](docs/08-AI辅助功能规划.md#七ai-辅助科研未来方向)
|
||||
|
||||
### 前提条件
|
||||
|
||||
| # | 条件 | 当前状态 |
|
||||
|---|------|:-------:|
|
||||
| 1 | 基线导入完成 | 🟡 进行中(1068/1334) |
|
||||
| 2 | ClinicalTrials.gov 集成就绪 | 🔴 未开始 |
|
||||
| 3 | 有活跃付费用户(专业版/团队版) | 🔴 未开始 |
|
||||
|
||||
### 阶段
|
||||
|
||||
| 阶段 | 功能 | 工作量 | 门槛 |
|
||||
|:----:|------|:----:|:----:|
|
||||
| A | 趋势扫描——MeSH 标签时间序列 | 1周 | 条件 1(仅需现有 DB) |
|
||||
| B | 证据综合 MVP——搜索策略 + AI 筛选 | 2周 | 条件 1 |
|
||||
| C | 空白分析——研究设计×癌种×药物交叉 | 2周 | 条件 1+2 |
|
||||
| D | 写作辅助——引用推荐 + 段落生成 | 1周 | RAG 基础设施就绪 |
|
||||
| E | 假设生成——药物-靶点-癌种匹配 | 3周 | 条件 1+2+PubChem |
|
||||
|
||||
### 核心策略
|
||||
|
||||
不做则已,先做 Phase A 验证需求。趋势扫描基于现有数据库,无外部依赖,是最小验证闭环。如果趋势扫描上线后用户 ROI 为正,继续 Phase B-C。如果没人用,停在 Phase A 不扩展。
|
||||
|
||||
---
|
||||
|
||||
## 整体排期预估
|
||||
|
||||
```
|
||||
基线完成 (预计 1-2 天内)
|
||||
│
|
||||
▼
|
||||
Week 1-2: Phase 7 (数据质量) + Phase 8-1-2 (评分字段+算法)
|
||||
Phase 9 T1 (AI 解读 + 按需生成,并行)
|
||||
Phase 10-1 (期刊种子化,并行)
|
||||
│
|
||||
▼
|
||||
Week 3-4: Phase 8-3-5 (Feed 排序 + AI 评估 + 前端标签)
|
||||
Phase 9 T2-1-2 (收藏入知识库 + 可搜索)
|
||||
Phase 10-2 (journal_id FK + 回填)
|
||||
│
|
||||
▼
|
||||
Week 5-6: Phase 8-6 (专业版 5 维展示)
|
||||
Phase 9 T2-3 (RAG 问答)
|
||||
Phase 10-3-4 (导入映射 + API 输出)
|
||||
│
|
||||
▼
|
||||
Week 7+: Phase 8-7 (团队版权重,等客户)
|
||||
Phase 9 T3-1-2 (研究方向配置+个性化)
|
||||
Phase 9 T2-4-5 (图谱+上传文件,等用户量)
|
||||
│
|
||||
▼
|
||||
远期: AI 辅助科研 (等 ClinicalTrials + 用户基础)
|
||||
```
|
||||
|
||||
### 精算汇总
|
||||
|
||||
| 大阶段 | 内容 | 预估人天 | 可并行最大压缩 |
|
||||
|:------:|------|:-------:|:------------:|
|
||||
| Phase 7 | 数据质量控制 | 3天 | — |
|
||||
| Phase 8 | 评分系统 | 10天 | 7天(前后端并行) |
|
||||
| Phase 9 T1 | AI 解读 + 按需生成 | 2天 | 2天 |
|
||||
| Phase 9 T2 | 知识库+RAG | 9天 | 6天 |
|
||||
| Phase 9 T3 | 个性化 AI | 3天 | 2天 |
|
||||
| Phase 10 | 期刊规范化 | 4天 | 3天 |
|
||||
| **合计** | | **~31 天** | **~22 天(含并行)** |
|
||||
| AI 辅助科研 | 远期 | 不计入 | — |
|
||||
|
||||
---
|
||||
|
||||
## 技术难度矩阵(新增)
|
||||
|
||||
| 功能 | 难度 | 原因 |
|
||||
|------|:---:|------|
|
||||
| 评分系统规则打分 | 🟢 低 | 纯 SQL + Python 逻辑,无外部依赖 |
|
||||
| 评分系统 AI 评估 | 🟡 中 | DeepSeek API 调用 + 异步任务编排 + 错误处理 |
|
||||
| 评分系统前端(雷达图) | 🟡 中 | D3/ECharts 雷达图 + 专业版 hover 卡片 |
|
||||
| AI 解读前端 + 按需生成 | 🟢 低 | 纯前端 + 调用已有 `/ai/generate/{pmid}` API |
|
||||
| 收藏即入知识库 | 🟢 低 | 新表 + 简单 CRUD |
|
||||
| Embedding 服务 | 🟡 中 | 新容器部署 + 模型加载 + ES 向量索引 |
|
||||
| RAG 问答 | 🟡 中 | prompt 拼接 + 引用来源标注 |
|
||||
| 研究方向配置 | 🟢 低 | JSON 配置 + prompt 工程 |
|
||||
| 知识图谱共现关系 | 🟡 中 | NER 抽取质量 + 前端 D3 力导向图 |
|
||||
| 知识图谱外部融合 | 🔴 高 | 多数据源对齐 + 实体消歧 |
|
||||
| 前端知识库页面 | 🟡 中 | 列表+搜索+问答+图谱 多视图 |
|
||||
|
||||
| 功能 | 难度 | 原因 |
|
||||
|------|:---:|------|
|
||||
| 多租户 RLS | 🟡 中 | 双层防御架构需要仔细测试 |
|
||||
| PubMed 数据管道 | 🟡 中 | XML 流式解析 + FTP 自动化 |
|
||||
| 标签引擎 | 🟡 中 | MeSH 导入简单,补充标签(靶点/分期)需手工 |
|
||||
| 用户匹配引擎 | 🟢 低 | 纯逻辑计算,无外部依赖 |
|
||||
| 高级搜索 | 🟢 低 | ES 标准操作 |
|
||||
| 科室团队 | 🟢 低 | 标准 CRUD |
|
||||
| Stripe 计费 | 🟡 中 | Webhook 幂等处理 + 订阅状态机 |
|
||||
| AI 摘要 | 🟢 低 | API 调用 + Prompt 工程 |
|
||||
| FDA/指南爬虫 | 🟡 中 | 网站结构变化需要维护 |
|
||||
| 新专科部署脚本 | 🟢 低 | Docker Compose 模板化 |
|
||||
Reference in New Issue
Block a user