feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
This commit is contained in:
@@ -1,17 +1,14 @@
|
||||
# AI智能文献模块 - 数据库设计
|
||||
|
||||
> **文档版本:** v3.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-11-22(Day 4:全文复筛数据库设计)
|
||||
> **更新说明:** 新增全文复筛相关表(`AslLiterature`扩展、`AslFulltextScreeningTask`、`AslFulltextScreeningResult`)
|
||||
|
||||
# AI<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃璅∪<EFBFBD> - <20>唳旿摨栞挽霈?
|
||||
> **<2A><>﹝<EFBFBD><EFB99D>𧋦嚗?* v3.0
|
||||
> **<EFBFBD>𥕦遣<EFBFBD>交<EFBFBD>嚗?* 2025-10-29
|
||||
> **蝏湔擪<EFBFBD><EFBFBD><EFBFBD>** AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>?
|
||||
> **<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD>** 2025-11-22嚗㇄ay 4嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD>蝑𥟇㺭<F0A59F87>桀<EFBFBD>霈曇恣嚗?
|
||||
> **<EFBFBD>湔鰵霂湔<EFBFBD>嚗?* <20>啣<EFBFBD><E595A3>冽<EFBFBD>憭滨<E686AD><E6BBA8>詨<EFBFBD>銵剁<E98AB5>`AslLiterature`<60>拙<EFBFBD><E68B99><EFBFBD>AslFulltextScreeningTask`<60><>AslFulltextScreeningResult`嚗?
|
||||
---
|
||||
|
||||
## <20><> <20><>﹝霂湔<E99C82>
|
||||
|
||||
本文档描述AI智能文献模块的数据库设计,包括数据表结构、关系设计、索引设计等。
|
||||
|
||||
<EFBFBD>祆<EFBFBD>獢<EFBFBD><EFBFBD>餈蚊I<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃璅∪<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>桀<EFBFBD>霈曇恣嚗<EFBFBD><EFBFBD><EFBFBD>祆㺭<EFBFBD>株”蝏𤘪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝟餉挽霈~<EFBFBD><EFBFBD>揣撘閗挽霈∠<EFBFBD><EFBFBD>?
|
||||
**<EFBFBD><EFBFBD><EFBFBD>舀<EFBFBD>**:
|
||||
- <20>唳旿摨橒<E691A8>PostgreSQL 16+
|
||||
- ORM嚗䥪risma
|
||||
@@ -20,36 +17,30 @@
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Schema架构
|
||||
|
||||
ASL模块使用独立的 `asl_schema` 进行数据隔离,确保模块独立性和数据安全。
|
||||
## <EFBFBD><EFBFBD>儭?Schema<EFBFBD>嗆<EFBFBD>
|
||||
|
||||
ASL璅∪<EFBFBD>雿輻鍂<EFBFBD>祉<EFBFBD><EFBFBD>?`asl_schema` 餈𥡝<E9A488><F0A5A19D>唳旿<E594B3>𠉛氖嚗𣬚&靽脲芋<E884B2>㛖𡠺蝡𧢲<E89DA1>批<EFBFBD><E689B9>唳旿摰匧<E691B0><E58CA7>?
|
||||
```
|
||||
platform_schema
|
||||
└── users (用户表)
|
||||
↓
|
||||
asl_schema
|
||||
├── screening_projects (筛选项目)
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> users (<EFBFBD>冽<EFBFBD>銵?
|
||||
<EFBFBD>?asl_schema
|
||||
<20>鎿<EFBFBD><E98EBF><EFBFBD> screening_projects (蝑偦<E89D91>厰★<E58EB0>?
|
||||
<20>鎿<EFBFBD><E98EBF><EFBFBD> literatures (<28><>讃<EFBFBD>∠𤌍)
|
||||
<20>鎿<EFBFBD><E98EBF><EFBFBD> screening_results (<28><><EFBFBD><EFBFBD>萘<EFBFBD>蝏𤘪<E89D8F>)
|
||||
<20>鎿<EFBFBD><E98EBF><EFBFBD> screening_tasks (<28><><EFBFBD><EFBFBD>萘<EFBFBD>隞餃𦛚)
|
||||
├── fulltext_screening_tasks (全文复筛任务) ⭐ Day 4新增
|
||||
└── fulltext_screening_results (全文复筛结果) ⭐ Day 4新增
|
||||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> fulltext_screening_tasks (<EFBFBD>冽<EFBFBD>憭滨<EFBFBD>隞餃𦛚) 潃?Day 4<EFBFBD>啣<EFBFBD>
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> fulltext_screening_results (<EFBFBD>冽<EFBFBD>憭滨<EFBFBD>蝏𤘪<EFBFBD>) 潃?Day 4<EFBFBD>啣<EFBFBD>
|
||||
```
|
||||
|
||||
**v3.0 更新说明(2025-11-22)**:
|
||||
- ✅ 扩展 `literatures` 表:支持全文生命周期管理、PDF存储、全文内容引用
|
||||
- ✅ 新增 `fulltext_screening_tasks` 表:管理全文复筛批处理任务
|
||||
- ✅ 新增 `fulltext_screening_results` 表:存储12字段评估结果
|
||||
- ✅ 符合云原生规范:全文内容存储引用而非直接存储
|
||||
**v3.0 <EFBFBD>湔鰵霂湔<EFBFBD>嚗?025-11-22嚗?*嚗?- <20>?<3F>拙<EFBFBD> `literatures` 銵剁<E98AB5><E58981>舀<EFBFBD><E88880>冽<EFBFBD><E586BD>笔𦶢<E7AC94>冽<EFBFBD>蝞∠<E89D9E><E288A0><EFBFBD>DF摮睃<E691AE><E79D83><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰孵<E691B0><E5ADB5>?- <20>?<3F>啣<EFBFBD> `fulltext_screening_tasks` 銵剁<E98AB5>蝞∠<E89D9E><E288A0>冽<EFBFBD>憭滨<E686AD><E6BBA8>孵<EFBFBD><E5ADB5><EFBFBD>遙<EFBFBD>?- <20>?<3F>啣<EFBFBD> `fulltext_screening_results` 銵剁<E98AB5>摮睃<E691AE>12摮埈挾霂<E68CBE>摯蝏𤘪<E89D8F>
|
||||
- <EFBFBD>?蝚血<E89D9A>鈭穃<E988AD><E7A983>蠘<EFBFBD><E8A098><EFBFBD><EFBFBD><EFBFBD>冽<EFBFBD><E586BD><EFBFBD>捆摮睃<E691AE>撘閧鍂<E996A7>屸<EFBFBD><E5B1B8>湔𦻖摮睃<E691AE>
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ 核心数据表
|
||||
|
||||
## <EFBFBD><EFBFBD>儭?<3F>詨<EFBFBD><E8A9A8>唳旿銵?
|
||||
### 1. 蝑偦<E89D91>厰★<E58EB0>株” (screening_projects)
|
||||
|
||||
**Prisma模型名**: `AslScreeningProject`
|
||||
**Prisma璅∪<EFBFBD><EFBFBD>?*: `AslScreeningProject`
|
||||
**銵典<E98AB5>**: `asl_schema.screening_projects`
|
||||
|
||||
```prisma
|
||||
@@ -64,23 +55,19 @@ model AslScreeningProject {
|
||||
picoCriteria Json @map("pico_criteria")
|
||||
// <20>𩤃<EFBFBD> <20>澆<EFBFBD><E6BE86>澆捆<E6BE86>扯秩<E689AF>𠬍<EFBFBD>
|
||||
// <20>滨垢雿輻鍂: { P, I, C, O, S }
|
||||
// 后端兼容: { P, I, C, O, S } 或 { population, intervention, comparison, outcome, studyDesign }
|
||||
// <EFBFBD>𡒊垢<EFBFBD>澆捆: { P, I, C, O, S } <EFBFBD>?{ population, intervention, comparison, outcome, studyDesign }
|
||||
// screeningService.ts 銝剜<E98A9D>摮埈挾<E59F88>惩<EFBFBD><E683A9>餉<EFBFBD>
|
||||
|
||||
// 筛选标准
|
||||
inclusionCriteria String @map("inclusion_criteria") @db.Text
|
||||
// 蝑偦<EFBFBD>㗇<EFBFBD><EFBFBD>? inclusionCriteria String @map("inclusion_criteria") @db.Text
|
||||
exclusionCriteria String @map("exclusion_criteria") @db.Text
|
||||
|
||||
// 状态
|
||||
status String @default("draft")
|
||||
// 可选值: draft, screening, completed
|
||||
// <EFBFBD>嗆<EFBFBD>? status String @default("draft")
|
||||
// <20>舫<EFBFBD>匧<EFBFBD>? draft, screening, completed
|
||||
|
||||
// 筛选配置
|
||||
screeningConfig Json? @map("screening_config")
|
||||
// 蝑偦<EFBFBD>厰<EFBFBD>蝵? screeningConfig Json? @map("screening_config")
|
||||
// 蝏𤘪<E89D8F>: { models: ["DeepSeek-V3", "Qwen-Max"], style: "standard" }
|
||||
// ⚠️ 模型名称映射:
|
||||
// 前端展示名: DeepSeek-V3 → API名: deepseek-chat
|
||||
// 前端展示名: Qwen-Max → API名: qwen-max
|
||||
// <EFBFBD>𩤃<EFBFBD> 璅∪<E79285><E288AA>滨妍<E6BBA8>惩<EFBFBD>嚗? // <20>滨垢撅閧內<E996A7>? DeepSeek-V3 <20>?API<50>? deepseek-chat
|
||||
// <EFBFBD>滨垢撅閧內<EFBFBD>? Qwen-Max <20>?API<50>? qwen-max
|
||||
// screeningService.ts 銝剜<E98A9D>璅∪<E79285><E288AA>齿<EFBFBD>撠<EFBFBD><E692A0>餉<EFBFBD>
|
||||
|
||||
// <20>唾<EFBFBD>
|
||||
@@ -98,7 +85,7 @@ model AslScreeningProject {
|
||||
}
|
||||
```
|
||||
|
||||
**SQL表结构**:
|
||||
**SQL銵函<EFBFBD><EFBFBD>?*:
|
||||
```sql
|
||||
CREATE TABLE asl_schema.screening_projects (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -121,16 +108,12 @@ CREATE INDEX idx_screening_projects_status ON asl_schema.screening_projects(stat
|
||||
|
||||
---
|
||||
|
||||
### 2. 文献条目表 (literatures) ⭐ v3.0更新
|
||||
### 2. <EFBFBD><EFBFBD>讃<EFBFBD>∠𤌍銵?(literatures) 潃?v3.0<EFBFBD>湔鰵
|
||||
|
||||
**Prisma模型名**: `AslLiterature`
|
||||
**Prisma璅∪<EFBFBD><EFBFBD>?*: `AslLiterature`
|
||||
**銵典<E98AB5>**: `asl_schema.literatures`
|
||||
|
||||
**v3.0 更新说明**:
|
||||
- ✅ 新增 `stage` 字段:追踪文献生命周期(imported → title_screened → pdf_acquired → fulltext_screened → data_extracted)
|
||||
- ✅ 新增 PDF存储字段:支持Dify/OSS双适配(`pdfStorageType`, `pdfStorageRef`, `pdfStatus`)
|
||||
- ✅ 新增 全文存储字段:**符合云原生规范,存储引用而非内容**(`fullTextStorageRef`, `fullTextUrl`)
|
||||
- ✅ 新增索引:`stage`, `hasPdf`, `pdfStatus` 提升查询性能
|
||||
**v3.0 <EFBFBD>湔鰵霂湔<EFBFBD>**嚗?- <20>?<3F>啣<EFBFBD> `stage` 摮埈挾嚗朞蕭頦芣<E9A0A6><E88AA3>桃<EFBFBD><E6A183>賢𪂹<E8B3A2><F0AA82B9><EFBFBD>imported <20>?title_screened <20>?pdf_acquired <20>?fulltext_screened <20>?data_extracted嚗?- <20>?<3F>啣<EFBFBD> PDF摮睃<E691AE>摮埈挾嚗𡁏𣈲<F0A1818F><F0A388B2>ify/OSS<53>屸<EFBFBD><E5B1B8><EFBFBD>嚗ǑpdfStorageType`, `pdfStorageRef`, `pdfStatus`嚗?- <20>?<3F>啣<EFBFBD> <20>冽<EFBFBD>摮睃<E691AE>摮埈挾嚗?*蝚血<E89D9A>鈭穃<E988AD><E7A983>蠘<EFBFBD><E8A098><EFBFBD><EFBFBD>摮睃<E691AE>撘閧鍂<E996A7>屸<EFBFBD><E5B1B8><EFBFBD>捆**嚗ǑfullTextStorageRef`, `fullTextUrl`嚗?- <20>?<3F>啣<EFBFBD>蝝W<E89D9D>嚗䫤stage`, `hasPdf`, `pdfStatus` <20>𣂼<EFBFBD><F0A382BC>亥砭<E4BAA5>扯<EFBFBD>
|
||||
|
||||
```prisma
|
||||
model AslLiterature {
|
||||
@@ -147,25 +130,21 @@ model AslLiterature {
|
||||
publicationYear Int? @map("publication_year")
|
||||
doi String?
|
||||
|
||||
// ⭐ v3.0 新增:文献阶段(生命周期管理)
|
||||
stage String @default("imported") @map("stage")
|
||||
// 潃?v3.0 <EFBFBD>啣<EFBFBD>嚗𡁏<EFBFBD><EFBFBD>桅𧫴畾蛛<EFBFBD><EFBFBD>笔𦶢<EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗? stage String @default("imported") @map("stage")
|
||||
// imported | title_screened | title_included | pdf_acquired | fulltext_screened | data_extracted
|
||||
|
||||
// 云原生存储字段(V1.0 阶段使用,MVP阶段预留)
|
||||
pdfUrl String? @map("pdf_url") // PDF访问URL
|
||||
// 鈭穃<EFBFBD><EFBFBD>笔<EFBFBD><EFBFBD>典<EFBFBD>畾蛛<EFBFBD>V1.0 <20>嗆挾雿輻鍂嚗愢VP<56>嗆挾憸<E68CBE><E686B8>嚗? pdfUrl String? @map("pdf_url") // PDF霈輸䔮URL
|
||||
pdfOssKey String? @map("pdf_oss_key") // OSS摮睃<E691AE>Key嚗<79>鍂鈭𤾸<E988AD><F0A4BEB8>歹<EFBFBD>
|
||||
pdfFileSize Int? @map("pdf_file_size") // <20><>辣憭批<E686AD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// ⭐ v3.0 新增:PDF存储(Dify/OSS双适配)
|
||||
hasPdf Boolean @default(false) @map("has_pdf")
|
||||
// 潃?v3.0 <EFBFBD>啣<EFBFBD>嚗䥪DF摮睃<EFBFBD>嚗㇄ify/OSS<53>屸<EFBFBD><E5B1B8><EFBFBD>嚗? hasPdf Boolean @default(false) @map("has_pdf")
|
||||
pdfStorageType String? @map("pdf_storage_type") // "dify" | "oss"
|
||||
pdfStorageRef String? @map("pdf_storage_ref") // Dify: document_id, OSS: object_key
|
||||
pdfStatus String? @map("pdf_status") // "uploading" | "ready" | "failed"
|
||||
pdfUploadedAt DateTime? @map("pdf_uploaded_at")
|
||||
|
||||
// ⭐ v3.0 新增:全文内容存储(云原生:存储引用而非内容)
|
||||
fullTextStorageType String? @map("full_text_storage_type") // "dify" | "oss"
|
||||
fullTextStorageRef String? @map("full_text_storage_ref") // document_id 或 object_key
|
||||
// 潃?v3.0 <EFBFBD>啣<EFBFBD>嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰孵<EFBFBD><EFBFBD>剁<EFBFBD>鈭穃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮睃<EFBFBD>撘閧鍂<EFBFBD>屸<EFBFBD><EFBFBD><EFBFBD>捆嚗? fullTextStorageType String? @map("full_text_storage_type") // "dify" | "oss"
|
||||
fullTextStorageRef String? @map("full_text_storage_ref") // document_id <20>?object_key
|
||||
fullTextUrl String? @map("full_text_url") // 霈輸䔮URL
|
||||
fullTextFormat String? @map("full_text_format") // "markdown" | "plaintext"
|
||||
fullTextSource String? @map("full_text_source") // "nougat" | "pymupdf"
|
||||
@@ -174,7 +153,7 @@ model AslLiterature {
|
||||
|
||||
// <20>唾<EFBFBD>
|
||||
screeningResults AslScreeningResult[]
|
||||
fulltextScreeningResults AslFulltextScreeningResult[] // ⭐ v3.0 新增
|
||||
fulltextScreeningResults AslFulltextScreeningResult[] // 潃?v3.0 <EFBFBD>啣<EFBFBD>
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
@@ -183,14 +162,14 @@ model AslLiterature {
|
||||
@@schema("asl_schema")
|
||||
@@index([projectId])
|
||||
@@index([doi])
|
||||
@@index([stage]) // ⭐ v3.0 新增
|
||||
@@index([hasPdf]) // ⭐ v3.0 新增
|
||||
@@index([pdfStatus]) // ⭐ v3.0 新增
|
||||
@@index([stage]) // 潃?v3.0 <EFBFBD>啣<EFBFBD>
|
||||
@@index([hasPdf]) // 潃?v3.0 <EFBFBD>啣<EFBFBD>
|
||||
@@index([pdfStatus]) // 潃?v3.0 <EFBFBD>啣<EFBFBD>
|
||||
@@unique([projectId, pmid])
|
||||
}
|
||||
```
|
||||
|
||||
**SQL表结构**(v3.0):
|
||||
**SQL銵函<EFBFBD><EFBFBD>?*嚗ǒ3.0嚗?
|
||||
```sql
|
||||
CREATE TABLE asl_schema.literatures (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -208,13 +187,11 @@ CREATE TABLE asl_schema.literatures (
|
||||
-- <20><>讃<EFBFBD>嗆挾
|
||||
stage TEXT NOT NULL DEFAULT 'imported',
|
||||
|
||||
-- PDF存储(旧字段,V1.0预留)
|
||||
pdf_url TEXT,
|
||||
-- PDF摮睃<EFBFBD>嚗<EFBFBD>唂摮埈挾嚗㲋1.0憸<EFBFBD><EFBFBD>嚗? pdf_url TEXT,
|
||||
pdf_oss_key TEXT,
|
||||
pdf_file_size INTEGER,
|
||||
|
||||
-- PDF存储(新字段,Dify/OSS双适配)
|
||||
has_pdf BOOLEAN NOT NULL DEFAULT false,
|
||||
-- PDF摮睃<EFBFBD>嚗<EFBFBD>鰵摮埈挾嚗㷉ify/OSS<53>屸<EFBFBD><E5B1B8><EFBFBD>嚗? has_pdf BOOLEAN NOT NULL DEFAULT false,
|
||||
pdf_storage_type TEXT,
|
||||
pdf_storage_ref TEXT,
|
||||
pdf_status TEXT,
|
||||
@@ -244,32 +221,28 @@ CREATE INDEX idx_literatures_has_pdf ON asl_schema.literatures(has_pdf);
|
||||
CREATE INDEX idx_literatures_pdf_status ON asl_schema.literatures(pdf_status);
|
||||
```
|
||||
|
||||
**字段说明**:
|
||||
|
||||
**摮埈挾霂湔<EFBFBD>**嚗?
|
||||
| 摮埈挾 | 蝐餃<E89D90> | 霂湔<E99C82> | 霈曇恣<E69B87><E681A3>眏 |
|
||||
|------|------|------|----------|
|
||||
| `stage` | String | 文献阶段 | 追踪文献在整个流程中的位置 |
|
||||
| `pdfStorageType` | String | PDF存储类型 | "dify"\|"oss",支持双适配器 |
|
||||
| `stage` | String | <EFBFBD><EFBFBD>讃<EFBFBD>嗆挾 | 餈質葵<E8B3AA><E891B5>讃<EFBFBD>冽㟲銝芣<E98A9D>蝔衤葉<E8A1A4><E89189><EFBFBD>蝵?|
|
||||
| `pdfStorageType` | String | PDF摮睃<EFBFBD>蝐餃<EFBFBD> | "dify"\|"oss"嚗峕𣈲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
|
||||
| `pdfStorageRef` | String | PDF摮睃<E691AE>撘閧鍂 | Dify<66><79>ocument_id<69>𤈛SS<53><53>bject_key |
|
||||
| `fullTextStorageType` | String | 全文存储类型 | 云原生:不直接存全文,存引用 ✅ |
|
||||
| `fullTextStorageRef` | String | 全文存储引用 | 指向Dify或OSS中的全文文档 ✅ |
|
||||
| `fullTextStorageType` | String | <EFBFBD>冽<EFBFBD>摮睃<EFBFBD>蝐餃<EFBFBD> | 鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>銝滨凒<E6BBA8>亙<EFBFBD><E4BA99>冽<EFBFBD>嚗<EFBFBD><E59A97>撘閧鍂 <20>?|
|
||||
| `fullTextStorageRef` | String | <EFBFBD>冽<EFBFBD>摮睃<EFBFBD>撘閧鍂 | <20><><EFBFBD>Dify<66>𤈛SS銝剔<E98A9D><E58994>冽<EFBFBD><E586BD><EFBFBD>﹝ <20>?|
|
||||
| `fullTextUrl` | String | <20>冽<EFBFBD>霈輸䔮URL | <20>湔𦻖霈輸䔮<E8BCB8>冽<EFBFBD><E586BD><EFBFBD>RL |
|
||||
| `fullTextTokenCount` | Int | Token<65>圈<EFBFBD> | <20>其<EFBFBD><E585B6>鞉𧋦隡啁<E99AA1><E59581>𥴰LM靚<4D>鍂隡睃<E99AA1> |
|
||||
|
||||
**云原生设计亮点** ⭐:
|
||||
- ✅ 全文内容存储在OSS/Dify,数据库只存引用(符合云原生规范)
|
||||
- ✅ 支持Dify → OSS无缝迁移(只需切换storageType)
|
||||
- ✅ 数据库轻量,避免大量TEXT字段
|
||||
**鈭穃<EFBFBD><EFBFBD>蠘挽霈∩漁<EFBFBD>?* 潃琜<E6BD83>
|
||||
- <20>?<3F>冽<EFBFBD><E586BD><EFBFBD>捆摮睃<E691AE><E79D83>汰SS/Dify嚗峕㺭<E5B395>桀<EFBFBD><E6A180>芸<EFBFBD>撘閧鍂嚗<E98D82>泵<EFBFBD><E6B3B5><EFBFBD><EFBFBD>毺<EFBFBD>閫<EFBFBD><E996AB>嚗?- <20>?<3F>舀<EFBFBD>Dify <20>?OSS<53>删<EFBFBD>餈<EFBFBD>宏嚗<E5AE8F>蘨<EFBFBD><E898A8><EFBFBD><EFBFBD>揢storageType嚗?- <20>?<3F>唳旿摨栞蝠<E6A09E>𧶏<EFBFBD><F0A7B68F>踹<EFBFBD>憭折<E686AD>TEXT摮埈挾
|
||||
|
||||
---
|
||||
|
||||
### 3. 蝑偦<E89D91>厩<EFBFBD><E58EA9>𡏭” (screening_results)
|
||||
|
||||
**Prisma模型名**: `AslScreeningResult`
|
||||
**Prisma璅∪<EFBFBD><EFBFBD>?*: `AslScreeningResult`
|
||||
**銵典<E98AB5>**: `asl_schema.screening_results`
|
||||
|
||||
**设计亮点**:支持双模型(DeepSeek + Qwen)并行验证,包含完整的判断、证据和冲突检测。
|
||||
|
||||
**霈曇恣鈭桃<EFBFBD>**嚗𡁏𣈲<F0A1818F><F0A388B2><EFBFBD>璅∪<E79285>嚗㇄eepSeek + Qwen嚗匧僎銵屸<E98AB5>霂<EFBFBD><E99C82><EFBFBD><EFBFBD>鉄摰峕㟲<E5B395><E39FB2>ế<EFBFBD>准<EFBFBD><E58786><EFBFBD><EFBFBD>桀<EFBFBD><E6A180>脩<EFBFBD>璉<EFBFBD>瘚卝<E7989A>?
|
||||
```prisma
|
||||
model AslScreeningResult {
|
||||
id String @id @default(uuid())
|
||||
@@ -310,36 +283,27 @@ model AslScreeningResult {
|
||||
qwenSEvidence String? @map("qwen_s_evidence") @db.Text
|
||||
qwenReason String? @map("qwen_reason") @db.Text
|
||||
|
||||
// 冲突状态
|
||||
conflictStatus String @default("none") @map("conflict_status")
|
||||
// 可选值: none, conflict, resolved
|
||||
// <EFBFBD>脩<EFBFBD><EFBFBD>嗆<EFBFBD>? conflictStatus String @default("none") @map("conflict_status")
|
||||
// <20>舫<EFBFBD>匧<EFBFBD>? none, conflict, resolved
|
||||
conflictFields Json? @map("conflict_fields")
|
||||
// 蝷箔<E89DB7>: ["P", "I", "conclusion"]
|
||||
|
||||
// 最终决策(Week 4 混合方案使用)
|
||||
finalDecision String? @map("final_decision") // "include" | "exclude" | null
|
||||
// ⭐ Week 4 说明:人工复核后设置此字段,作为最终决策
|
||||
// - include: 人工决定纳入(可能推翻AI建议)
|
||||
// - exclude: 人工决定排除(可能推翻AI建议)
|
||||
// - null: 未复核,使用AI决策
|
||||
// <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝑吔<EFBFBD>Week 4 瘛瑕<E7989B><E79195>寞<EFBFBD>雿輻鍂嚗? finalDecision String? @map("final_decision") // "include" | "exclude" | null
|
||||
// 潃?Week 4 霂湔<E99C82>嚗帋犖撌亙<E6928C><E4BA99>詨<EFBFBD>霈曄蔭甇文<E79487>畾蛛<E795BE>雿靝蛹<E99D9D><E89BB9>蝏<EFBFBD><E89D8F>蝑? // - include: 鈭箏極<E7AE8F>喳<EFBFBD>蝥喳<E89DA5>嚗<EFBFBD>虾<EFBFBD>賣綫蝧翠I撱箄悅嚗? // - exclude: 鈭箏極<E7AE8F>喳<EFBFBD><E596B3>㘾膄嚗<E88684>虾<EFBFBD>賣綫蝧翠I撱箄悅嚗? // - null: <20>芸<EFBFBD><E88AB8>賂<EFBFBD>雿輻鍂AI<41>喟<EFBFBD>
|
||||
|
||||
finalDecisionBy String? @map("final_decision_by") // userId
|
||||
finalDecisionAt DateTime? @map("final_decision_at")
|
||||
|
||||
exclusionReason String? @map("exclusion_reason") @db.Text
|
||||
// ⭐ Week 4 说明:人工填写的排除原因(优先级高于AI提取)
|
||||
// - 如果finalDecision=exclude,此字段存储人工填写的原因
|
||||
// - 如果为null,前端自动从AI判断中提取(dsPJudgment/dsIJudgment等)
|
||||
// 潃?Week 4 霂湔<EFBFBD>嚗帋犖撌亙‵<EFBFBD>嗵<EFBFBD><EFBFBD>㘾膄<EFBFBD>笔<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>漣擃䀝<EFBFBD>AI<EFBFBD>𣂼<EFBFBD>嚗? // - 憒<><E68692>finalDecision=exclude嚗峕迨摮埈挾摮睃<E691AE>鈭箏極憛怠<E6869B><E680A0><EFBFBD><EFBFBD><EFBFBD>? // - 憒<><E68692>銝槃ull嚗<6C><E59A97>蝡航䌊<E888AA>其<EFBFBD>AI<41>斗鱏銝剜<E98A9D><E5899C>吔<EFBFBD>dsPJudgment/dsIJudgment蝑㚁<E89D91>
|
||||
// - Week 4 <20>萘<EFBFBD>蝏𤘪<E89D8F>憿萎蝙<E8908E>冽迨摮埈挾<E59F88>曄內<E69B84>㘾膄<E398BE>笔<EFBFBD>
|
||||
|
||||
// AI处理状态
|
||||
aiProcessingStatus String @default("pending") @map("ai_processing_status")
|
||||
// 可选值: pending, processing, completed, failed
|
||||
// AI憭<EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD>? aiProcessingStatus String @default("pending") @map("ai_processing_status")
|
||||
// <20>舫<EFBFBD>匧<EFBFBD>? pending, processing, completed, failed
|
||||
aiProcessedAt DateTime? @map("ai_processed_at")
|
||||
aiErrorMessage String? @map("ai_error_message") @db.Text
|
||||
|
||||
// 可追溯信息
|
||||
promptVersion String @default("v1.0.0") @map("prompt_version")
|
||||
// <EFBFBD>航蕭皞臭縑<EFBFBD>? promptVersion String @default("v1.0.0") @map("prompt_version")
|
||||
rawOutput Json? @map("raw_output") // <20>笔<EFBFBD>LLM颲枏枂嚗<E69E82><E59A97>隞踝<E99A9E>
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
@@ -351,11 +315,10 @@ model AslScreeningResult {
|
||||
@@index([literatureId])
|
||||
@@index([conflictStatus])
|
||||
@@index([finalDecision])
|
||||
@@unique([projectId, literatureId]) // 一篇文献在一个项目中只有一个筛选结果
|
||||
}
|
||||
@@unique([projectId, literatureId]) // 銝<EFBFBD>蝭<EFBFBD><EFBFBD><EFBFBD>桀銁銝<EFBFBD>銝芷★<EFBFBD>桐葉<EFBFBD>芣<EFBFBD>銝<EFBFBD>銝芰<EFBFBD><EFBFBD>厩<EFBFBD><EFBFBD>?}
|
||||
```
|
||||
|
||||
**SQL表结构**(简化版):
|
||||
**SQL銵函<EFBFBD><EFBFBD>?*嚗<><E59A97><EFBFBD>𣇉<EFBFBD>嚗?
|
||||
```sql
|
||||
CREATE TABLE asl_schema.screening_results (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -390,23 +353,19 @@ CREATE TABLE asl_schema.screening_results (
|
||||
qwen_s_evidence TEXT,
|
||||
qwen_reason TEXT,
|
||||
|
||||
-- 冲突状态
|
||||
conflict_status TEXT NOT NULL DEFAULT 'none',
|
||||
-- <EFBFBD>脩<EFBFBD><EFBFBD>嗆<EFBFBD>? conflict_status TEXT NOT NULL DEFAULT 'none',
|
||||
conflict_fields JSONB,
|
||||
|
||||
-- 最终决策
|
||||
final_decision TEXT,
|
||||
-- <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝑? final_decision TEXT,
|
||||
final_decision_by TEXT,
|
||||
final_decision_at TIMESTAMP(3),
|
||||
exclusion_reason TEXT,
|
||||
|
||||
-- AI处理状态
|
||||
ai_processing_status TEXT NOT NULL DEFAULT 'pending',
|
||||
-- AI憭<EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD>? ai_processing_status TEXT NOT NULL DEFAULT 'pending',
|
||||
ai_processed_at TIMESTAMP(3),
|
||||
ai_error_message TEXT,
|
||||
|
||||
-- 可追溯信息
|
||||
prompt_version TEXT NOT NULL DEFAULT 'v1.0.0',
|
||||
-- <EFBFBD>航蕭皞臭縑<EFBFBD>? prompt_version TEXT NOT NULL DEFAULT 'v1.0.0',
|
||||
raw_output JSONB,
|
||||
|
||||
created_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -429,7 +388,7 @@ CREATE INDEX idx_screening_results_final_decision ON asl_schema.screening_result
|
||||
|
||||
### 4. 蝑偦<E89D91>劐遙<E58A90>∟” (screening_tasks)
|
||||
|
||||
**Prisma模型名**: `AslScreeningTask`
|
||||
**Prisma璅∪<EFBFBD><EFBFBD>?*: `AslScreeningTask`
|
||||
**銵典<E98AB5>**: `asl_schema.screening_tasks`
|
||||
|
||||
```prisma
|
||||
@@ -440,7 +399,7 @@ model AslScreeningTask {
|
||||
|
||||
taskType String @map("task_type") // "title_abstract" | "full_text"
|
||||
status String @default("pending")
|
||||
// 可选值: pending, running, completed, failed
|
||||
// <EFBFBD>舫<EFBFBD>匧<EFBFBD>? pending, running, completed, failed
|
||||
|
||||
// 餈𥕦漲蝏蠘恣
|
||||
totalItems Int @map("total_items")
|
||||
@@ -467,7 +426,7 @@ model AslScreeningTask {
|
||||
}
|
||||
```
|
||||
|
||||
**SQL表结构**:
|
||||
**SQL銵函<EFBFBD><EFBFBD>?*:
|
||||
```sql
|
||||
CREATE TABLE asl_schema.screening_tasks (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -495,13 +454,12 @@ CREATE INDEX idx_screening_tasks_status ON asl_schema.screening_tasks(status);
|
||||
|
||||
---
|
||||
|
||||
### 5. 全文复筛任务表 (fulltext_screening_tasks) ⭐ v3.0新增
|
||||
### 5. <EFBFBD>冽<EFBFBD>憭滨<EFBFBD>隞餃𦛚銵?(fulltext_screening_tasks) 潃?v3.0<EFBFBD>啣<EFBFBD>
|
||||
|
||||
**Prisma模型名**: `AslFulltextScreeningTask`
|
||||
**Prisma璅∪<EFBFBD><EFBFBD>?*: `AslFulltextScreeningTask`
|
||||
**銵典<E98AB5>**: `asl_schema.fulltext_screening_tasks`
|
||||
|
||||
**设计目标**:管理全文复筛的批处理任务,支持双模型并行调用、成本追踪、降级模式
|
||||
|
||||
**霈曇恣<EFBFBD>格<EFBFBD>**嚗𡁶恣<F0A181B6><E681A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑𤤿<E89D91><F0A4A4BF>孵<EFBFBD><E5ADB5><EFBFBD>遙<EFBFBD>∴<EFBFBD><E288B4>舀<EFBFBD><E88880>峕芋<E5B395>见僎銵諹<E98AB5><E8ABB9>具<EFBFBD><E585B7><EFBFBD><EFBFBD>祈蕭頦芥<E9A0A6><E88AA5><EFBFBD>蝥扳芋撘?
|
||||
```prisma
|
||||
model AslFulltextScreeningTask {
|
||||
id String @id @default(uuid())
|
||||
@@ -513,8 +471,7 @@ model AslFulltextScreeningTask {
|
||||
modelB String @map("model_b") // "qwen-max"
|
||||
promptVersion String @default("v1.0.0") @map("prompt_version")
|
||||
|
||||
// 任务状态
|
||||
status String @default("pending")
|
||||
// 隞餃𦛚<EFBFBD>嗆<EFBFBD>? status String @default("pending")
|
||||
// "pending" | "running" | "completed" | "failed" | "cancelled"
|
||||
|
||||
// 餈𥕦漲蝏蠘恣
|
||||
@@ -522,8 +479,7 @@ model AslFulltextScreeningTask {
|
||||
processedCount Int @default(0) @map("processed_count")
|
||||
successCount Int @default(0) @map("success_count")
|
||||
failedCount Int @default(0) @map("failed_count")
|
||||
degradedCount Int @default(0) @map("degraded_count") // 单模型成功
|
||||
|
||||
degradedCount Int @default(0) @map("degraded_count") // <EFBFBD>閙芋<EFBFBD>𧢲<EFBFBD><EFBFBD>?
|
||||
// <20>鞉𧋦蝏蠘恣
|
||||
totalTokens Int @default(0) @map("total_tokens")
|
||||
totalCost Float @default(0) @map("total_cost")
|
||||
@@ -551,7 +507,7 @@ model AslFulltextScreeningTask {
|
||||
}
|
||||
```
|
||||
|
||||
**SQL表结构**:
|
||||
**SQL銵函<EFBFBD><EFBFBD>?*:
|
||||
```sql
|
||||
CREATE TABLE asl_schema.fulltext_screening_tasks (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -562,8 +518,7 @@ CREATE TABLE asl_schema.fulltext_screening_tasks (
|
||||
model_b TEXT NOT NULL,
|
||||
prompt_version TEXT NOT NULL DEFAULT 'v1.0.0',
|
||||
|
||||
-- 任务状态
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
-- 隞餃𦛚<EFBFBD>嗆<EFBFBD>? status TEXT NOT NULL DEFAULT 'pending',
|
||||
|
||||
-- 餈𥕦漲蝏蠘恣
|
||||
total_count INTEGER NOT NULL,
|
||||
@@ -597,32 +552,25 @@ CREATE INDEX idx_fulltext_screening_tasks_status ON asl_schema.fulltext_screenin
|
||||
CREATE INDEX idx_fulltext_screening_tasks_created_at ON asl_schema.fulltext_screening_tasks(created_at);
|
||||
```
|
||||
|
||||
**字段说明**:
|
||||
|
||||
**摮埈挾霂湔<EFBFBD>**嚗?
|
||||
| 摮埈挾 | 蝐餃<E89D90> | 霂湔<E99C82> |
|
||||
|------|------|------|
|
||||
| `modelA / modelB` | String | 双模型名称(deepseek-v3 + qwen-max) |
|
||||
| `degradedCount` | Int | 单模型成功的任务数(容错机制) |
|
||||
| `totalTokens` | Int | 累计Token使用量 |
|
||||
| `totalCost` | Float | 累计成本(元) |
|
||||
| `promptVersion` | String | Prompt版本(可追溯) |
|
||||
| `modelA / modelB` | String | <EFBFBD>峕芋<EFBFBD>见<EFBFBD>蝘堆<EFBFBD>deepseek-v3 + qwen-max嚗?|
|
||||
| `degradedCount` | Int | <EFBFBD>閙芋<EFBFBD>𧢲<EFBFBD><EFBFBD>毺<EFBFBD>隞餃𦛚<EFBFBD>堆<EFBFBD>摰寥<EFBFBD><EFBFBD>箏<EFBFBD>嚗?|
|
||||
| `totalTokens` | Int | 蝝航恣Token雿輻鍂<EFBFBD>?|
|
||||
| `totalCost` | Float | 蝝航恣<EFBFBD>鞉𧋦嚗<EFBFBD><EFBFBD>嚗?|
|
||||
| `promptVersion` | String | Prompt<EFBFBD><EFBFBD>𧋦嚗<EFBFBD>虾餈賣滲嚗?|
|
||||
|
||||
---
|
||||
|
||||
### 6. 全文复筛结果表 (fulltext_screening_results) ⭐ v3.0新增
|
||||
### 6. <EFBFBD>冽<EFBFBD>憭滨<EFBFBD>蝏𤘪<EFBFBD>銵?(fulltext_screening_results) 潃?v3.0<EFBFBD>啣<EFBFBD>
|
||||
|
||||
**Prisma模型名**: `AslFulltextScreeningResult`
|
||||
**Prisma璅∪<EFBFBD><EFBFBD>?*: `AslFulltextScreeningResult`
|
||||
**銵典<E98AB5>**: `asl_schema.fulltext_screening_results`
|
||||
|
||||
**设计目标**:存储12字段详细评估结果,支持双模型对比、验证结果、冲突检测
|
||||
|
||||
**设计亮点**:
|
||||
- ✅ 完整的双模型结果(fields + overall + logs)
|
||||
- ✅ 医学逻辑验证和证据链验证结果
|
||||
- ✅ 冲突检测和复核优先级
|
||||
- ✅ 降级模式支持(单模型成功)
|
||||
- ✅ JSON存储12字段评估(符合云原生规范)
|
||||
|
||||
**霈曇恣<EFBFBD>格<EFBFBD>**嚗𡁜<E59A97><F0A1819C>?2摮埈挾霂衣<E99C82>霂<EFBFBD>摯蝏𤘪<E89D8F>嚗峕𣈲<E5B395><F0A388B2><EFBFBD>璅∪<E79285>撖寞<E69296><E5AF9E><EFBFBD><EFBFBD>霂<EFBFBD><E99C82><EFBFBD>栶<EFBFBD><E6A0B6><EFBFBD>蝒<EFBFBD><E89D92>瘚?
|
||||
**霈曇恣鈭桃<E988AD>**嚗?- <20>?摰峕㟲<E5B395><E39FB2><EFBFBD>璅∪<E79285>蝏𤘪<E89D8F>嚗Êields + overall + logs嚗?- <20>?<3F>餃郎<E9A483>餉<EFBFBD>撉諹<E69289><E8ABB9>諹<EFBFBD><E8ABB9>桅曎撉諹<E69289>蝏𤘪<E89D8F>
|
||||
- <20>?<3F>脩<EFBFBD>璉<EFBFBD>瘚见<E7989A>憭齿瓲隡睃<E99AA1>蝥?- <20>?<3F>滨漣璅∪<E79285><E288AA>舀<EFBFBD>嚗<EFBFBD><E59A97>璅∪<E79285><E288AA>𣂼<EFBFBD>嚗?- <20>?JSON摮睃<E691AE>12摮埈挾霂<E68CBE>摯嚗<E691AF>泵<EFBFBD><E6B3B5><EFBFBD><EFBFBD>毺<EFBFBD>閫<EFBFBD><E996AB>嚗?
|
||||
```prisma
|
||||
model AslFulltextScreeningResult {
|
||||
id String @id @default(uuid())
|
||||
@@ -633,7 +581,7 @@ model AslFulltextScreeningResult {
|
||||
literatureId String @map("literature_id")
|
||||
literature AslLiterature @relation(fields: [literatureId], references: [id], onDelete: Cascade)
|
||||
|
||||
// ====== 模型A结果(DeepSeek-V3)======
|
||||
// ====== 璅∪<EFBFBD>A蝏𤘪<EFBFBD>嚗㇄eepSeek-V3嚗?=====
|
||||
modelAName String @map("model_a_name")
|
||||
modelAStatus String @map("model_a_status") // "success" | "failed"
|
||||
modelAFields Json @map("model_a_fields") // 12摮埈挾霂<E68CBE>摯 { field1: {...}, field2: {...}, ... }
|
||||
@@ -644,7 +592,7 @@ model AslFulltextScreeningResult {
|
||||
modelACost Float? @map("model_a_cost")
|
||||
modelAError String? @map("model_a_error") @db.Text
|
||||
|
||||
// ====== 模型B结果(Qwen-Max)======
|
||||
// ====== 璅∪<EFBFBD>B蝏𤘪<EFBFBD>嚗㇋wen-Max嚗?=====
|
||||
modelBName String @map("model_b_name")
|
||||
modelBStatus String @map("model_b_status")
|
||||
modelBFields Json @map("model_b_fields")
|
||||
@@ -659,22 +607,21 @@ model AslFulltextScreeningResult {
|
||||
medicalLogicIssues Json? @map("medical_logic_issues") // MedicalLogicValidator颲枏枂
|
||||
evidenceChainIssues Json? @map("evidence_chain_issues") // EvidenceChainValidator颲枏枂
|
||||
|
||||
// ====== 冲突检测 ======
|
||||
// ====== <EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚?======
|
||||
isConflict Boolean @default(false) @map("is_conflict")
|
||||
conflictSeverity String? @map("conflict_severity") // "high" | "medium" | "low"
|
||||
conflictFields String[] @map("conflict_fields") // ["field1", "field9", "overall"]
|
||||
conflictDetails Json? @map("conflict_details")
|
||||
reviewPriority Int? @map("review_priority") // 0-100复核优先级
|
||||
reviewDeadline DateTime? @map("review_deadline")
|
||||
reviewPriority Int? @map("review_priority") // 0-100憭齿瓲隡睃<EFBFBD>蝥? reviewDeadline DateTime? @map("review_deadline")
|
||||
|
||||
// ====== 最终决策 ======
|
||||
// ====== <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝑?======
|
||||
finalDecision String? @map("final_decision") // "include" | "exclude" | null
|
||||
finalDecisionBy String? @map("final_decision_by")
|
||||
finalDecisionAt DateTime? @map("final_decision_at")
|
||||
exclusionReason String? @map("exclusion_reason") @db.Text
|
||||
reviewNotes String? @map("review_notes") @db.Text
|
||||
|
||||
// ====== 处理状态 ======
|
||||
// ====== 憭<EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD>?======
|
||||
processingStatus String @default("pending") @map("processing_status")
|
||||
// "pending" | "processing" | "completed" | "failed" | "degraded"
|
||||
isDegraded Boolean @default(false) @map("is_degraded")
|
||||
@@ -682,7 +629,7 @@ model AslFulltextScreeningResult {
|
||||
|
||||
processedAt DateTime? @map("processed_at")
|
||||
|
||||
// ====== 可追溯信息 ======
|
||||
// ====== <EFBFBD>航蕭皞臭縑<EFBFBD>?======
|
||||
promptVersion String @default("v1.0.0") @map("prompt_version")
|
||||
rawOutputA Json? @map("raw_output_a")
|
||||
rawOutputB Json? @map("raw_output_b")
|
||||
@@ -698,11 +645,10 @@ model AslFulltextScreeningResult {
|
||||
@@index([isConflict])
|
||||
@@index([finalDecision])
|
||||
@@index([reviewPriority])
|
||||
@@unique([projectId, literatureId]) // 一篇文献只有一个全文复筛结果
|
||||
}
|
||||
@@unique([projectId, literatureId]) // 銝<EFBFBD>蝭<EFBFBD><EFBFBD><EFBFBD>桀蘨<EFBFBD>劐<EFBFBD>銝芸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑𤤿<EFBFBD><EFBFBD>?}
|
||||
```
|
||||
|
||||
**SQL表结构**(简化版,实际包含所有字段):
|
||||
**SQL銵函<EFBFBD><EFBFBD>?*嚗<><E59A97><EFBFBD>𣇉<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD>急<EFBFBD><E680A5>匧<EFBFBD>畾蛛<E795BE>:
|
||||
```sql
|
||||
CREATE TABLE asl_schema.fulltext_screening_results (
|
||||
id TEXT PRIMARY KEY,
|
||||
@@ -736,29 +682,25 @@ CREATE TABLE asl_schema.fulltext_screening_results (
|
||||
medical_logic_issues JSONB,
|
||||
evidence_chain_issues JSONB,
|
||||
|
||||
-- 冲突检测
|
||||
is_conflict BOOLEAN NOT NULL DEFAULT false,
|
||||
-- <EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚? is_conflict BOOLEAN NOT NULL DEFAULT false,
|
||||
conflict_severity TEXT,
|
||||
conflict_fields TEXT[],
|
||||
conflict_details JSONB,
|
||||
review_priority INTEGER,
|
||||
review_deadline TIMESTAMP(3),
|
||||
|
||||
-- 最终决策
|
||||
final_decision TEXT,
|
||||
-- <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝑? final_decision TEXT,
|
||||
final_decision_by TEXT,
|
||||
final_decision_at TIMESTAMP(3),
|
||||
exclusion_reason TEXT,
|
||||
review_notes TEXT,
|
||||
|
||||
-- 处理状态
|
||||
processing_status TEXT NOT NULL DEFAULT 'pending',
|
||||
-- 憭<EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD>? processing_status TEXT NOT NULL DEFAULT 'pending',
|
||||
is_degraded BOOLEAN NOT NULL DEFAULT false,
|
||||
degraded_model TEXT,
|
||||
processed_at TIMESTAMP(3),
|
||||
|
||||
-- 可追溯信息
|
||||
prompt_version TEXT NOT NULL DEFAULT 'v1.0.0',
|
||||
-- <EFBFBD>航蕭皞臭縑<EFBFBD>? prompt_version TEXT NOT NULL DEFAULT 'v1.0.0',
|
||||
raw_output_a JSONB,
|
||||
raw_output_b JSONB,
|
||||
|
||||
@@ -782,8 +724,7 @@ CREATE INDEX idx_fulltext_screening_results_final_decision ON asl_schema.fulltex
|
||||
CREATE INDEX idx_fulltext_screening_results_review_priority ON asl_schema.fulltext_screening_results(review_priority);
|
||||
```
|
||||
|
||||
**JSON字段示例**:
|
||||
|
||||
**JSON摮埈挾蝷箔<EFBFBD>**嚗?
|
||||
**modelAFields (12摮埈挾霂<E68CBE>摯)**:
|
||||
```json
|
||||
{
|
||||
@@ -791,7 +732,7 @@ CREATE INDEX idx_fulltext_screening_results_review_priority ON asl_schema.fullte
|
||||
"present": true,
|
||||
"completeness": "摰峕㟲",
|
||||
"extractable": true,
|
||||
"quote": "第一作者:Zhang et al., 发表于 JAMA 2023...",
|
||||
"quote": "蝚砌<E89D9A>雿𡏭<E99BBF><F0A18FAD><EFBFBD>Zhang et al., <EFBFBD>𤏸”鈭?JAMA 2023...",
|
||||
"location": "Title page, Methods section",
|
||||
"note": "<22><>讃<EFBFBD>交<EFBFBD>靽⊥<E99DBD>摰峕㟲"
|
||||
},
|
||||
@@ -806,9 +747,9 @@ CREATE INDEX idx_fulltext_screening_results_review_priority ON asl_schema.fullte
|
||||
"decision": "include",
|
||||
"confidence": 0.92,
|
||||
"keyIssues": [
|
||||
"随机化方法描述完整",
|
||||
"<22>𤩺㦤<F0A4A9BA>𡝗䲮瘜閙<E7989C>餈啣<E9A488><E595A3>?,
|
||||
"<22>脫<EFBFBD>摰墧鴌皜<E9B48C>苊",
|
||||
"结局指标可提取"
|
||||
"蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD><EFBFBD>舀<EFBFBD><E88880>?
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -826,7 +767,7 @@ CREATE INDEX idx_fulltext_screening_results_review_priority ON asl_schema.fullte
|
||||
{
|
||||
"field9": {
|
||||
"modelA": "摰峕㟲",
|
||||
"modelB": "不完整",
|
||||
"modelB": "銝滚<E98A9D><E6BB9A>?,
|
||||
"severity": "high"
|
||||
}
|
||||
}
|
||||
@@ -834,8 +775,7 @@ CREATE INDEX idx_fulltext_screening_results_review_priority ON asl_schema.fullte
|
||||
|
||||
---
|
||||
|
||||
## 📊 数据关系图(v3.0更新)
|
||||
|
||||
## <EFBFBD><EFBFBD> <20>唳旿<E594B3>喟頂<E5969F>橘<EFBFBD>v3.0<EFBFBD>湔鰵嚗?
|
||||
```
|
||||
literature_screening_projects (1) <20><><EFBFBD><EFBFBD>< (N) literature_items
|
||||
literature_screening_projects (1) <20><><EFBFBD><EFBFBD>< (N) title_abstract_screening_results
|
||||
@@ -845,43 +785,41 @@ literature_screening_projects (1) ──< (N) screening_tasks
|
||||
|
||||
---
|
||||
|
||||
## 🔍 索引设计汇总(v3.0更新)
|
||||
|
||||
## <EFBFBD><EFBFBD> 蝝W<E89D9D>霈曇恣瘙<E681A3><E79899>鳴<EFBFBD>v3.0<EFBFBD>湔鰵嚗?
|
||||
| 銵典<E98AB5> | 蝝W<E89D9D>摮埈挾 | 蝝W<E89D9D>蝐餃<E89D90> | 霂湔<E99C82> |
|
||||
|------|---------|---------|------|
|
||||
| screening_projects | user_id | B-tree | <20>冽<EFBFBD>憿寧𤌍<E5AFA7>亥砭 |
|
||||
| screening_projects | status | B-tree | 状态筛选 |
|
||||
| screening_projects | status | B-tree | <EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
|
||||
| literatures | project_id | B-tree | 憿寧𤌍<E5AFA7><F0A48C8D>讃<EFBFBD>亥砭 |
|
||||
| literatures | doi | B-tree | DOI<4F>仿<EFBFBD> |
|
||||
| literatures | stage ⭐ | B-tree | 文献阶段查询 v3.0 |
|
||||
| literatures | has_pdf ⭐ | B-tree | PDF获取状态 v3.0 |
|
||||
| literatures | pdf_status ⭐ | B-tree | PDF上传状态 v3.0 |
|
||||
| literatures | stage 潃?| B-tree | <EFBFBD><EFBFBD>讃<EFBFBD>嗆挾<EFBFBD>亥砭 v3.0 |
|
||||
| literatures | has_pdf 潃?| B-tree | PDF<EFBFBD>瑕<EFBFBD><EFBFBD>嗆<EFBFBD>?v3.0 |
|
||||
| literatures | pdf_status 潃?| B-tree | PDF銝𠹺<EFBFBD><EFBFBD>嗆<EFBFBD>?v3.0 |
|
||||
| literatures | (project_id, pmid) | Unique | <20>脫迫<E884AB>滚<EFBFBD>撖澆<E69296> |
|
||||
| screening_results | project_id | B-tree | 憿寧𤌍蝏𤘪<E89D8F><F0A498AA>亥砭 |
|
||||
| screening_results | literature_id | B-tree | <20><>讃蝏𤘪<E89D8F><F0A498AA>亥砭 |
|
||||
| screening_results | conflict_status | B-tree | 冲突筛选 |
|
||||
| screening_results | final_decision | B-tree | 决策筛选 |
|
||||
| screening_results | (project_id, literature_id) | Unique | 唯一性约束 |
|
||||
| screening_results | conflict_status | B-tree | <EFBFBD>脩<EFBFBD>蝑偦<EFBFBD>?|
|
||||
| screening_results | final_decision | B-tree | <EFBFBD>喟<EFBFBD>蝑偦<EFBFBD>?|
|
||||
| screening_results | (project_id, literature_id) | Unique | <EFBFBD>臭<EFBFBD><EFBFBD>抒漲<EFBFBD>?|
|
||||
| screening_tasks | project_id | B-tree | 憿寧𤌍隞餃𦛚<E9A483>亥砭 |
|
||||
| screening_tasks | status | B-tree | 任务状态筛选 |
|
||||
| fulltext_screening_tasks ⭐ | project_id | B-tree | 全文任务查询 v3.0 |
|
||||
| fulltext_screening_tasks ⭐ | status | B-tree | 任务状态筛选 v3.0 |
|
||||
| fulltext_screening_tasks ⭐ | created_at | B-tree | 时间排序 v3.0 |
|
||||
| fulltext_screening_results ⭐ | task_id | B-tree | 任务结果查询 v3.0 |
|
||||
| fulltext_screening_results ⭐ | project_id | B-tree | 项目结果查询 v3.0 |
|
||||
| fulltext_screening_results ⭐ | literature_id | B-tree | 文献结果查询 v3.0 |
|
||||
| fulltext_screening_results ⭐ | is_conflict | B-tree | 冲突筛选 v3.0 |
|
||||
| fulltext_screening_results ⭐ | final_decision | B-tree | 决策筛选 v3.0 |
|
||||
| fulltext_screening_results ⭐ | review_priority | B-tree | 复核优先级 v3.0 |
|
||||
| fulltext_screening_results ⭐ | (project_id, literature_id) | Unique | 唯一性约束 v3.0 |
|
||||
| screening_tasks | status | B-tree | 隞餃𦛚<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
|
||||
| fulltext_screening_tasks 潃?| project_id | B-tree | <EFBFBD>冽<EFBFBD>隞餃𦛚<EFBFBD>亥砭 v3.0 |
|
||||
| fulltext_screening_tasks 潃?| status | B-tree | 隞餃𦛚<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?v3.0 |
|
||||
| fulltext_screening_tasks 潃?| created_at | B-tree | <EFBFBD>園𡢿<EFBFBD>鍦<EFBFBD> v3.0 |
|
||||
| fulltext_screening_results 潃?| task_id | B-tree | 隞餃𦛚蝏𤘪<EFBFBD><EFBFBD>亥砭 v3.0 |
|
||||
| fulltext_screening_results 潃?| project_id | B-tree | 憿寧𤌍蝏𤘪<EFBFBD><EFBFBD>亥砭 v3.0 |
|
||||
| fulltext_screening_results 潃?| literature_id | B-tree | <EFBFBD><EFBFBD>讃蝏𤘪<EFBFBD><EFBFBD>亥砭 v3.0 |
|
||||
| fulltext_screening_results 潃?| is_conflict | B-tree | <EFBFBD>脩<EFBFBD>蝑偦<EFBFBD>?v3.0 |
|
||||
| fulltext_screening_results 潃?| final_decision | B-tree | <EFBFBD>喟<EFBFBD>蝑偦<EFBFBD>?v3.0 |
|
||||
| fulltext_screening_results 潃?| review_priority | B-tree | 憭齿瓲隡睃<EFBFBD>蝥?v3.0 |
|
||||
| fulltext_screening_results 潃?| (project_id, literature_id) | Unique | <EFBFBD>臭<EFBFBD><EFBFBD>抒漲<EFBFBD>?v3.0 |
|
||||
|
||||
**蝝W<E89D9D><EFBCB7>餅㺭**: 25銝迎<E98A9D>v3.0<EFBFBD>啣<EFBFBD>13銝迎<EFBFBD>
|
||||
**<2A>臭<EFBFBD>蝥行<E89DA5>**: 4銝迎<E98A9D>v3.0<EFBFBD>啣<EFBFBD>1銝迎<EFBFBD>
|
||||
|
||||
**v3.0索引优化说明**:
|
||||
- ✅ `literatures.stage`: 快速查询特定阶段的文献(如"pdf_acquired"待全文复筛)
|
||||
- ✅ `fulltext_screening_results.review_priority`: 优化人工复核队列排序
|
||||
- ✅ `fulltext_screening_tasks.created_at`: 任务历史查询优化
|
||||
**v3.0蝝W<EFBFBD>隡睃<EFBFBD>霂湔<EFBFBD>**嚗?- <20>?`literatures.stage`: 敹恍<E695B9><E6818D>䰻霂Y鸌摰𡁻𧫴畾萇<E795BE><E89087><EFBFBD>讃嚗<E8AE83><E59A97>"pdf_acquired"敺<><E695BA><EFBFBD><EFBFBD><EFBFBD>蝑𨥈<E89D91>
|
||||
- <20>?`fulltext_screening_results.review_priority`: 隡睃<E99AA1>鈭箏極憭齿瓲<E9BDBF>笔<EFBFBD><E7AC94>鍦<EFBFBD>
|
||||
- <20>?`fulltext_screening_tasks.created_at`: 隞餃𦛚<E9A483><F0A69B9A>蟮<EFBFBD>亥砭隡睃<E99AA1>
|
||||
|
||||
---
|
||||
|
||||
@@ -890,15 +828,15 @@ literature_screening_projects (1) ──< (N) screening_tasks
|
||||
### PICO<43><4F><EFBFBD> (picoCriteria JSON)
|
||||
```json
|
||||
{
|
||||
"population": "研究人群,如:2型糖尿病成人患者",
|
||||
"intervention": "干预措施,如:SGLT2抑制剂",
|
||||
"comparison": "对照,如:安慰剂或常规疗法",
|
||||
"population": "<22>𠉛弦鈭箇黎嚗<E9BB8E><E59A97>嚗?<3F>讠<EFBFBD>撠輻<E692A0><E8BCBB>𣂷犖<F0A382B7><E78A96><EFBFBD>?,
|
||||
"intervention": "撟脤<E6929F><E884A4>芣鴌嚗<E9B48C><E59A97>嚗锭GLT2<54>穃<EFBFBD><E7A983>?,
|
||||
"comparison": "撖寧<E69296>嚗<EFBFBD><E59A97>嚗𡁜<E59A97><F0A1819C>啣<EFBFBD><E595A3>硋虜閫<E8999C><E996AB>瘜?,
|
||||
"outcome": "蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD>嚗<EFBFBD><E59A97>嚗𡁜<E59A97>銵<EFBFBD>蝞∠<E89D9E>撅<EFBFBD>",
|
||||
"studyDesign": "研究设计,如:随机对照试验 (RCT)"
|
||||
"studyDesign": "<22>𠉛弦霈曇恣嚗<E681A3><E59A97>嚗𡁻<E59A97><F0A181BB>箏笆<E7AE8F>扯<EFBFBD>撉?(RCT)"
|
||||
}
|
||||
```
|
||||
|
||||
### 筛选配置 (screeningConfig JSON)
|
||||
### 蝑偦<EFBFBD>厰<EFBFBD>蝵?(screeningConfig JSON)
|
||||
```json
|
||||
{
|
||||
"models": ["deepseek-chat", "qwen-max"],
|
||||
@@ -925,97 +863,62 @@ literature_screening_projects (1) ──< (N) screening_tasks
|
||||
## <20><> <20>唳旿摰匧<E691B0>
|
||||
|
||||
### Schema<6D>𠉛氖
|
||||
- 使用 `asl_schema` 与其他模块数据隔离
|
||||
- 用户表在 `platform_schema`,统一管理
|
||||
- 雿輻鍂 `asl_schema` 銝𤾸<E98A9D>隞𡝗芋<F0A19D97>埈㺭<E59F88>桅<EFBFBD>蝳?- <20>冽<EFBFBD>銵典銁 `platform_schema`嚗𣬚<E59A97>銝<EFBFBD>蝞∠<E89D9E>
|
||||
|
||||
### 蝥扯<E89DA5><E689AF>𣳇膄
|
||||
- 删除用户 → 自动删除所有筛选项目及关联数据
|
||||
- 删除项目 → 自动删除文献、结果、任务
|
||||
- 删除文献 → 自动删除筛选结果
|
||||
|
||||
### 唯一性约束
|
||||
- 同一项目中PMID唯一(允许无PMID)
|
||||
- 同一项目中一篇文献只有一个筛选结果
|
||||
|
||||
- <20>𣳇膄<F0A3B387>冽<EFBFBD> <20>?<3F>芸𢆡<E88AB8>𣳇膄<F0A3B387><E88684><EFBFBD>厩<EFBFBD><E58EA9>厰★<E58EB0>桀<EFBFBD><E6A180>唾<EFBFBD><E594BE>唳旿
|
||||
- <20>𣳇膄憿寧𤌍 <20>?<3F>芸𢆡<E88AB8>𣳇膄<F0A3B387><E88684>讃<EFBFBD><E8AE83><EFBFBD><EFBFBD>栶<EFBFBD><E6A0B6>遙<EFBFBD>?- <20>𣳇膄<F0A3B387><E88684>讃 <20>?<3F>芸𢆡<E88AB8>𣳇膄蝑偦<E89D91>厩<EFBFBD><E58EA9>?
|
||||
### <20>臭<EFBFBD><E887AD>抒漲<E68A92>?- <20>䔶<EFBFBD>憿寧𤌍銝致MID<49>臭<EFBFBD>嚗<EFBFBD><E59A97>霈豢<E99C88>PMID嚗?- <20>䔶<EFBFBD>憿寧𤌍銝凋<E98A9D>蝭<EFBFBD><E89DAD><EFBFBD>桀蘨<E6A180>劐<EFBFBD>銝芰<E98A9D><E88AB0>厩<EFBFBD><E58EA9>?
|
||||
---
|
||||
|
||||
## 📈 数据量预估
|
||||
|
||||
| 项目规模 | 文献数 | 筛选结果 | 存储空间 |
|
||||
## <EFBFBD><EFBFBD> <20>唳旿<E594B3>誯<EFBFBD>隡?
|
||||
| 憿寧𤌍閫<F0A48C8D>芋 | <20><>讃<EFBFBD>?| 蝑偦<E89D91>厩<EFBFBD><E58EA9>?| 摮睃<E691AE>蝛粹𡢿 |
|
||||
|---------|--------|---------|----------|
|
||||
| 撠誩<E692A0> | 100-500 | 100-500 | < 10 MB |
|
||||
| 銝剖<E98A9D> | 500-2000 | 500-2000 | 10-50 MB |
|
||||
| 憭批<E686AD> | 2000-5000 | 2000-5000 | 50-200 MB |
|
||||
| 超大型 | 5000+ | 5000+ | 200 MB+ |
|
||||
| 頞<EFBFBD>之<EFBFBD>?| 5000+ | 5000+ | 200 MB+ |
|
||||
|
||||
**<2A>閙辺霈啣<E99C88>憭批<E686AD>隡啁<E99AA1>**:
|
||||
- <20><>讃<EFBFBD>∠𤌍嚗鰺2-5 KB
|
||||
- 筛选结果:~5-10 KB(含双模型判断和证据)
|
||||
|
||||
- 蝑偦<E89D91>厩<EFBFBD><E58EA9>頣<EFBFBD>~5-10 KB嚗<42>鉄<EFBFBD>峕芋<E5B395>见ế<E8A781>剖<EFBFBD>霂<EFBFBD>旿嚗?
|
||||
---
|
||||
|
||||
## ⏳ 后续规划
|
||||
|
||||
### Phase 2 (全文复筛) ✅ v3.0已完成
|
||||
- [x] 扩展 `literatures` 表(生命周期管理)
|
||||
- [x] 添加 `fulltext_screening_tasks` 表
|
||||
- [x] 添加 `fulltext_screening_results` 表(12字段)
|
||||
|
||||
### Phase 3 (数据提取) 待开发
|
||||
- [ ] 复用 `fulltext_screening_tasks` 表(切换模式)
|
||||
- [ ] 复用 `fulltext_screening_results` 表(存储提取数据)
|
||||
- [ ] 或新增 `data_extraction_results` 表(如需独立)
|
||||
|
||||
### Phase 4 (质量评估) 待规划
|
||||
- [ ] 质量评估结果表
|
||||
- [ ] 偏倚风险评估表
|
||||
- [ ] GRADE证据质量表
|
||||
## <EFBFBD>?<3F>𡒊賒閫<E8B392><E996AB>
|
||||
|
||||
### Phase 2 (<28>冽<EFBFBD>憭滨<E686AD>) <20>?v3.0撌脣<EFBFBD><EFBFBD>?- [x] <20>拙<EFBFBD> `literatures` 銵剁<E98AB5><E58981>笔𦶢<E7AC94>冽<EFBFBD>蝞∠<E89D9E>嚗?- [x] 瘛餃<E7989B> `fulltext_screening_tasks` 銵?- [x] 瘛餃<E7989B> `fulltext_screening_results` 銵剁<E98AB5>12摮埈挾嚗?
|
||||
### Phase 3 (<28>唳旿<E594B3>𣂼<EFBFBD>) 敺<><E695BA><EFBFBD>?- [ ] 憭滨鍂 `fulltext_screening_tasks` 銵剁<E98AB5><E58981><EFBFBD>揢璅∪<E79285>嚗?- [ ] 憭滨鍂 `fulltext_screening_results` 銵剁<E98AB5>摮睃<E691AE><E79D83>𣂼<EFBFBD><F0A382BC>唳旿嚗?- [ ] <20>𡝗鰵憓?`data_extraction_results` 銵剁<E98AB5>憒<EFBFBD><E68692><EFBFBD>祉<EFBFBD>嚗?
|
||||
### Phase 4 (韐券<E99F90>霂<EFBFBD>摯) 敺<><E695BA><EFBFBD>?- [ ] 韐券<E99F90>霂<EFBFBD>摯蝏𤘪<E89D8F>銵?- [ ] <20>誩<EFBFBD>𡁻<EFBFBD><F0A181BB>抵<EFBFBD>隡啗”
|
||||
- [ ] GRADE霂<45>旿韐券<E99F90>銵?
|
||||
---
|
||||
|
||||
## <20><> v3.0 霈曇恣<E69B87>喟<EFBFBD>霈啣<E99C88>
|
||||
|
||||
### 决策1: 全文内容存储引用而非直接存储 ✅
|
||||
|
||||
### <EFBFBD>喟<EFBFBD>1: <20>冽<EFBFBD><E586BD><EFBFBD>捆摮睃<E691AE>撘閧鍂<E996A7>屸<EFBFBD><E5B1B8>湔𦻖摮睃<E691AE> <20>?
|
||||
**<2A>桅<EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD>摰寞糓<E5AF9E>血<EFBFBD><E8A180>典銁<E585B8>唳旿摨橒<E691A8>
|
||||
|
||||
**方案对比**:
|
||||
| 方案 | 优点 | 缺点 |
|
||||
**<EFBFBD>寞<EFBFBD>撖寞<EFBFBD>**嚗?| <20>寞<EFBFBD> | 隡条<E99AA1> | 蝻箇<E89DBB> |
|
||||
|------|------|------|
|
||||
| 存TEXT | LLM调用快 | 违背云原生规范,数据库臃肿 |
|
||||
| 存引用 | 符合规范,轻量 | LLM调用增加100-200ms |
|
||||
|
||||
**决策**:✅ 采用方案2(存引用)
|
||||
- 符合云原生存储与计算分离原则
|
||||
- 支持超大文献(>1MB)
|
||||
- RDS存储成本是OSS的5-10倍
|
||||
|
||||
### 决策2: 12字段使用JSON存储 ✅
|
||||
|
||||
**问题**:12字段是拆分为列还是JSON存储?
|
||||
| 摮姯EXT | LLM靚<EFBFBD>鍂敹?| 餈肽<E9A488>鈭穃<E988AD><E7A983>蠘<EFBFBD><E8A098><EFBFBD><EFBFBD><EFBFBD>唳旿摨栞<E691A8><E6A09E>?|
|
||||
| 摮睃<EFBFBD><EFBFBD>?| 蝚血<E89D9A>閫<EFBFBD><E996AB>嚗諹蝠<E8ABB9>?| LLM靚<4D>鍂憓𧼮<E68693>100-200ms |
|
||||
|
||||
**<2A>喟<EFBFBD>**嚗尠<E59A97> <20><>鍂<EFBFBD>寞<EFBFBD>2嚗<32><E59A97>撘閧鍂嚗?- 蝚血<E89D9A>鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>其<EFBFBD>霈∠<E99C88><E288A0><EFBFBD>氖<EFBFBD>笔<EFBFBD>
|
||||
- <20>舀<EFBFBD>頞<EFBFBD>之<EFBFBD><E4B98B>讃嚗?1MB嚗?- RDS摮睃<E691AE><E79D83>鞉𧋦<E99E89>烙SS<53>?-10<31>?
|
||||
### <20>喟<EFBFBD>2: 12摮埈挾雿輻鍂JSON摮睃<E691AE> <20>?
|
||||
**<2A>桅<EFBFBD>**嚗?2摮埈挾<E59F88>舀<EFBFBD><E88880><EFBFBD>蛹<EFBFBD>𡑒<EFBFBD><F0A19192>浥SON摮睃<E691AE>嚗?
|
||||
**<2A>喟<EFBFBD>**嚗尠<E59A97> 雿輻鍂PostgreSQL JSONB
|
||||
- 不需要单独查询某个字段内部
|
||||
- 字段结构复杂(6个子字段)
|
||||
- JSONB性能优秀且支持GIN索引
|
||||
- 銝漤<E98A9D>閬<EFBFBD><E996AC><EFBFBD>祆䰻霂X<E99C82>銝芸<E98A9D>畾萄<E795BE><E89084>?- 摮埈挾蝏𤘪<E89D8F>憭齿<E686AD>嚗?銝芸<E98A9D>摮埈挾嚗?- JSONB<4E>扯<EFBFBD>隡条<E99AA1>銝娍𣈲<E5A88D><F0A388B2>IN蝝W<E89D9D>
|
||||
|
||||
### 决策3: 独立全文复筛结果表 ✅
|
||||
|
||||
**问题**:是否复用 `screening_results` 表?
|
||||
|
||||
**决策**:✅ 新增独立表 `fulltext_screening_results`
|
||||
- 数据结构完全不同(PICOS vs 12字段)
|
||||
- 避免字段冗余和逻辑耦合
|
||||
- 便于独立维护和优化
|
||||
### <EFBFBD>喟<EFBFBD>3: <20>祉<EFBFBD><E7A589>冽<EFBFBD>憭滨<E686AD>蝏𤘪<E89D8F>銵?<3F>?
|
||||
**<2A>桅<EFBFBD>**嚗𡁏糓<F0A1818F>血<EFBFBD><E8A180>?`screening_results` 銵剁<E98AB5>
|
||||
|
||||
**<2A>喟<EFBFBD>**嚗尠<E59A97> <20>啣<EFBFBD><E595A3>祉<EFBFBD>銵?`fulltext_screening_results`
|
||||
- <20>唳旿蝏𤘪<E89D8F>摰<EFBFBD><E691B0>銝滚<E98A9D>嚗㇊ICOS vs 12摮埈挾嚗?- <20>踹<EFBFBD>摮埈挾<E59F88>𦯀<EFBFBD><F0A6AF80>屸<EFBFBD>餉<EFBFBD><E9A489>血<EFBFBD>
|
||||
- 靘蹂<E99D98><E8B982>祉<EFBFBD>蝏湔擪<E6B994>䔶<EFBFBD><E494B6>?
|
||||
---
|
||||
|
||||
**文档版本:** v3.0
|
||||
**最后更新:** 2025-11-22(Day 4:全文复筛数据库设计)
|
||||
**维护者:** AI智能文献开发团队
|
||||
|
||||
**版本历史**:
|
||||
- v3.0 (2025-11-22): 全文复筛数据库设计,新增3个表和相关字段
|
||||
- v2.2 (2025-11-21): Week 4统计功能完成
|
||||
- v2.0 (2025-11-18): 标题初筛数据库设计
|
||||
- v1.0 (2025-10-29): 初始版本
|
||||
**<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦嚗?* v3.0
|
||||
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD>** 2025-11-22嚗㇄ay 4嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑𥟇㺭<EFBFBD>桀<EFBFBD>霈曇恣嚗?
|
||||
**蝏湔擪<EFBFBD><EFBFBD><EFBFBD>** AI<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃撘<EFBFBD><EFBFBD>穃𣪧<EFBFBD>?
|
||||
**<EFBFBD><EFBFBD>𧋦<EFBFBD><EFBFBD>蟮**嚗?- v3.0 (2025-11-22): <20>冽<EFBFBD>憭滨<E686AD><E6BBA8>唳旿摨栞挽霈∴<E99C88><E288B4>啣<EFBFBD>3銝芾”<E88ABE>𣬚㮾<F0A3AC9A>喳<EFBFBD>畾?- v2.2 (2025-11-21): Week 4蝏蠘恣<E8A098>蠘<EFBFBD>摰峕<E691B0>
|
||||
- v2.0 (2025-11-18): <20><><EFBFBD><EFBFBD>萘<EFBFBD><E89098>唳旿摨栞挽霈?- v1.0 (2025-10-29): <20>嘥<EFBFBD><E598A5><EFBFBD>𧋦
|
||||
|
||||
Reference in New Issue
Block a user