feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,4 +1,4 @@
# <EFBFBD><EFBFBD>Prompt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 撘<><E69298>𤏸恣<F0A48FB8>?
# 智能Prompt生成模块 - 开发计划
**版本**: v1.0
**日期**: 2025-11-18
@@ -8,11 +8,11 @@
## 核心目标
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**: <EFBFBD>膄AI銝𦒘犖蝐餃笆颲寧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>榆撘?
**解决问题**: 消除AI与人类对边界情况的理解差异
**核心流程**:
```
<EFBFBD><EFBFBD>颲枏<EFBFBD>PICOS <20>?AI<41><49><EFBFBD><E59CBE><EFBFBD> <20>?<3F><><EFBFBD>Prompt <20>?<3F><EFBFBD>靽格㺿 <20>?撘<>憪讠<E686AA><E8AEA0>?
用户输入PICOS → AI理解分析 → 生成Prompt → 用户修改 → 开始筛选
```
---
@@ -21,7 +21,7 @@
### 功能范围
#### 1. <EFBFBD><EFBFBD>颲枏<EFBFBD> <20>?
#### 1. 用户输入 ✅
**前端表单**:
```typescript
@@ -42,7 +42,7 @@
---
#### 2. AI<EFBFBD><EFBFBD>圾銝𤾸<EFBFBD><EFBFBD>?<3F><>
#### 2. AI理解与分析 🆕
**输入**: 用户的PICOS + 纳排标准
@@ -57,7 +57,7 @@
id: number;
question: string; // "如果研究人群是欧美但RCT质量高"
aiSuggestion: 'include' | 'exclude' | 'uncertain';
reason: string; // AI<EFBFBD><EFBFBD>遣霈桃<EFBFBD><EFBFBD>?
reason: string; // AI的建议理由
}
]
}
@@ -76,11 +76,11 @@ POST /api/v1/asl/analyze-picos
#### 3. 用户确认界面 🆕
**显示**:
- <EFBFBD>?敹<>◆蝥喳<E89DA5><EFBFBD><EFBFBD><EFBFBD>?<3F>𡝗<EFBFBD>嚗?
- <EFBFBD>?敹<><EFBFBD>㘾膄嚗<E88684><EFBFBD><EFBFBD>?<3F>𡝗<EFBFBD>嚗?
- <EFBFBD><EFBFBD> 颲寧<E9A2B2><E5AFA7><EFBFBD><EFBFBD><EFBFBD><E59A97>𣂷葵蝖株恕嚗𡁶熙<F0A181B6>?<3F>㘾膄/銝滨摰𡄯<E691B0>
- ✅ 必须纳入(可勾选/取消)
- ❌ 必须排除(可勾选/取消)
- 🤔 边界情况(逐个确认:纳入/排除/不确定)
**摰䂿緵**: Modal撖寡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝芸躹<EFBFBD>?
**实现**: Modal对话框,分三个区域
---
@@ -90,14 +90,14 @@ POST /api/v1/asl/analyze-picos
**输出**: 完整的筛选Prompt
**<EFBFBD>喲睸**: <EFBFBD><EFBFBD>霈斤<EFBFBD>颲寧<EFBFBD><EFBFBD><EFBFBD>瘜典<EFBFBD><EFBFBD>rompt銝?
**关键**: 将用户确认的边界规则注入到Prompt
```
## 特殊规则(基于您的确认)
1. 地域要求优先亚洲人群但欧美高质量RCT也可纳入
2. <EFBFBD>𠉛弦蝐餃<EFBFBD>嚗𡁏<EFBFBD><EFBFBD>斤遞餈堆<EFBFBD>雿?020撟游<E6929F>Meta<74><61><EFBFBD><EFBFBD>舐熙<E88890>?
3. 撖寧<EFBFBD>蝐餃<EFBFBD>嚗𡁜<EFBFBD><EFBFBD><EFBFBD>撖寧<EFBFBD>嚗峕<EFBFBD><EFBFBD><EFBFBD>蝘齿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>舀𦻖<EFBFBD>?
2. 研究类型排除综述但2020年后Meta分析可纳入
3. 对照类型:安慰剂对照,或另一种标准药物也可接受
...
```
@@ -108,54 +108,54 @@ POST /api/v1/asl/generate-prompt
---
#### 5. Prompt蝻𤥁<EFBFBD><EFBFBD>?<3F><>
#### 5. Prompt编辑器 🆕
**功能**:
- 显示生成的Prompt
- 支持用户编辑
- 靽嘥<EFBFBD>撟嗡蝙<EFBFBD>?
- 保存并使用
**实现**: 简单的Textarea + 保存按钮
---
#### 6. 蝑偦<EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD>撘?潃?**<2A><EFBFBD>**
#### 6. 筛选结果增强 ⭐ **重要**
**敶枏<EFBFBD><EFBFBD><EFBFBD>**: <EFBFBD>芣遬蝷箸<EFBFBD><EFBFBD><EFBFBD>蝑吔<EFBFBD>include/exclude/pending嚗?
**当前问题**: 只显示最终决策(include/exclude/pending
**<EFBFBD><EFBFBD>**: <EFBFBD>曄內**銝支葵璅<E79285><E288AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B8A1>?*
**改进**: 显示**两个模型的完整理由**
```typescript
{
literatureId: string;
finalDecision: 'include' | 'exclude' | 'pending';
// 潃?<3F><EFBFBD>嚗帋舅銝芣芋<E88AA3><EFBFBD>霂衣<E99C82>蝏𤘪<E89D8F>
// ⭐ 新增:两个模型的详细结果
model1: {
modelName: 'DeepSeek-V3';
conclusion: 'exclude';
confidence: 0.92;
judgment: { P: 'match', I: 'match', C: 'mismatch', S: 'match' };
reason: '<EFBFBD><EFBFBD>P<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝏游漲<EFBFBD><EFBFBD>嚗䔶<EFBFBD>撖寧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝘滩晓<EFBFBD><EFBFBD><EFBFBD>摰㗇<EFBFBD><EFBFBD>?..' // 潃?<3F>喲睸
reason: '虽然P、I、S维度匹配但对照组为另一种药物而非安慰剂...' // ⭐ 关键
},
model2: {
modelName: 'Qwen-Max';
conclusion: 'include';
confidence: 0.85;
judgment: { P: 'match', I: 'match', C: 'partial', S: 'match' };
reason: '<EFBFBD>𠉛弦鈭箇黎<EFBFBD><EFBFBD>僕憸<EFBFBD><EFBFBD>賢龪<EFBFBD><EFBFBD>撖寧<EFBFBD><EFBFBD><EFBFBD>𧼮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖寞<EFBFBD><EFBFBD><EFBFBD>...' // 潃?<3F>喲睸
reason: '研究人群和干预措施匹配,对照组虽非安慰剂但有对比意义...' // ⭐ 关键
},
hasConflict: true; // 銝支葵璅<EFBFBD><EFBFBD>斗鱏銝滢<EFBFBD><EFBFBD>?
hasConflict: true; // 两个模型判断不一致
conflictFields: ['conclusion', 'C'];
}
```
**前端显示**:
```jsx
<Card title="蝑偦<EFBFBD><EFBFBD><EFBFBD>?>
<Card title="筛选结果">
<Alert type={finalDecision === 'pending' ? 'warning' : 'success'}>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑? {finalDecision}
最终决策: {finalDecision}
</Alert>
<Divider />
@@ -166,10 +166,10 @@ POST /api/v1/asl/generate-prompt
<Tag color={model1.conclusion === 'include' ? 'green' : 'red'}>
{model1.conclusion}
</Tag>
<Statistic title="蝵桐縑摨? value={model1.confidence} />
<Statistic title="置信度" value={model1.confidence} />
<Divider />
<h4>判断理由:</h4>
<p>{model1.reason}</p> {/* 潃?<3F>曄內<E69B84><E585A7>眏 */}
<p>{model1.reason}</p> {/* ⭐ 显示理由 */}
<Collapse>
<Panel header="PICO维度详情">
P: {model1.judgment.P}<br/>
@@ -194,37 +194,37 @@ POST /api/v1/asl/generate-prompt
</Alert>
)}
{/* 潃?鈭箏極憭齿瓲<E9BDBF>厰僼 */}
{/* ⭐ 人工复核按钮 */}
<Button type="primary" onClick={handleManualReview}>
鈭箏極憭齿瓲甇斗<EFBFBD><EFBFBD>?
人工复核此文献
</Button>
</Card>
```
---
### MVP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### MVP开发清单
**Week 1: 后端**
| 隞餃𦛚 | 隡唳𧒄 | 隡睃<E99AA1>蝥?|
| 任务 | 估时 | 优先级 |
|------|------|--------|
| API: <EFBFBD><EFBFBD><EFBFBD>PICOS | 2憭?| P0 |
| API: <EFBFBD><EFBFBD><EFBFBD>Prompt | 1憭?| P0 |
| 憓𧼮撩蝑偦<EFBFBD><EFBFBD><EFBFBD>𦦵<EFBFBD><EFBFBD>?| 0.5憭?| P0 |
| 瘚贝<EFBFBD> | 0.5憭?| P0 |
| API: 分析PICOS | 2| P0 |
| API: 生成Prompt | 1| P0 |
| 增强筛选结果结构 | 0.5| P0 |
| 测试 | 0.5| P0 |
**Week 2: 前端**
| 隞餃𦛚 | 隡唳𧒄 | 隡睃<E99AA1>蝥?|
| 任务 | 估时 | 优先级 |
|------|------|--------|
| PICOS颲枏<EFBFBD>銵典<EFBFBD> | 0.5憭?| P0 |
| <EFBFBD><EFBFBD>蝖株恕<EFBFBD>屸𢒰 | 1.5憭?| P0 |
| Prompt蝻𤥁<EFBFBD><EFBFBD>?| 0.5憭?| P0 |
| 蝏𤘪<EFBFBD>撅閧內憓𧼮撩 | 1憭?| P0 |
| 瘚贝<EFBFBD>銝舘<EFBFBD>隡?| 0.5憭?| P0 |
| PICOS输入表单 | 0.5| P0 |
| 用户确认界面 | 1.5| P0 |
| Prompt编辑器 | 0.5| P0 |
| 结果展示增强 | 1| P0 |
| 测试与调优 | 0.5| P0 |
**<EFBFBD>餉恣**: 2<EFBFBD><EFBFBD>10銝芸極雿𨀣𠯫嚗?
**总计**: 210个工作日
---
@@ -232,16 +232,16 @@ POST /api/v1/asl/generate-prompt
### 功能1: Few-shot自动学习 🔮
**閫血<EFBFBD><EFBFBD>箸艶**: <EFBFBD><EFBFBD>蝥䭾迤AI<EFBFBD>斗鱏<EFBFBD>?
**触发场景**: 用户纠正AI判断后
**流程**:
```
1. AI判断: Exclude
2. 用户纠正: 应该是Include
3. <EFBFBD><EFBFBD>霂湔<EFBFBD><EFBFBD><EFBFBD>眏: "<22><EFBFBD><E8B39C>舀洹蝢𦒘犖蝢歹<E89DA2><EFBFBD>CT韐券<E99F90>擃?
<EFBFBD>?
3. 用户说明理由: "虽然是欧美人群但RCT质量高"
4. 系统记录案例
<EFBFBD>?
5. 下次筛选时将此案例作为Few-shot示例加入Prompt
```
@@ -255,7 +255,7 @@ POST /api/v1/asl/generate-prompt
},
aiDecision: 'exclude';
userDecision: 'include';
userReason: '<EFBFBD><EFBFBD><EFBFBD>𦒘<EFBFBD><EFBFBD>CT韐券<EFBFBD>?;
userReason: '虽然是欧美人群但RCT质量高';
picoCriteria: {...}; // 当时的PICOS
createdAt: Date;
}
@@ -263,7 +263,7 @@ POST /api/v1/asl/generate-prompt
**Prompt增强**:
```
## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>靘页<EFBFBD>Few-shot蝷箔<EFBFBD>嚗?
## 参考案例(Few-shot示例)
以下是您之前纠正的案例,请参考:
@@ -271,14 +271,14 @@ POST /api/v1/asl/generate-prompt
标题: TICA-CLOP STUDY...
AI判断: Exclude因为北非人群
您的决策: Include
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>眏: <20><EFBFBD><E8B39C><EFBFBD><E887AC>硺犖蝢歹<E89DA2><EFBFBD>CT韐券<E99F90>擃矋<E69383><E79F8B><EFBFBD><E5AF9E><EFBFBD><E58CA7><EFBFBD><EFBFBD>?
<EFBFBD>?<3F>舐內: <20><EFBFBD><EFBFBD><E996AC><EFBFBD>臭誑<E887AD>菜暑嚗<E69A91><E59A97><EFBFBD>𦦵<EFBFBD>蝛嗉捶<E59789><EFBFBD>
您的理由: 虽然是北非人群但RCT质量高方法有参考价值
→ 启示: 地域要求可以灵活,如果研究质量高
案例2:
...
```
**摰䂿緵憭齿<EFBFBD>摨?*: 銝剔<E98A9D><EFBFBD><E59A97><EFBFBD><E996AC>靘见<E99D98>蝞∠<E89D9E>嚗?
**实现复杂度**: 中等(需要案例库管理)
---
@@ -288,21 +288,21 @@ AI判断: Exclude因为北非人群
**流程**:
```
1. <EFBFBD><EFBFBD>銝𠹺<EFBFBD>10蝭<EFBFBD><EFBFBD>霂閙<EFBFBD><EFBFBD><EFBFBD>5蝭<EFBFBD><EFBFBD>?+ 5蝭<35><E89DAD><EFBFBD><EFBFBD>
<EFBFBD>?
1. 用户上传10篇测试文献5篇纳入 + 5篇排除
2. 用户逐篇标注: Include/Exclude + 理由
<EFBFBD>?
3. AI摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ế<EFBFBD>剜芋撘?
<EFBFBD>?
3. AI学习用户的判断模式
4. 生成定制化Prompt
<EFBFBD>?
5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑偦<EFBFBD>?
5. 用于正式筛选
```
**界面**:
```jsx
<TestMode>
<Upload>銝𠹺<EFBFBD>10<EFBFBD><EFBFBD>霂閙<EFBFBD><EFBFBD><EFBFBD>Excel/JSON?/Upload>
<Upload>上传10篇测试文献Excel/JSON</Upload>
<Table>
{testCases.map(lit => (
@@ -315,7 +315,7 @@ AI判断: Exclude因为北非人群
</Radio.Group>
</td>
<td>
<Input.TextArea placeholder="霂瑁秩<EFBFBD>𡒊<EFBFBD><EFBFBD>? />
<Input.TextArea placeholder="请说明理由" />
</td>
</Row>
))}
@@ -333,55 +333,55 @@ AI判断: Exclude因为北非人群
1. 地域灵活性:
- 案例1北非RCT→ 纳入
- <EFBFBD><EFBFBD>3嚗<EFBFBD>洹瘣脤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>㘾膄
<EFBFBD>?蝏栞捏: <20><EFBFBD><E88ABE>爹CT撠勗虾<E58B97><EFBFBD><E4BA99><EFBFBD>瘣脖犖蝢?
- 案例3欧洲队列→ 排除
→ 结论: 只要是RCT就可接受非亚洲人群
2. <EFBFBD>𠉛弦蝐餃<EFBFBD>嚗?
2. 研究类型:
- 案例2Meta分析→ 纳入
- <EFBFBD><EFBFBD>5嚗<EFBFBD><EFBFBD>蝏毺遞餈堆<EFBFBD><EFBFBD>?<3F>㘾膄
<EFBFBD>?蝏栞捏: Meta<EFBFBD><EFBFBD><EFBFBD><EFBFBD>舀𦻖<EFBFBD><EFBFBD>隡删<EFBFBD>蝏潸膩<EFBFBD>㘾膄
- 案例5传统综述→ 排除
→ 结论: Meta分析可接受,传统综述排除
3. <EFBFBD>園𡢿閬<EFBFBD><EFBFBD>嚗?
- <EFBFBD><EFBFBD>4嚗?019撟游<E6929F>銵剁<E98AB5><E58981>?<3F>㘾膄
<EFBFBD>?蝏栞捏: 銝交聢<E4BAA4><EFBFBD>2020撟游<E6929F><EFBFBD><E996AC>
3. 时间要求:
- 案例42019年发表→ 排除
→ 结论: 严格执行2020年后要求
```
**摰䂿緵憭齿<EFBFBD>摨?*: 擃矋<E69383><E79F8B><EFBFBD><EFBFBD>芋撘讛<E69298><E8AE9B><EFBFBD>
**实现复杂度**: 高(需要模式识别)
---
### <EFBFBD><EFBFBD>3: Prompt璅⊥踎摨?<3F><>
### 功能3: Prompt模板库 📚
**功能**:
- 靽嘥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rompt銝箸芋<EFBFBD>?
- 保存用户生成的Prompt为模板
- 下次可以直接复用
- <EFBFBD>臭誑<EFBFBD><EFBFBD>澈蝏坔𣪧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 可以分享给团队成员
**摰䂿緵憭齿<EFBFBD>摨?*: 雿?
**实现复杂度**: 低
---
### 2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### 2.0开发清单
| <EFBFBD><EFBFBD> | 隡唳𧒄 | 隡睃<E99AA1>蝥?| 靘肽<E99D98> |
| 功能 | 估时 | 优先级 | 依赖 |
|------|------|--------|------|
| Few-shot摮虫<EFBFBD> | 3憭?| P1 | MVP摰峕<EFBFBD> |
| 瘚贝<EFBFBD><EFBFBD> | 5憭?| P2 | MVP摰峕<EFBFBD> |
| Prompt璅⊥踎摨?| 2憭?| P1 | MVP摰峕<EFBFBD> |
| Few-shot学习 | 3| P1 | MVP完成 |
| 测试模式 | 5| P2 | MVP完成 |
| Prompt模板库 | 2| P1 | MVP完成 |
**<EFBFBD>餉恣**: 2<EFBFBD>?
**总计**: 2
---
## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
## 技术实现细节
### 1. AI分析PICOS的Prompt
```typescript
const analyzePrompt = `
雿䭾糓<EFBFBD>餃郎<EFBFBD><EFBFBD>讃蝑偦<EFBFBD><EFBFBD>摰嗚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靘𥕢<EFBFBD>PICOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣬚熙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂瑕<EFBFBD><EFBFBD>𣂼僎<EFBFBD><EFBFBD><EFBFBD>嚗?
你是医学文献筛选专家。用户提供了PICOS标准和纳排标准请分析并生成
<EFBFBD>鞟鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
【用户输入】
人群: ${population}
干预: ${intervention}
对照: ${comparison}
@@ -394,16 +394,16 @@ ${inclusionCriteria}
排除标准:
${exclusionCriteria}
<EFBFBD>𣂼<EFBFBD><EFBFBD>𣂷遙<EFBFBD><EFBFBD>?
【分析任务】
1. 提取必须纳入的核心要素3-5条
2. 提取必须排除的要素3-5条
3. 识别模糊的边界情况5-8个每个边界情况包括
- 具体问题描述
- 雿删<EFBFBD>撱箄悅嚗ǎnclude/exclude/uncertain嚗?
- 你的建议include/exclude/uncertain
- 建议理由
<EFBFBD><EFBFBD><EFBFBD>箸聢撘譌<EFBFBD>?
銝交聢JSON<EFBFBD><EFBFBD>嚗?
【输出格式】
严格JSON格式:
{
"mustInclude": ["要素1", "要素2", ...],
"mustExclude": ["要素1", "要素2", ...],
@@ -435,24 +435,24 @@ function generateCustomPrompt(
// 基础Prompt从标准模板开始
let prompt = getStandardPromptTemplate();
// 瘜典<EFBFBD><EFBFBD><EFBFBD>蝖株恕<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
// 注入用户确认的边界规则
const boundaryRulesSection = `
## 潃?<3F><EFBFBD>颲寧<E9A2B2><EFBFBD><E996AB><EFBFBD>抅鈭擧<E988AD><E693A7><EFBFBD>霈歹<E99C88>
## ⭐ 特殊边界规则(基于您的确认)
${userConfirmedRules.map((rule, index) => `
${index + 1}. ${rule.category}:
- 标准规则: ${rule.standardRule}
- <EFBFBD><EFBFBD>蝖株恕: ${rule.userDecision === 'include' ? '<EFBFBD>?<3F>臭誑蝥喳<E89DA5>' : '<EFBFBD>?敹<><EFBFBD>㘾膄'}
- 您的确认: ${rule.userDecision === 'include' ? '✅ 可以纳入' : '❌ 必须排除'}
- 具体情况: ${rule.situation}
`).join('\n')}
<EFBFBD>𩤃<EFBFBD> 霂瑚艇<E7919A><EFBFBD><EFBFBD>誑銝羓鸌畾𡃏<E795BE><F0A1838F><EFBFBD>餈嗘<E9A488><E59798>舐鍂<E88890><EFBFBD>蝖桃霈斤<E99C88><E696A4>斗鱏<E69697><E9B18F><EFBFBD><EFBFBD>?
⚠️ 请严格遵守以上特殊规则,这些是用户明确确认的判断标准。
`;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Prompt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?
// 将边界规则插入到Prompt的合适位置
prompt = prompt.replace(
'## 蝑偦<EFBFBD>劐遙<EFBFBD>?,
boundaryRulesSection + '\n\n## <EFBFBD><EFBFBD>?
'## 筛选任务',
boundaryRulesSection + '\n\n## 筛选任务'
);
return prompt;
@@ -461,7 +461,7 @@ ${index + 1}. ${rule.category}:
---
### 3. <EFBFBD>唳旿摨栞挽霈?
### 3. 数据库设计
**新表: prompt_configurations**
@@ -484,9 +484,9 @@ CREATE TABLE asl_schema.prompt_configurations (
-- 生成的Prompt
generated_prompt TEXT NOT NULL,
final_prompt TEXT NOT NULL, -- <EFBFBD><EFBFBD>蝻𤥁<EFBFBD><EFBFBD>𡒊<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
final_prompt TEXT NOT NULL, -- 用户编辑后的最终版本
-- <EFBFBD><EFBFBD><EFBFBD>?
-- 元数据
version VARCHAR(20) DEFAULT 'v1.0',
is_template BOOLEAN DEFAULT false,
template_name VARCHAR(100),
@@ -496,7 +496,7 @@ CREATE TABLE asl_schema.prompt_configurations (
);
```
**<EFBFBD>啗”: few_shot_cases**嚗?.0<EFBFBD>嗆挾嚗?
**新表: few_shot_cases**2.0阶段)
```sql
CREATE TABLE asl_schema.few_shot_cases (
@@ -517,7 +517,7 @@ CREATE TABLE asl_schema.few_shot_cases (
user_decision VARCHAR(20) NOT NULL,
user_reason TEXT NOT NULL,
-- PICOS銝𠹺<EFBFBD><EFBFBD>?
-- PICOS上下文
pico_criteria JSONB NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
@@ -584,7 +584,7 @@ Request:
{
"ambiguityId": 1,
"userDecision": "include", // include/exclude/uncertain
"userNote": "<EFBFBD><EFBFBD>銝齿糓鈭𡁏散鈭箇黎嚗䔶<EFBFBD>RCT韐券<EFBFBD>擃? // <EFBFBD><EFBFBD>?
"userNote": "虽然不是亚洲人群但RCT质量高" // 可选
}
]
}
@@ -610,7 +610,7 @@ Request:
"configId": "uuid",
"finalPrompt": "用户编辑后的Prompt...",
"saveAsTemplate": false,
"templateName": "" // <EFBFBD><EFBFBD>靽嘥<EFBFBD>銝箸芋<EFBFBD>?
"templateName": "" // 如果保存为模板
}
Response:
@@ -625,7 +625,7 @@ Response:
---
#### 4. 雿輻鍂<EFBFBD><EFBFBD>銋侨rompt蝑偦<EFBFBD>?
#### 4. 使用自定义Prompt筛选
```
POST /api/v1/asl/screen/literature
@@ -645,14 +645,14 @@ Response:
"literatureId": "uuid",
"finalDecision": "pending",
// 潃?<3F>喲睸嚗帋舅銝芣芋<E88AA3><EFBFBD>霂衣<E99C82>蝏𤘪<E89D8F>
// ⭐ 关键:两个模型的详细结果
"model1": {
"modelName": "DeepSeek-V3",
"conclusion": "exclude",
"confidence": 0.92,
"judgment": {...},
"evidence": {...},
"reason": "摰峕㟲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?.." // 潃?
"reason": "完整的排除理由..." //
},
"model2": {
"modelName": "Qwen-Max",
@@ -660,7 +660,7 @@ Response:
"confidence": 0.85,
"judgment": {...},
"evidence": {...},
"reason": "摰峕㟲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?.." // 潃?
"reason": "完整的纳入理由..." //
},
"hasConflict": true,
@@ -685,7 +685,7 @@ Request:
"aiDecision": "exclude",
"aiReason": "...",
"userDecision": "include",
"userReason": "<EFBFBD><EFBFBD><EFBFBD>舀洹蝢𦒘犖蝢歹<EFBFBD>雿?.."
"userReason": "虽然是欧美人群,但..."
}
Response:
@@ -726,28 +726,28 @@ Response:
### MVP测试
**瘚贝<EFBFBD><EFBFBD>唳旿**: <EFBFBD>雴葉<EFBFBD>𠉛弦嚗<EFBFBD><EFBFBD>?蝭<><E89DAD>
**测试数据**: 卒中研究已有5篇
**测试场景**:
1. **场景1: 正常流程**
- 颲枏<EFBFBD>PICOS <EFBFBD>?AI<41><49><EFBFBD> <20>?<3F><EFBFBD>蝖株恕 <20>?<3F><><EFBFBD>Prompt <EFBFBD>?蝑偦<E89D91>?
- 输入PICOS → AI分析 → 用户确认 → 生成Prompt → 筛选
- 验证:两个模型的理由是否完整显示
2. **场景2: 边界情况确认**
- <EFBFBD><EFBFBD>蝖株恕"甈抒<E79488>RCT<43>舐熙<E88890>? <20>?撉諹<E69289>Prompt銝剜糓<E5899C><EFBFBD><E8A180>急迨閫<E8BFA8><E996AB>
- 撉諹<EFBFBD>嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇𧒄<EFBFBD>臬炏<EFBFBD><EFBFBD>甇方<EFBFBD><EFBFBD>?
- 用户确认"欧美RCT可纳入" → 验证Prompt中是否包含此规则
- 验证:实际筛选时是否遵守此规则
3. **场景3: 用户编辑Prompt**
- <EFBFBD><EFBFBD>靽格㺿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rompt <20>?撉諹<E69289>靽格㺿<E6A0BC>臬炏<E887AC><E7828F><EFBFBD>
- 用户修改生成的Prompt → 验证修改是否生效
4. **场景4: 模型冲突**
- 撉諹<EFBFBD>嚗帋舅銝芣芋<EFBFBD>见ế<EFBFBD><EFBFBD><EFBFBD><EFBFBD>湔𧒄嚗𣬚<EFBFBD><EFBFBD>望糓<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝷?
- 验证:两个模型判断不一致时,理由是否清晰展示
**测试指标**:
- Prompt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? >90%
- <EFBFBD><EFBFBD>皛⊥<EFBFBD>摨? >80%
- <EFBFBD><EFBFBD>眏撅閧內摰峕㟲<EFBFBD>? 100%
- Prompt生成准确率: >90%
- 用户满意度: >80%
- 理由展示完整性: 100%
---
@@ -756,11 +756,11 @@ Response:
**测试场景**:
1. **Few-shot学习**
- <EFBFBD><EFBFBD>蝥䭾迤3銝芣<EFBFBD>靘?<3F>?撉諹<E69289>Prompt銝剜糓<E5899C><EFBFBD><E8A180><EFBFBD>鈭𥟇<E988AD>靘?
- 撉諹<EFBFBD>嚗𡁏鰵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇糓<EFBFBD>行㺿餈?
- 用户纠正3个案例 → 验证Prompt中是否包含这些案例
- 验证:新的筛选是否改进
2. **测试模式**
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>釣10蝭?<3F>?AI<41><49><EFBFBD><E79285> <20>?<3F><><EFBFBD>Prompt
- 用户标注10篇 → AI分析模式 → 生成Prompt
- 验证生成的Prompt是否符合用户偏好
---
@@ -771,44 +771,44 @@ Response:
| 指标 | 目标 |
|------|------|
| Prompt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| >90% |
| Prompt生成准确率 | >90% |
| 用户完成配置时间 | <5分钟 |
| <EFBFBD><EFBFBD>眏撅閧內摰峕㟲<EFBFBD>?| 100% |
| <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 100% |
| <EFBFBD><EFBFBD>皛⊥<EFBFBD>摨?| >80% |
| 理由展示完整性 | 100% |
| 模型冲突识别率 | 100% |
| 用户满意度 | >80% |
### 2.0阶段
| 指标 | 目标 |
|------|------|
| Few-shot<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| +15% |
| 瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨?| >85% |
| Prompt璅⊥踎憭滨鍂<EFBFBD>?| >60% |
| Few-shot改进准确率 | +15% |
| 测试模式匹配度 | >85% |
| Prompt模板复用率 | >60% |
---
## 憌𡡞埯銝𤾸<EFBFBD>撖?
## 风险与应对
### 风险1: LLM生成的边界问题质量不稳定
**应对**:
- 使用Few-shot Prompt
- 人工审核常见边界情况
- <EFBFBD>𣂷<EFBFBD>暺䁅恕颲寧<EFBFBD><EFBFBD><EFBFBD>摨?
- 提供默认边界问题库
### 风险2: 用户不愿意花时间确认
**应对**:
- <EFBFBD>芣遬蝷?銝芷<E98A9D>隡睃<E99AA1>蝥折䔮憸?
- 只显示5个高优先级问题
- 其他使用AI默认建议
- <EFBFBD>𣂷<EFBFBD>"敹恍<E695B9><E6818D>芋撘?嚗<>歲餈<E6ADB2>霈歹<E99C88>
- 提供"快速模式"(跳过确认)
### 憌𡡞埯3: 銝支葵璅<E79285><E288AA><EFBFBD>眏餈<E79C8F>鵭嚗屸𠗕隞亙笆瘥?
### 风险3: 两个模型理由过长,难以对比
**应对**:
- <EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>喲睸<EFBFBD><EFBFBD><EFBFBD>?00摮梹<E691AE>
- 提取理由关键句前100字
- 提供展开/收起按钮
- 擃䀝漁<EFBFBD><EFBFBD><EFBFBD>?
- 高亮冲突点
---
@@ -816,14 +816,14 @@ Response:
### MVP核心必做
1. <EFBFBD>?PICOS颲枏<EFBFBD>銵典<EFBFBD>
2. <EFBFBD>?AI<41><49><EFBFBD>銝舘器<E88898>屸䔮憸条<E686B8><E69DA1>?
3. <EFBFBD>?<3F><EFBFBD>蝖株恕<E6A0AA>屸𢒰
4. <EFBFBD>?<3F>芸𢆡<E88AB8><F0A286A1><EFBFBD>Prompt
5. <EFBFBD>?Prompt蝻𤥁<EFBFBD><EFBFBD>?
6. <EFBFBD>?**<2A>曄內銝支葵璅<E79285><E288AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B8A1>?* 潃?
1. PICOS输入表单
2. ✅ AI分析与边界问题生成
3. ✅ 用户确认界面
4. ✅ 自动生成Prompt
5. Prompt编辑器
6. **显示两个模型的完整理由**
**<EFBFBD><EFBFBD>烐𧒄<EFBFBD>?*: 2<EFBFBD>?
**开发时间**: 2
---
@@ -831,20 +831,20 @@ Response:
1. 🔮 Few-shot自动学习
2. 🧪 测试模式
3. <EFBFBD><EFBFBD> Prompt璅⊥踎摨?
3. 📚 Prompt模板库
**<EFBFBD><EFBFBD>烐𧒄<EFBFBD>?*: 2<EFBFBD>?
**开发时间**: 2
---
**<EFBFBD><EFBFBD>**: MVP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>訫虾<EFBFBD><EFBFBD>2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
**原则**: MVP先做到简单可用2.0再做智能化
**銝衤<EFBFBD>甇?*: 撘<>憪𨳒VP<56>嗆挾撘<E68CBE><E69298>?
**下一步**: 开始MVP阶段开发
---
**文档版本**: v1.0
**雿𡏭<EFBFBD>?*: AI Assistant
**作者**: AI Assistant
**审核**: [待用户确认]
**日期**: 2025-11-18