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,32 +1,35 @@
# **<EFBFBD>鞟內霂滨恣<EFBFBD><EFBFBD>頂蝏煺<EFBFBD><EFBFBD>煺漣<EFBFBD><EFBFBD><EFBFBD>啣漲憸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>航挽霈?*
# **提示词管理系统与生产环境灰度预览方案技术设计**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗?v1.1
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E695BA><EFBFBD>?
文档版本: v1.1
状态: 待开发
优先级: P1 (核心通用能力)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?<3F><EFBFBD>鈭?SAE (<28>煺漣<E785BA><EFBFBD>)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?Postgres-Only \+ Hot Reload \+ Preview Mode \+ RBAC
适用环境: 阿里云 SAE (生产环境)
核心架构: Postgres-Only \+ Hot Reload \+ Preview Mode \+ RBAC
## **1\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>艙嚗𡁏<EFBFBD><EFBFBD>煺漣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡏭<EFBFBD>蝥扳虜銋𣂼㦤<EFBFBD>?*
## **1\. 核心理念:把生产环境变成调试者的“超级游乐场”**
传统的开发流程是 开发环境 \-\> 测试环境 \-\> 生产环境。对于大模型应用LLM App这种流程存在致命缺陷**测试环境很难模拟真实的文献数据、复杂的上下文和 Token 消耗**。
本方案采用 **“生产环境灰度预览 (Production Preview Mode)”** 策略,并引入 **“调试者 (Debugger)”** 角色:
1. **代码与配置分离**Prompt 不再是硬编码的字符串,而是数据库中的动态配置。
2. **角色化调试 (RBAC)**:不局限于管理员,系统支持 **“调试者”**如临床专家、Prompt 工程师)角色。只要拥有 prompt:debug 权限,即可在生产环境开启调试模式。
3. **灰度路由**:系统根据当前操作者的身份(是否开启调试模式),动态决定加载 **“正式版 (Active)”** 还是 **“草稿版 (Draft)”** 的提示词。
4. **真实验证**:调试者可以直接使用生产环境的真实数据(如 ASL 的 20 篇文献)来验证新 Prompt 的效果,确认无误后一键发布。
隡删<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝔𧢲糓 撘<><E69298>𤑳㴓憓?\-\> 瘚贝<E7989A><E8B49D><EFBFBD> \-\> <20>煺漣<E785BA><EFBFBD><E887AC><EFBFBD>笆鈭𤾸之璅<E79285>摨𠉛鍂嚗𡿨LM App嚗㚁<E59A97>餈嗵<E9A488><EFBFBD><E7989A>摮睃銁<E79D83>游𦶢蝻粹萅嚗?*瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>𠗕璅⊥<E79285><E28AA5><EFBFBD><E7AC94><EFBFBD><EFBFBD><EFBFBD>格㺭<E6A0BC><EFBFBD><E69FB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD> Token 瘨<><E798A8>?*<2A>?
<EFBFBD>祆䲮獢<EFBFBD><EFBFBD><EFBFBD>?**<2A>𦦵<EFBFBD>鈭抒㴓憓<E3B493><E68693>摨阡<E691A8>閫?(Production Preview Mode)<29>?* 蝑𣇉裦嚗<E8A3A6>僎撘訫<E69298> **<EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD>?(Debugger)<29>?* 閫坿𠧧嚗?
1. **隞<><E99A9E>銝𡡞<E98A9D>蝵桀<E89DB5>蝳?*嚗䥪rompt 銝滚<E98A9D><E6BB9A>蝻𣇉<E89DBB><F0A38789><EFBFBD><EFBFBD>蝚虫葡嚗諹<E59A97>峕糓<E5B395>唳旿摨㮖葉<E3AE96><E89189>𢆡<EFBFBD><F0A286A1><EFBFBD>蝵柴<E89DB5>?
2. **閫坿𠧧<E59DBF>𤥁<EFBFBD>霂?(RBAC)**嚗帋<E59A97><EFBFBD><E69285>𣂷<EFBFBD>蝞∠<E89D9E><E288A0><EFBFBD>蝟餌<E89D9F><E9A48C><EFBFBD> **<EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD><EFBFBD><EFBFBD>?*嚗<><E59A97>銝游<E98A9D>銝枏振<E69E8F><E68CAF>rompt 撌亦<E6928C><EFBFBD><E692A3>閫坿𠧧<E59DBF><F0A0A7A7>蘨閬<E898A8>𥅾<EFBFBD>?prompt:debug <20><><EFBFBD><EFBFBD><EFBFBD>臬銁<E887AC>煺漣<E785BA><EFBFBD><EFBFBD><E69298><EFBFBD>霂閙芋撘譌<E69298>?
3. **<EFBFBD>啣漲頝舐眏**嚗𡁶頂蝏<E9A082><EFBFBD><EFBFBD><E6A180>齿<EFBFBD>雿𡏭<E99BBF><F0A18FAD><EFBFBD>頨思遢嚗<E981A2><EFBFBD><EFBFBD><E8A180><EFBFBD>霂閙芋撘𧶏<E69298><EFBFBD>𢆡<EFBFBD><F0A286A1><EFBFBD>摰𡁜<E691B0>頧?**<2A>𨀣迤撘讐<E69298> (Active)<29>?* 餈䀹糓 **<EFBFBD>𡏭<EFBFBD>蝔輻<EFBFBD> (Draft)<29>?* <20><><EFBFBD>蝷箄<E89DB7><E7AE84>?
4. **<EFBFBD><EFBFBD>撉諹<EFBFBD>**嚗朞<E59A97>霂閗<E99C82><E99697>虾隞亦凒<E4BAA6>乩蝙<E4B9A9><EFBFBD>鈭抒㴓憓<E3B493><E68693><EFBFBD><EFBFBD><E7AC94>唳旿嚗<E697BF><E59A97> ASL <20>?20 蝭<><E89DAD><EFBFBD><EFBFBD><E6AEB7>仿<EFBFBD><EFBFBD>鰵 Prompt <20><><EFBFBD><EFBFBD><EFBFBD>蝖株恕<E6A0AA>㰘秤<E3B098>𦒘<EFBFBD><F0A69298><EFBFBD><EFBFBD><E692A3>?
## **2\. 系统架构设计**
### **2.1 <EFBFBD><EFBFBD><EFBFBD>?*
### **2.1 架构图**
graph TD
User\[普通用户\] \--\>|请求业务| API\_Gateway
Debugger\[<EFBFBD><EFBFBD><EFBFBD>?銝枏振\] \--\>|霂瑟<EFBFBD>銝𡁜𦛚| API\_Gateway
Debugger\[调试者/专家\] \--\>|请求业务| API\_Gateway
Debugger \--\>|管理 Prompt| Admin\_Dashboard
subgraph "<EFBFBD><EFBFBD>鈭?SAE (<28>煺漣<E785BA><EFBFBD>)"
subgraph "阿里云 SAE (生产环境)"
API\_Gateway\[Nginx\] \--\> Backend\_App
subgraph "Node.js Backend Pods (憭𡁜<EFBFBD>靘?"
subgraph "Node.js Backend Pods (多实例)"
Backend\_App\[Backend Service\]
PromptService\[Prompt Service\]
@@ -34,7 +37,7 @@ graph TD
DebugSet\[调试会话集合 (Set)\]
Backend\_App \--\>|1. 获取 Prompt| PromptService
PromptService \--\>|2. <EFBFBD><EFBFBD>摮?DB| MemoryCache
PromptService \--\>|2. 查缓存/DB| MemoryCache
PromptService \--\>|3. 校验 Debug 权限| DebugSet
end
end
@@ -49,23 +52,25 @@ graph TD
DB \--\>|6. NOTIFY prompt\_update| PromptService
end
### **2.2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*
### **2.2 核心特性**
1. **Postgres-Only**:利用 PostgreSQL 的 LISTEN/NOTIFY 机制实现多实例缓存同步,无需引入 Redis。
2. **无状态设计**DebugSet 和 MemoryCache 均存储在内存中,配合数据库实现最终一致性。
3. **零侵入性**:普通用户完全感知不到 Prompt 正在被调整,只有开启了 Debug 模式的特定角色能看到变化。
1. **Postgres-Only**嚗𡁜⏚<F0A1819C>?PostgreSQL <20>?LISTEN/NOTIFY <20><EFBFBD>摰䂿緵憭𡁜<E686AD>靘讠<E99D98>摮睃<E691AE>甇伐<E79487><E4BC90>𣳇<EFBFBD>撘訫<E69298> Redis<69>?
2. **<EFBFBD>删𠶖<EFBFBD><EFBFBD>挽霈?*嚗鋽ebugSet <20>?MemoryCache <20><><EFBFBD><EFBFBD>典銁<E585B8><E98A81><EFBFBD>銝哨<E98A9D><E593A8><EFBFBD><E6BB9A>唳旿摨枏<E691A8><E69E8F><EFBFBD><EFBFBD><E89D8F><EFBFBD><EFBFBD><EFBFBD>?
3. **<EFBFBD>嗡噩<EFBFBD><EFBFBD>?*嚗𡁏芦<F0A1818F>𡁶鍂<F0A181B6><EFBFBD><E79195><EFBFBD><E586BD><EFBFBD><E4B9A9>?Prompt 甇<>銁鋡怨<E98BA1><E680A8><EFBFBD><E6B99B><EFBFBD><EFBFBD><E69298><EFBFBD> Debug 璅<E79285><E288AA><EFBFBD>鸌摰朞<E691B0><E69C9E><EFBFBD><E884B0><EFBFBD><E8A781><EFBFBD><E79D83>?
## **3\. 数据库与权限设计**
### **3.1 <EFBFBD>鞟內霂?Schema (capability\_schema)**
### **3.1 提示词 Schema (capability\_schema)**
请将以下 Schema 添加到 backend/prisma/schema.prisma 的 capability\_schema 部分。
霂瑕<EFBFBD>隞乩<EFBFBD> Schema 瘛餃<E7989B><E9A483>?backend/prisma/schema.prisma <20>?capability\_schema <20><EFBFBD><E585B8>?
// \--- Prompt Management System \---
model PromptTemplate {
id Int @id @default(autoincrement())
code String @unique // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝚佗<EFBFBD>憒?'ASL\_SCREENING\_TitleAbstract'
code String @unique // 唯一标识符,如 'ASL\_SCREENING\_TitleAbstract'
name String // 人类可读名称
module String // <EFBFBD><EFBFBD>撅墧芋<EFBFBD>? ASL, DC, AIA, IIT
module String // 所属模块: ASL, DC, AIA, IIT
description String?
variables Json? // 预期变量列表,如 \["title", "abstract"\]
@@ -81,8 +86,8 @@ model PromptTemplate {
model PromptVersion {
id Int @id @default(autoincrement())
templateId Int @map("template\_id")
version Int // <EFBFBD><EFBFBD>𧋦<EFBFBD>?1, 2, 3...
content String // <EFBFBD>鞟內霂滚<EFBFBD>摰?(Handlebars/Mustache <EFBFBD><EFBFBD>)
version Int // 版本号 1, 2, 3...
content String // 提示词内容 (Handlebars/Mustache 格式)
modelConfig Json? // 模型参数: { "temperature": 0.1, "model": "deepseek-chat" }
status PromptStatus @default(DRAFT)
changelog String? // 修改说明
@@ -100,7 +105,7 @@ model PromptVersion {
}
enum PromptStatus {
DRAFT // <EFBFBD>厩阮 (隞?Debug 璅<E79285><E288AA><EFBFBD>)
DRAFT // 草稿 (仅 Debug 模式可见)
ACTIVE // 线上生效 (默认可见)
ARCHIVED // 归档
@@ -109,15 +114,17 @@ enum PromptStatus {
### **3.2 权限定义 (platform\_schema)**
<EFBFBD>拍鍂<EFBFBD><EFBFBD><EFBFBD>?RBAC 蝟餌<E89D9F>嚗屸<E59A97><EFBFBD>銁 permissions 銵其葉憸<E89189>蔭隞乩<E99A9E><E4B9A9><EFBFBD><EFBFBD>嚗?
利用现有的 RBAC 系统,需要在 permissions 表中预置以下权限:
|
| 权限 Code | 描述 | 适用角色 |
| prompt:view | <EFBFBD><EFBFBD> Prompt <EFBFBD>𡑒”<EFBFBD>諹祕<EFBFBD>?| 蝞∠<E89D9E><E288A0>? 靚<><E99D9A><EFBFBD>?|
| prompt:edit | <EFBFBD>𥕦遣<EFBFBD>厩阮<EFBFBD><EFBFBD><EFBFBD>?Draft <20><>𧋦 | 蝞∠<E89D9E><E288A0>? 靚<><E99D9A><EFBFBD>?|
| prompt:debug | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𡁜<EFBFBD><EFBFBD>?<3F>喲𡡒靚<F0A1A192><E99D9A><E79285> | 蝞∠<E89D9E><E288A0>? 靚<><E99D9A><EFBFBD>?|
| prompt:publish | 撠?Draft <EFBFBD><EFBFBD>銝?Active | 蝞∠<EFBFBD><EFBFBD>? 韏<>楛靚<E6A59B><E99D9A><EFBFBD>?|
撱箄悅<EFBFBD>𥕦遣銝<EFBFBD>銝芣鰵閫坿𠧧 **PROMPT\_ENGINEER**嚗諹<E59A97><EFBFBD><E988AD>餈唳<E9A488><E594B3><EFBFBD><E39787><EFBFBD>?
| prompt:view | 查看 Prompt 列表和详情 | 管理员, 调试者 |
| prompt:edit | 创建草稿、修改 Draft 版本 | 管理员, 调试者 |
| prompt:debug | 核心权限:开启/关闭调试模式 | 管理员, 调试者 |
| prompt:publish | Draft 发布为 Active | 管理员, 资深调试者 |
建议创建一个新角色 **PROMPT\_ENGINEER**,赋予上述所有权限。
## **4\. 后端核心实现 (PromptService)**
文件路径backend/src/common/capabilities/prompt/prompt.service.ts
@@ -125,40 +132,43 @@ enum PromptStatus {
### **4.1 核心逻辑**
* **setDebugMode(userId, enabled)**:
1. **<EFBFBD><EFBFBD>**嚗𡁻<E59A97><F0A181BB><EFBFBD><EFBFBD><EFBFBD>亥砲 userId <EFBFBD>臬炏<EFBFBD><EFBFBD> prompt:debug <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UserContext <EFBFBD>𡝗䰻摨橒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇𥅾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Debug <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗𡁜銁<F0A1819C><E98A81><EFBFBD>銝剔輕<E58994>?Set\<string\>嚗諹扇敶訫<E695B6><E8A8AB><EFBFBD><EFBFBD><E99D9A><E79285><E288AA><EFBFBD><EFBFBD>?ID<49>?
1. **鉴权**:首先检查该 userId 是否拥有 prompt:debug 权限(通过 UserContext 或查库)。只有拥有权限的用户允许加入 Debug 集合。
2. **状态维护**:在内存中维护 Set\<string\>,记录开启了调试模式的用户 ID。
* **get(code, variables, userId)**:
1. <EFBFBD><EFBFBD>?userId <EFBFBD>臬炏<EFBFBD>?debugUsers <EFBFBD><EFBFBD><EFBFBD>銝准<EFBFBD>?
2. **<EFBFBD>?*嚗帋<E59A97><E5B88B><EFBFBD>䰻霂<EFBCB8><EFBFBD>銝剔𠶖<E58994><F0A0B696>蛹 DRAFT <20><><EFBFBD><EFBFBD><EFBFBD><E59581><EFBFBD>?
3. **<EFBFBD>?*嚗<><E59A97><EFBFBD>?Draft嚗㚁<E59A97><E39A81>亥砭<E4BAA5><E7A0AD><EFBFBD>蝻枏<E89DBB>銝剔<E98A9D> ACTIVE <EFBFBD><EFBFBD>𧋦<EFBFBD>?
4. **蝻枏<EFBFBD><EFBFBD>芸𦶢銝?*嚗帋<E59A97><E5B88B>唳旿摨𤘪䰻霂?ACTIVE <20><>𧋦撟嗅<E6929F><E59785><EFBFBD>摮塩<E691AE>?
5. 雿輻鍂 Handlebars 皜脫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### **4.2 <20>剜凒<E5899C>?(Hot Reload)**
1. 检查 userId 是否在 debugUsers 集合中。
2. **是**:优先查询数据库中状态为 DRAFT 的最新版本。
3. **否**(或无 Draft查询内存缓存中的 ACTIVE 版本。
4. **缓存未命中**:从数据库查询 ACTIVE 版本并写入缓存。
5. 使用 Handlebars 渲染变量。
### **4.2 热更新 (Hot Reload)**
* 监听 Postgres 的 prompt\_update 频道。
* 收到通知后,清空内存缓存。
* <20>穃𨯬 Postgres <20>?prompt\_update 憸煾<E686B8><E785BE>?
* <20><EFBFBD><E59785>𡁶䰻<F0A181B6>𠬍<EFBFBD><EFBFBD><EFBFBD><E5BE81><EFBFBD>蝻枏<E89DBB><E69E8F>?
## **5\. API 接口设计**
### **5.1 蝞∠<EFBFBD>蝡舀𦻖<EFBFBD>?(PromptController)**
### **5.1 管理端接口 (PromptController)**
| 方法 | 路径 | 权限要求 | 描述 |
| GET | /api/admin/prompts | prompt:view | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?Prompt 璅⊥踎<EFBFBD>𡑒” |
| GET | /api/admin/prompts/:id | prompt:view | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>璅⊥踎霂行<EFBFBD><EFBFBD>𠰴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| GET | /api/admin/prompts | prompt:view | 获取所有 Prompt 模板列表 |
| GET | /api/admin/prompts/:id | prompt:view | 获取特定模板详情及历史版本 |
| POST | /api/admin/prompts/draft | prompt:edit | 保存草稿 (生成新版本,状态为 DRAFT) |
| POST | /api/admin/prompts/publish | prompt:publish | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦 (<28><EFBFBD>?Draft \-\> Active) |
| POST | /api/admin/prompts/debug | prompt:debug | <EFBFBD><EFBFBD><EFBFBD>霂閙芋撘?({ enabled: true }) |
| POST | /api/admin/prompts/publish | prompt:publish | 发布版本 (状态 Draft \-\> Active) |
| POST | /api/admin/prompts/debug | prompt:debug | 开关调试模式 ({ enabled: true }) |
### **5.2 业务集成示例 (ASL 模块)**
<EFBFBD>?ASL <EFBFBD>銝剛<EFBFBD><EFBFBD>?Prompt <20><EFBFBD>**敹<>◆隡惩<E99AA1> userId**嚗𣬚頂蝏煺<E89D8F><E785BA>芸𢆡憭<F0A286A1><E686AD><EFBFBD>啣漲<E595A3><EFBFBD>嚗?
ASL 模块中调用 Prompt 时,**必须传入 userId**,系统会自动处理灰度逻辑:
// backend/src/modules/asl/services/screening.service.ts
import { promptService } from '@/common/capabilities/prompt/prompt.service';
export class ScreeningService {
async screenPaper(paper: any, userId: string) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?Prompt
// <EFBFBD><EFBFBD> userId <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈䠷<EFBFBD>隡朞䌊<EFBFBD>冽嚉<EFBFBD>?DRAFT <EFBFBD>?Prompt
// 动态获取 Prompt
// 如果 userId 是开启了调试模式的“调试者”,这里会自动拿到 DRAFT Prompt
const prompt \= await promptService.get(
'ASL\_SCREENING\_TitleAbstract',
{ title: paper.title, abstract: paper.abstract },
@@ -170,63 +180,70 @@ export class ScreeningService {
}
}
## **6\. <EFBFBD>滨垢蝞∠<EFBFBD>蝡航挽霈?(Frontend-V2)**
## **6\. 前端管理端设计 (Frontend-V2)**
在 frontend-v2/src/modules/admin 下新增 Prompt 管理模块。
<EFBFBD>?frontend-v2/src/modules/admin 銝𧢲鰵憓?Prompt 蝞∠<E89D9E><E79285><E288AA>?
### **6.1 界面功能**
1. **<EFBFBD>𡑒”憿?*嚗𡁜<E59A97>蝷箸<E89DB7><E7AEB8>?Prompt 璅⊥踎<EFBFBD>?
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗?
* **雿滨蔭**嚗𡁶<E59A97><F0A181B6><EFBD81>典紡<E585B8><EFBFBD><E88AA3>硋𢰧銝贝<E98A9D><E8B49D>祆筑<E7A586><E7AD91><EFBFBD>?
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗帋<E59A97>敶梶鍂<E6A2B6>瑟𥅾<E7919F>?prompt:debug <20><><EFBFBD><EFBFBD>嗆遬蝷箄砲撘<E7A0B2><E69298><EFBFBD>?
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>擐?*嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><E59A97>蝡䠷▲<E4A0B7>典枂<E585B8><EFBFBD><E59C88>脰郎<E884B0>𦠜辺嚗尠<E59A97><EFBFBD>儭?靚<><E99D9A><E79285>撌脣<E6928C><E884A3><EFBFBD><E88D94><EFBFBD><E585B8>齿迤<E9BDBF>其蝙<E585B6><EFBFBD>蝔輻<E89D94> (DRAFT) <20>鞟內霂滩<E99C82>銵峕<E98AB5>雿鎿<E99BBF><EFBFBD>?
3. **蝻𤥁<EFBFBD><EFBFBD>?*嚗?
* <EFBFBD><EFBFBD> Markdown 擃䀝漁<EFBFBD>?
* <EFBFBD><EFBFBD><EFBFBD>𤩺覔<EFBFBD><EFBFBD><EFBFBD>𣂼𢆡<EFBFBD><EFBFBD>遬蝷綽<EFBFBD><EFBFBD><EFBFBD>瘝⊥<EFBFBD> prompt:publish <20><><EFBFBD><EFBFBD><E59A97><EFBFBD>𨅯<EFBFBD><EFBFBD><E692A3><EFBFBD><E884B2>桃蔭<E6A183><EFBFBD>?
### **6.2 <20><EFBFBD>撌乩<E6928C>瘚?(Workflow)**
1. **列表页**:展示所有 Prompt 模板。
2. **全局调试开关**
* **位置**:界面顶部导航栏或右下角悬浮球。
* **权限控制**:仅当用户拥有 prompt:debug 权限时显示该开关。
* **状态反馈**:开启后,全站顶部出现黄色警告条:“⚠️ 调试模式已开启:您当前正在使用草稿版 (DRAFT) 提示词进行操作”。
3. **编辑器**
* 支持 Markdown 高亮。
* 操作栏根据权限动态显示:如果没有 prompt:publish 权限,则“发布”按钮置灰。
### **6.2 典型工作流 (Workflow)**
1. **场景**:临床专家 Dr. Wang (角色: Debugger) 觉得文献筛选的准确率不够。
2. **修改**Dr. Wang 登录系统,进入 Prompt 管理页,修改 ASL\_SCREENING 的提示词,增加了一条排除标准,点击“保存草稿”。
3. **调试**Dr. Wang 点击顶部的 **“开启调试模式”**。
4. **验证**Dr. Wang 切换到 ASL 业务页面,上传几篇之前筛错的文献,点击运行。
* *系统后端检测到 Dr. Wang 在 Debug 列表中,加载 Draft 版 Prompt。*
5. **确认**:发现结果正确了。
6. **发布**Dr. Wang 回到管理页,点击“发布”(或者通知管理员发布)。
7. **结束**Dr. Wang 关闭调试模式。
1. **<EFBFBD>箸艶**嚗帋葩摨𠹺<E691A8>摰?Dr. Wang (閫坿𠧧: Debugger) 閫匧<E996AB><E58CA7><EFBFBD>讃蝑偦<E89D91><EFBFBD><E58EA9><EFBFBD><EFBFBD><EFBC86><EFBFBD>憭麄<E686AD>?
2. **靽格㺿**嚗鋽r. Wang <20><EFBFBD>蝟餌<E89D9F>嚗諹<E59A97><E8ABB9>?Prompt 蝞∠<E89D9E>憿蛛<E686BF>靽格㺿 ASL\_SCREENING <20><><EFBFBD>蝷箄<E89DB7><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><E98A9D><EFBFBD><E28AA5><EFBFBD><E69697><EFBFBD><EFBFBD><EFBFBD>孵稬<E5ADB5><EFBFBD>摮䁅<E691AE>蝔踱<E89D94><EFBFBD>?
3. **靚<><E99D9A>**嚗鋽r. Wang <20>孵稬憿園<E686BF><E59C92>?**<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>霂閙芋撘謿<EFBFBD>?*<2A>?
4. **撉諹<E69289>**嚗鋽r. Wang <20><><EFBFBD>?ASL 銝𡁜𦛚憿菟𢒰嚗䔶<E59A97>隡惩<E99AA1><EFBFBD><E89DAD><EFBFBD><EFBFBD><E6BBA8><EFBFBD><E597B5><EFBFBD>讃嚗𣬚<E59A97><F0A3AC9A><EFBFBD>銵䎚<E98AB5>?
* *蝟餌<E89D9F><E9A48C>𡒊垢璉<E59EA2>瘚见<E7989A> Dr. Wang <20>?Debug <20>𡑒”銝哨<E98A9D><E593A8>㰘蝸 Draft <20>?Prompt<70>?
5. **蝖株恕**嚗𡁜<E59A97><F0A1819C><EFBFBD><E59581>𨀣迤蝖桐<E89D96><E6A190>?
6. **<EFBFBD><EFBFBD>**嚗鋽r. Wang <20>𧼮<EFBFBD>蝞∠<E89D9E>憿蛛<E686BF><E89B9B>孵稬<E5ADB5>𨅯<EFBFBD><EFBFBD><E692A3><EFBFBD><E59885>𤥁<EFBFBD><F0A4A581><EFBFBD>𡁶䰻蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD><E692A3><EFBFBD>?
7. **蝏𤘪<E89D8F>**嚗鋽r. Wang <20>喲𡡒靚<F0A1A192><E99D9A><E79285><E288AA>?
## **7\. 实施计划**
### **Phase 1: <EFBFBD><EFBFBD>霈暹鴌撱箄挽 (1-2憭?**
### **Phase 1: 基础设施建设 (1-2天)**
1. <EFBFBD>𥕦遣<EFBFBD>唳旿摨栞” prompt\_templates, prompt\_versions<EFBFBD>?
2. <EFBFBD>?permissions 銵其葉<EFBFBD><EFBFBD> prompt:\* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
3. 摰䂿緵 PromptService <EFBFBD>𡒊垢<EFBFBD><EFBFBD><EFBFBD>?
### **Phase 2: 銝𡁜𦛚璅<E79285><E288AA><EFBFBD> (<28>?ASL 撘<><E69298><EFBFBD>甇?**
1. 创建数据库表 prompt\_templates, prompt\_versions
2. permissions 表中插入 prompt:\* 相关权限。
3. 实现 PromptService 后端逻辑。
1. <20><EFBFBD><E585B8>?ASL 璅<E79285><E288AA><EFBFBD><E5A19A><EFBFBD> promptService.get() <20><EFBFBD> Prompt<70>?
### **Phase 3: 蝞∠<E89D9E>蝡?MVP (3-4憭?**
### **Phase 2: 业务模块接入 (随 ASL 开发同步)**
1. <EFBFBD><EFBFBD><EFBFBD>蝡舐恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. 摰䂿緵<E482BF><EFBFBD><EFBFBD><E99D9A><EFBFBD><E69298><EFBFBD>隞嗚<E99A9E>?
## **8\. 摰匧<E691B0>銝𡡞<E98A9D><F0A1A19E>?*
1. 在开发 ASL 模块时,通过 promptService.get() 获取 Prompt。
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𠉛氖**嚗帋艇<E5B88B><EFBFBD><E6BDAD>?prompt:debug <20><><EFBFBD>嚗屸俈甇<EFBCB8>𡁶鍂<F0A181B6>瑁秤<E79181><EFBFBD>霂閙芋撘譌<E69298>?
2. **摰∟恣<E2889F><EFBFBD>**嚗䥪romptVersion 銵其葉<E585B6>?createdBy 摮埈挾敹<E68CBE>◆霈啣<E99C88>摰鮋<E691B0>靽格㺿鈭箇<E988AD> ID嚗䔶噶鈭舘蕭皞舀糓<E88880><EFBFBD><EFBFBD><E99D9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Prompt<70>?
3. **<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>**嚗帋誨<E5B88B><E8AAA8>葉靽萘<E99DBD> Hardcoded Prompt 雿靝蛹蝟餌<E89D9F>蝥批<E89DA5>摨𨰻<E691A8>?
## **9\. <20><><EFBFBD><E996AC>蝵娑rompt<70><74><EFBFBD><EFBFBD>㗇芋<E39787><EFBFBD>銵?*
### **Phase 3: 管理端 MVP (3-4天)**
| 銝𡁜𦛚璅<E79285> | 靚<><EFBFBD>箸艶 | <20><EFBFBD> Prompt 隡睃<E99AA1><E79D83><EFBFBD> | 憭齿<E686AD>摨?|
1. 开发前端管理界面。
2. 实现全局调试开关组件。
## **8\. 安全与风控**
1. **权限隔离**:严格检查 prompt:debug 权限,防止普通用户误入调试模式。
2. **审计日志**PromptVersion 表中的 createdBy 字段必须记录实际修改人的 ID便于追溯是哪位调试者修改了 Prompt。
3. **兜底机制**:代码中保留 Hardcoded Prompt 作为系统级兜底。
## **9\. 需要配置Prompt的所有模块列表**
| 业务模块 | 调用场景 | 核心 Prompt 优化方向 | 复杂度 |
| :---- | :---- | :---- | :---- |
| **ASL (AI <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)** | **1\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | **<EFBFBD><EFBFBD>蝐餃ế<EFBFBD>?*嚗𡁻<E59A97><EFBFBD><E996AC>擃条<E69383>蝎曉<E89D8E>摨佗<E691A8>Recall 隡睃<E99AA1>嚗剹<E59A97><E589B9>rompt <20><><EFBFBD><E996AC><EFBFBD><EFBFBD>蝖桃<E89D96>蝥喳<E89DA5>/<2F>㘾膄<E398BE><E88684><EFBFBD>嚗㇊ICOS嚗㚁<E59A97>撟嗉<E6929F><EFBFBD><E79899><EFBFBD>?JSON <20><EFBFBD><E6BE86>?bool <20><EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| | **2\. <EFBFBD><EFBFBD>憭滨<EFBFBD>** | **憭齿<EFBFBD>靽⊥<EFBFBD><EFBFBD>𣂼<EFBFBD>**嚗帋<E59A97> PDF <EFBFBD>𣂼<EFBFBD> PICO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rompt <20><><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD><E9B5AD>𧋦嚗㇃ontext Window <20>𣂼<EFBFBD>嚗㚁<E59A97>撟嗡<E6929F><EFBFBD><E996AC><EFBFBD><EFBFBD><E692A9><EFBFBD>撟餉<E6929F><E9A489><EFBFBD>嚗Āerification嚗剹<E59A97>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| | **3\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗𡁶遞<F0A181B6><E9819E><EFBFBD><EFBFBD><E89DAD><EFBFBD><EFBFBD><E6A183>?Meta <20><><EFBFBD>蝏栞捏<E6A09E><E68D8F><EFBFBD>閬?Chain-of-Thought (CoT) <EFBFBD>鞟內霂溻<EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83> |
| **DC (<EFBFBD>唳旿皜<EFBFBD><EFBFBD>)** | **1\. Tool B (<EFBFBD>峕芋<EFBFBD>𧢲<EFBFBD><EFBFBD>?** | **蝏𤘪<EFBFBD><EFBFBD>𡝗𡂝<EFBFBD>?*嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦<EFBFBD>𣂼<EFBFBD>摮埈挾<E59F88><E68CBE>rompt <20><><EFBFBD><E996AC><EFBFBD>怠龫摮行钟霂剖<E99C82>銋剹<E98A8B><E589B9><EFBFBD>銋㕑<E98A8B><E39591><EFBFBD><EFBFBD><E996AB><EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| | **2\. Tool C (<EFBFBD>唳旿皜<EFBFBD><EFBFBD>)** | **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/閫<><E996AB><EFBFBD>斗鱏**嚗𡁜<E59A97><F0A1819C>𨅯<EFBFBD> A <20><EFBFBD><E39B96><EFBFBD>𧋦<EFBFBD><EFBFBD>銝箸<E98A9D><E7AEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E88588>rompt <20><><EFBFBD>移蝖桃<E89D96><EFBFBD><EFBFBD><EFBFBD>銝𧢲<E98A9D>嚗𣬚<E59A97><F0A3AC9A><EFBFBD><E5969F>?Python/JS 隞<><E99A9E><EFBFBD><EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83> |
| | **3\. <EFBFBD><EFBFBD><EFBFBD>瘚?* | **<EFBFBD><EFBFBD>隞脰<EFBFBD>**嚗𡁜ế<F0A1819C>凋舅銝芣芋<E88AA3>𧢲<EFBFBD><F0A7A2B2>𣇉<EFBFBD><F0A38789>𨅯𪑛銝芣凒<E88AA3>臭縑<E887AD>?| 潃鐥<E6BD83>潃?|
| **AIA (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)** | **1\. 10+ <EFBFBD><EFBFBD>雿?* | **閫坿𠧧<EFBFBD><EFBFBD> (Persona)**嚗帋<E59A97><E5B88B>𣬚<EFBFBD> Agent嚗<74><E59A97>蝏蠘恣撣<E681A3><E692A3><EFBFBD>葩摨𠹺<E691A8>摰塚<E691B0><E5A19A><EFBFBD><EFBFBD><E996AC><EFBFBD>𣬚<EFBFBD> Tone (霂剜<E99C82>) <20>𣬚䰻霂<E4B0BB><EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃?|
| | **2\. <EFBFBD>誩㦛霂<EFBFBD><EFBFBD>** | **頝舐眏<EFBFBD><EFBFBD><EFBFBD>**嚗𡁜ế<F0A1819C>剔鍂<E58994>瑟糓<E7919F>券𤦭<E588B8>𨳍<EFBFBD><F0A8B38D>䔮霂𡃏<E99C82><F0A1838F>舀䰻<E88880><E4B0BB><EFBFBD>?| 潃鐥<E6BD83>潃?|
| **PKB (<EFBFBD><EFBFBD>摨?** | **1\. RAG <EFBFBD><EFBFBD>** | **<EFBFBD><EFBFBD>銝𠹺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑?*嚗帋艇<E5B88B><EFBFBD><E6BDAE><EFBFBD><E597A1>寞旿璉<E697BF><E89D9D><EFBCB7>?chunks <20><EFBFBD>嚗峕<E59A97>蝏嘥<E89D8F><E598A5>函䰻霂<E4B0BB>劂閫剹<E996AB>?| 潃鐥<E6BD83>潃鐥<E6BD83> |
| | **2\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂?* | **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗𡁻<E59A97>摨行<E691A8>蝻拍<E89DBB>摮行钟<E8A18C><EFBFBD><E48185>?| 潃鐥<E6BD83>潃?|
| **IIT (IIT Manager)** | **1\. 韐冽綉璉<EFBFBD><EFBFBD>?* | **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗𡁏覔<F0A1818F>?Protocol 璉<><E79289><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E69FB4>rompt <20><><EFBFBD><EFBFBD>嗉祗閮<E7A597><E996AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E59F9D><EFBFBD><EFBFBD>碶蛹<E7A2B6><EFBFBD><E9A489>斗鱏<E69697>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| | **2\. <EFBFBD>誩㦛霂<EFBFBD><EFBFBD>** | **<EFBFBD>唳旿摨𤘪䰻霂<EFBFBD><EFBFBD>?*嚗𡁜<E59A97><F0A1819C><EFBFBD>霂剛<E99C82>頧砌蛹 Prisma <20>亥砭<E4BAA5>?SQL嚗<4C><E59A97><EFBFBD><EFBFBD><EFBFBD>摰匧<E691B0><E58CA7><EFBFBD><E694B9>?| 潃鐥<E6BD83>潃鐥<E6BD83> |
| **RVW (蝔蹂辣摰⊥䰻)** | **1\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?* | **Checklist 撖寧<EFBFBD>**嚗𡁻<E59A97>鞉辺<E99E89>詨笆 CONSORT/STROBE 憯唳<EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃?|
| **ASL (AI 智能文献)** | **1\. 标题摘要初筛** | **二分类判别**需要极高的精准度Recall 优先。Prompt 需要包含明确的纳入/排除标准PICOS并要求输出 JSON 格式的 bool 值。 | ⭐⭐⭐⭐⭐ |
| | **2\. 全文复筛** | **复杂信息提取**:从 PDF 提取 PICO 具体数值。Prompt 需要处理长文本Context Window 限制并且要有很强的抗幻觉机制Verification。 | ⭐⭐⭐⭐⭐ |
| | **3\. 证据合成** | **逻辑推理**:综合多篇文献生成 Meta 分析结论。需要 Chain-of-Thought (CoT) 提示词。 | ⭐⭐⭐⭐ |
| **DC (数据清洗)** | **1\. Tool B (双模型提取)** | **结构化抽取**从病历文本提取字段。Prompt 需要包含医学术语定义、同义词映射规则。 | ⭐⭐⭐⭐⭐ |
| | **2\. Tool C (数据清洗)** | **代码生成/规则判断**:如“将 A 列的文本映射为标准值”。Prompt 需要精确理解数据上下文,甚至生成 Python/JS 代码片段。 | ⭐⭐⭐⭐ |
| | **3\. 冲突检测** | **逻辑仲裁**:判断两个模型提取结果哪个更可信。 | ⭐⭐⭐ |
| **AIA (智能问答)** | **1\. 10+ 智能体** | **角色扮演 (Persona)**:不同的 Agent如统计师、临床专家需要不同的 Tone (语气) 和知识边界。 | ⭐⭐⭐ |
| | **2\. 意图识别** | **路由分发**:判断用户是在闲聊、问诊还是查文献。 | ⭐⭐⭐ |
| **PKB (知识库)** | **1\. RAG 问答** | **基于上下文回答**:严格限制仅根据检索到的 chunks 回答,杜绝外部知识幻觉。 | ⭐⭐⭐⭐ |
| | **2\. 批处理阅读** | **摘要生成**:高度浓缩的学术摘要。 | ⭐⭐⭐ |
| **IIT (IIT Manager)** | **1\. 质控检查** | **规则匹配**:根据 Protocol 检查入组数据。Prompt 需将自然语言的入排标准转化为逻辑判断。 | ⭐⭐⭐⭐⭐ |
| | **2\. 意图识别** | **数据库查询生成**:将自然语言转为 Prisma 查询或 SQL需极高安全性。 | ⭐⭐⭐⭐ |
| **RVW (稿件审查)** | **1\. 规范性检查** | **Checklist 对照**:逐条核对 CONSORT/STROBE 声明。 | ⭐⭐⭐ |

View File

@@ -1,27 +1,27 @@
# **Prompt蝞∠<EFBFBD>蝟餌<EFBFBD>敹恍<EFBFBD><EFBFBD><EFBFBD>?*
# **Prompt管理系统快速参考**
> **<EFBFBD><EFBFBD>𧋦嚗?* v1.0
> **隡睃<EFBFBD>蝥改<EFBFBD>** P0嚗<30>瓲敹<E793B2><E695B9>𡁶鍂<F0A181B6><EFBFBD>嚗?
> **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** 敺<><E695BA><EFBFBD>?
> **版本:** v1.0
> **优先级:** P0核心通用能力
> **状态:** 待开发
---
## 📌 核心概念
### <EFBFBD><EFBFBD>Prompt蝞∠<EFBFBD>蝟餌<EFBFBD>嚗?
### 什么是Prompt管理系统?
<EFBFBD>銝芸<EFBFBD>霈?*銝㮖<E98A9D>鈭箏<E988AD><E7AE8F><EFBFBD>鈭抒㴓憓<E3B493><E68693><EFBFBD><EFBFBD>霂𧭈I Prompt**<2A><><EFBFBD>摨阡<E691A8><EFBFBD>頂蝏麄<E89D8F>?
一个允许**专业人员在生产环境安全调试AI Prompt**的灰度预览系统。
### 銝箔<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
### 为什么需要它?
- <EFBFBD>?**<2A>𤤿<EFBFBD>1嚗?* 瘚贝<E7989A><E8B49D><EFBFBD><E887AC><EFBFBD>璅⊥<E79285><E28AA5><EFBFBD><E7AC94>餃郎<E9A483>唳旿嚗?0蝭<30><E89DAD><EFBFBD><EFBFBD><E69FB4><EFBFBD>摰䂿<E691B0><E482BF><EFBFBD><EFBFBD>
- <EFBFBD>?**<2A>𤤿<EFBFBD>2嚗?* 瘥𤩺活靚<E6B4BB>㟲Prompt<70><74><EFBFBD>㺿隞<E3BABF><E99A9E><EFBFBD><EFBFBD>蝵聆<E89DB5>蝑匧<E89D91>嚗?<3F><><EFBFBD>嚗?
- <EFBFBD>?**<2A>𤤿<EFBFBD>3嚗?* 銝游<E98A9D>銝枏振<E69E8F><EFBFBD><E4ADBE><EFBFBD><EFBFBD><EFBFBD><E99D9A><EFBFBD><E59A97>隞砌<E99A9E>隡𡁜<E99AA1><EFBFBD><E99A9E>嚗?
- <EFBFBD>?**閫<><E996AB>嚗?* <20>煺漣<E785BA><EFBFBD><E887AC>啣漲憸<E6BCB2><E686B8> + 靚<><E99D9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?+ DRAFT/ACTIVE<EFBFBD><EFBFBD>𧋦<EFBFBD>𠉛氖
- **痛点1** 测试环境无法模拟真实医学数据20篇文献、真实病历
- **痛点2** 每次调整Prompt需要改代码→部署→等待5分钟
- **痛点3** 临床专家无法参与调试(他们不会写代码)
- **解决:** 生产环境灰度预览 + 调试者角色 + DRAFT/ACTIVE版本隔离
---
## <EFBFBD><EFBFBD>儭?<3F>唳旿摨廍chema
## 🗂️ 数据库Schema
### 位置:`capability_schema`
@@ -31,7 +31,7 @@
model PromptTemplate {
id Int @id @default(autoincrement())
code String @unique // 'ASL_SCREENING_TitleAbstract'
name String // "ASL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑偦<EFBFBD>?
name String // "ASL标题摘要筛选"
module String // ASL, DC, IIT, AIA, PKB, RVW
description String?
variables Json? // ["title", "abstract"]
@@ -48,11 +48,11 @@ model PromptTemplate {
model PromptVersion {
id Int @id @default(autoincrement())
templateId Int @map("template_id")
version Int // <EFBFBD><EFBFBD>𧋦<EFBFBD>?
version Int // 版本号
content String @db.Text // Prompt内容
modelConfig Json? // {"temperature": 0.1}
status PromptStatus @default(DRAFT)
changelog String? // "憓𧼮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
changelog String? // "增加了排除标准"
createdBy String? @map("created_by") // UserID审计
template PromptTemplate @relation(fields: [templateId], references: [id])
@@ -66,7 +66,7 @@ model PromptVersion {
}
enum PromptStatus {
DRAFT // <EFBFBD>厩阮嚗<EFBFBD><EFBFBD>Debug璅<EFBFBD><EFBFBD><EFBFBD>嚗?
DRAFT // 草稿仅Debug模式可见
ACTIVE // 生产版本
ARCHIVED // 归档
@@ -76,15 +76,15 @@ enum PromptStatus {
---
## <EFBFBD><EFBFBD> <20><><EFBFBD>銝舘<E98A9D><E88898>?
## 🔐 权限与角色
### 新增权限
| 权限 Code | 描述 | 适用角色 |
|-----------|------|---------|
| `prompt:view` | <EFBFBD><EFBFBD>Prompt<EFBFBD>𡑒”<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| SUPER_ADMIN, PROMPT_ENGINEER |
| `prompt:view` | 查看Prompt列表和历史 | SUPER_ADMIN, PROMPT_ENGINEER |
| `prompt:edit` | 创建/修改DRAFT版本 | SUPER_ADMIN, PROMPT_ENGINEER |
| `prompt:debug` | 潃?**撘<><E69298><EFBFBD>霂閙芋撘?* | SUPER_ADMIN, PROMPT_ENGINEER |
| `prompt:debug` | **开启调试模式** | SUPER_ADMIN, PROMPT_ENGINEER |
| `prompt:publish` | 发布DRAFT→ACTIVE | SUPER_ADMIN, PROMPT_ENGINEER |
### 新增角色
@@ -103,15 +103,15 @@ enum UserRole {
## 🚀 核心API
### 蝞∠<EFBFBD>蝡舀𦻖<EFBFBD>?
### 管理端接口
| 方法 | 路径 | 权限 | 描述 |
|------|------|------|------|
| GET | `/api/admin/prompts` | prompt:view | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇芋<EFBFBD>?|
| GET | `/api/admin/prompts` | prompt:view | 获取所有模板 |
| GET | `/api/admin/prompts/:id` | prompt:view | 获取详情+历史版本 |
| POST | `/api/admin/prompts/draft` | prompt:edit | 保存草稿 |
| POST | `/api/admin/prompts/publish` | prompt:publish | 发布 |
| POST | `/api/admin/prompts/debug` | prompt:debug | **<EFBFBD><EFBFBD><EFBFBD>霂閙芋撘?* |
| POST | `/api/admin/prompts/debug` | prompt:debug | **开关调试模式** |
### 业务模块集成
@@ -126,7 +126,7 @@ export class ScreeningService {
const prompt = await promptService.get(
'ASL_SCREENING_TitleAbstract',
{ title: paper.title, abstract: paper.abstract },
userId // 潃?敹<>◆隡惩<E99AA1>userId
userId // ⭐ 必须传入userId
);
return await llmGateway.chat(prompt);
@@ -138,7 +138,7 @@ export class ScreeningService {
## 🎨 前端组件
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### 全局调试开关
```tsx
// frontend-v2/src/modules/admin/components/PromptDebugSwitch.tsx
@@ -175,18 +175,18 @@ export const PromptDebugSwitch = () => {
## 📋 涉及模块
| <EFBFBD> | <20><EFBFBD><E8A9A8>箸艶 | 憭齿<E686AD>摨?| 隡睃<E99AA1>蝥?|
| 模块 | 核心场景 | 复杂度 | 优先级 |
|------|---------|-------|--------|
| **ASL** | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑䜘<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?| P0 |
| **DC** | Tool B<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>ool C皜<43><E79A9C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E89D92>瘚?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?| P0 |
| **IIT** | 韐冽綉璉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?| P1 |
| **ASL** | 标题摘要初筛、全文复筛、证据合成 | ⭐⭐⭐⭐⭐ | P0 |
| **DC** | Tool B提取、Tool C清洗、冲突检测 | ⭐⭐⭐⭐⭐ | P0 |
| **IIT** | 质控检查、意图识别 | ⭐⭐⭐⭐⭐ | P1 |
| **PKB** | RAG问答、批处理阅读 | ⭐⭐⭐⭐ | P1 |
| **AIA** | 10+<EFBFBD><EFBFBD>雿瓐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃?| P2 |
| **RVW** | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 潃鐥<E6BD83>潃?| P2 |
| **AIA** | 10+智能体、意图识别 | ⭐⭐⭐ | P2 |
| **RVW** | 规范性检查 | ⭐⭐⭐ | P2 |
---
## <EFBFBD><EFBFBD> <20><EFBFBD><E8A9A8><EFBFBD>嚗㇊romptService嚗?
## ⚙️ 核心逻辑PromptService
```typescript
// backend/src/common/capabilities/prompt/prompt.service.ts
@@ -214,7 +214,7 @@ export class PromptService {
}
}
// 2. <EFBFBD><EFBFBD>𡁶鍂<EFBFBD>瑁繮<EFBFBD>䨝CTIVE<EFBFBD><EFBFBD>𧋦嚗<EFBFBD>蒂蝻枏<EFBFBD>嚗?
// 2. 普通用户获取ACTIVE版本带缓存
let active = this.activeCache.get(code);
if (!active) {
const version = await prisma.promptVersion.findFirst({
@@ -231,7 +231,7 @@ export class PromptService {
return this.render(active, variables);
}
// Postgres LISTEN/NOTIFY <EFBFBD>剜凒<EFBFBD>?
// Postgres LISTEN/NOTIFY 热更新
async initHotReload() {
const client = await pool.connect();
await client.query('LISTEN prompt_update');
@@ -245,19 +245,19 @@ export class PromptService {
---
## <EFBFBD><EFBFBD><><E69298>𤏸恣<F0A48FB8>?
## 📅 开发计划
### Phase 0: <EFBFBD><EFBFBD>霈暹鴌嚗?憭抬<E686AD>
### Phase 0: 基础设施2天
- [ ] <EFBFBD>𥕦遣<EFBFBD>唳旿摨栞”嚗Ǒprompt_templates`, `prompt_versions`嚗?
- [ ] 创建数据库表(`prompt_templates`, `prompt_versions`
- [ ] 添加`prompt:*`权限到`platform_schema.permissions`
- [ ] 创建`PROMPT_ENGINEER`角色
- [ ] 实现`PromptService`核心逻辑
### Phase 1: 餈鞱𨯫蝡烘VP嚗?憭抬<E686AD>
### Phase 1: 运营端MVP3天
- [ ] 前端管理界面(列表、编辑器、版本历史)
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞?
- [ ] 全局调试开关组件
- [ ] 草稿保存/发布功能
### Phase 2: 业务模块接入(随业务开发)
@@ -268,48 +268,48 @@ export class PromptService {
---
## <EFBFBD><EFBFBD> 摰匧<E691B0>銝𡡞<E98A9D><F0A1A19E>?
## 🔒 安全与风控
### 权限隔离
- <EFBFBD>?銝交聢璉<E881A2><E79289>prompt:debug`<EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>?靚<><E99D9A><E79285><E288AA><EFBFBD><E59786><EFBFBD><EFBFBD>典銁<E585B8><E98A81><EFBFBD><EFBFBD><EFBFBD>箄䌊<E7AE84>典仃<E585B8><E4BB83><EFBFBD>
- ✅ 严格检查`prompt:debug`权限
- ✅ 调试模式状态存储在内存(登出自动失效)
### 审计日志
- <EFBFBD>?`PromptVersion.createdBy`霈啣<EFBFBD>靽格㺿鈭?
- <EFBFBD>?`AdminOperationLog`霈啣<EFBFBD><EFBFBD><EFBFBD>銵䔶蛹嚗éodule='prompt'嚗?
- `PromptVersion.createdBy`记录修改人
- `AdminOperationLog`记录发布行为module='prompt'
### 兜底机制
- <EFBFBD>?隞<><E99A9E>銝凋<E98A9D><E5878B>ardcoded Prompt雿靝蛹蝟餌<EFBFBD>蝥批<EFBFBD>摨?
- <EFBFBD>?<3F>唳旿摨𤘪䰻霂仃韐交𧒄餈𥪜<E9A488>暺䁅恕<E48185><E68195>𧋦
- ✅ 代码中保留Hardcoded Prompt作为系统级兜底
- ✅ 数据库查询失败时返回默认版本
---
## <EFBFBD><20><EFBFBD>撌乩<E6928C>瘚?
## 🎯 典型工作流
1. **<EFBFBD>箸艶嚗?* 銝游<E98A9D>銝枏振Dr. Wang閫匧<E996AB>ASL<53><4C>讃蝑偦<E89D91><EFBFBD>蝖桃<E89D96>銝滚<E98A9D>
1. **场景:** 临床专家Dr. Wang觉得ASL文献筛选准确率不够
2. **靽格㺿嚗?* Dr. Wang<EFBFBD><EFBFBD>餈鞱𨯫蝞∠<EFBFBD>蝡荔<EFBFBD>靽格㺿`ASL_SCREENING`<EFBFBD><EFBFBD>rompt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>靽嘥<EFBFBD><EFBFBD>厩阮
2. **修改:** Dr. Wang登录运营管理端,修改`ASL_SCREENING`的Prompt,增加排除标准,保存草稿
3. **<EFBFBD><EFBFBD>嚗?* Dr. Wang<EFBFBD>孵稬憿園<EFBFBD><EFBFBD>?撘<><E69298><EFBFBD>霂閙芋撘?
3. **调试:** Dr. Wang点击顶部的"开启调试模式"
4. **撉諹<EFBFBD>嚗?* Dr. Wang<EFBFBD><EFBFBD><EFBFBD>蚊SL銝𡁜𦛚憿菟𢒰嚗䔶<EFBFBD>隡惩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*<EFBFBD>?蝟餌<E89D9F><E9A48C>𡒊垢璉<E59EA2>瘚见<E7989A>Dr. Wang<EFBFBD>ebug<EFBFBD>𡑒”銝哨<EFBFBD><EFBFBD>㰘蝸DRAFT<EFBFBD>rompt*
4. **验证:** Dr. Wang切换到ASL业务页面上传几篇之前筛错的文献
*→ 系统后端检测到Dr. Wang在Debug列表中,加载DRAFT版Prompt*
5. **蝖株恕嚗?* <20>𤑳緵蝏𤘪<E89D8F><EFBFBD>鈭?
5. **确认:** 发现结果正确了
6. **<EFBFBD><EFBFBD>嚗?* Dr. Wang<6E>𧼮<EFBFBD>蝞∠<E89D9E>憿蛛<E686BF><E89B9B>孵稬"<22><EFBFBD>"
6. **发布:** Dr. Wang回到管理页点击"发布"
7. **蝏𤘪<EFBFBD>嚗?* Dr. Wang<EFBFBD>喲𡡒靚<EFBFBD><EFBFBD><EFBFBD>
7. **结束:** Dr. Wang关闭调试模式
---
## 📚 相关文档
- `02-<EFBFBD>𡁶鍂<EFBFBD><EFBFBD><EFBFBD>07-餈鞱𨯫銝擧㦤<E693A7><E3A6A4><EFBFBD><E681A3>PRD_v2.1.md` - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘙?
- `02-<EFBFBD>𡁶鍂<EFBFBD><EFBFBD><EFBFBD>03-Prompt蝞∠<EFBFBD>蝟餌<EFBFBD>銝𡒊<EFBFBD>摨阡<EFBFBD><EFBFBD>挽霈⊥䲮獢?md` - 霂衣<EFBFBD>霈曇恣
- `02-通用能力层_07-运营与机构管理端PRD_v2.1.md` - 总体需求
- `02-通用能力层_03-Prompt管理系统与灰度预览设计方案.md` - 详细设计
- `00-权限与角色体系梳理报告_v1.0.md` - 架构梳理
---

View File

@@ -1,32 +1,35 @@
# **<EFBFBD>鞟內霂滨恣<EFBFBD><EFBFBD>頂蝏煺<EFBFBD><EFBFBD>煺漣<EFBFBD><EFBFBD><EFBFBD>啣漲憸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>航挽霈?*
# **提示词管理系统与生产环境灰度预览方案技术设计**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗?v1.1
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E695BA><EFBFBD>?
文档版本: v1.1
状态: 待开发
优先级: P1 (核心通用能力)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?<3F><EFBFBD>鈭?SAE (<28>煺漣<E785BA><EFBFBD>)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?Postgres-Only \+ Hot Reload \+ Preview Mode \+ RBAC
适用环境: 阿里云 SAE (生产环境)
核心架构: Postgres-Only \+ Hot Reload \+ Preview Mode \+ RBAC
## **1\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>艙嚗𡁏<EFBFBD><EFBFBD>煺漣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡏭<EFBFBD>蝥扳虜銋𣂼㦤<EFBFBD>?*
## **1\. 核心理念:把生产环境变成调试者的“超级游乐场”**
传统的开发流程是 开发环境 \-\> 测试环境 \-\> 生产环境。对于大模型应用LLM App这种流程存在致命缺陷**测试环境很难模拟真实的文献数据、复杂的上下文和 Token 消耗**。
本方案采用 **“生产环境灰度预览 (Production Preview Mode)”** 策略,并引入 **“调试者 (Debugger)”** 角色:
1. **代码与配置分离**Prompt 不再是硬编码的字符串,而是数据库中的动态配置。
2. **角色化调试 (RBAC)**:不局限于管理员,系统支持 **“调试者”**如临床专家、Prompt 工程师)角色。只要拥有 prompt:debug 权限,即可在生产环境开启调试模式。
3. **灰度路由**:系统根据当前操作者的身份(是否开启调试模式),动态决定加载 **“正式版 (Active)”** 还是 **“草稿版 (Draft)”** 的提示词。
4. **真实验证**:调试者可以直接使用生产环境的真实数据(如 ASL 的 20 篇文献)来验证新 Prompt 的效果,确认无误后一键发布。
隡删<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝔𧢲糓 撘<><E69298>𤑳㴓憓?\-\> 瘚贝<E7989A><E8B49D><EFBFBD> \-\> <20>煺漣<E785BA><EFBFBD><E887AC><EFBFBD>笆鈭𤾸之璅<E79285>摨𠉛鍂嚗𡿨LM App嚗㚁<E59A97>餈嗵<E9A488><EFBFBD><E7989A>摮睃銁<E79D83>游𦶢蝻粹萅嚗?*瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>𠗕璅⊥<E79285><E28AA5><EFBFBD><E7AC94><EFBFBD><EFBFBD><EFBFBD>格㺭<E6A0BC><EFBFBD><E69FB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD> Token 瘨<><E798A8>?*<2A>?
<EFBFBD>祆䲮獢<EFBFBD><EFBFBD><EFBFBD>?**<2A>𦦵<EFBFBD>鈭抒㴓憓<E3B493><E68693>摨阡<E691A8>閫?(Production Preview Mode)<29>?* 蝑𣇉裦嚗<E8A3A6>僎撘訫<E69298> **<EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD>?(Debugger)<29>?* 閫坿𠧧嚗?
1. **隞<><E99A9E>銝𡡞<E98A9D>蝵桀<E89DB5>蝳?*嚗䥪rompt 銝滚<E98A9D><E6BB9A>蝻𣇉<E89DBB><F0A38789><EFBFBD><EFBFBD>蝚虫葡嚗諹<E59A97>峕糓<E5B395>唳旿摨㮖葉<E3AE96><E89189>𢆡<EFBFBD><F0A286A1><EFBFBD>蝵柴<E89DB5>?
2. **閫坿𠧧<E59DBF>𤥁<EFBFBD>霂?(RBAC)**嚗帋<E59A97><EFBFBD><E69285>𣂷<EFBFBD>蝞∠<E89D9E><E288A0><EFBFBD>蝟餌<E89D9F><E9A48C><EFBFBD> **<EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD><EFBFBD><EFBFBD>?*嚗<><E59A97>銝游<E98A9D>銝枏振<E69E8F><E68CAF>rompt 撌亦<E6928C><EFBFBD><E692A3>閫坿𠧧<E59DBF><F0A0A7A7>蘨閬<E898A8>𥅾<EFBFBD>?prompt:debug <20><><EFBFBD><EFBFBD><EFBFBD>臬銁<E887AC>煺漣<E785BA><EFBFBD><EFBFBD><E69298><EFBFBD>霂閙芋撘譌<E69298>?
3. **<EFBFBD>啣漲頝舐眏**嚗𡁶頂蝏<E9A082><EFBFBD><EFBFBD><E6A180>齿<EFBFBD>雿𡏭<E99BBF><F0A18FAD><EFBFBD>頨思遢嚗<E981A2><EFBFBD><EFBFBD><E8A180><EFBFBD>霂閙芋撘𧶏<E69298><EFBFBD>𢆡<EFBFBD><F0A286A1><EFBFBD>摰𡁜<E691B0>頧?**<2A>𨀣迤撘讐<E69298> (Active)<29>?* 餈䀹糓 **<EFBFBD>𡏭<EFBFBD>蝔輻<EFBFBD> (Draft)<29>?* <20><><EFBFBD>蝷箄<E89DB7><E7AE84>?
4. **<EFBFBD><EFBFBD>撉諹<EFBFBD>**嚗朞<E59A97>霂閗<E99C82><E99697>虾隞亦凒<E4BAA6>乩蝙<E4B9A9><EFBFBD>鈭抒㴓憓<E3B493><E68693><EFBFBD><EFBFBD><E7AC94>唳旿嚗<E697BF><E59A97> ASL <20>?20 蝭<><E89DAD><EFBFBD><EFBFBD><E6AEB7>仿<EFBFBD><EFBFBD>鰵 Prompt <20><><EFBFBD><EFBFBD><EFBFBD>蝖株恕<E6A0AA>㰘秤<E3B098>𦒘<EFBFBD><F0A69298><EFBFBD><EFBFBD><E692A3>?
## **2\. 系统架构设计**
### **2.1 <EFBFBD><EFBFBD><EFBFBD>?*
### **2.1 架构图**
graph TD
User\[普通用户\] \--\>|请求业务| API\_Gateway
Debugger\[<EFBFBD><EFBFBD><EFBFBD>?銝枏振\] \--\>|霂瑟<EFBFBD>銝𡁜𦛚| API\_Gateway
Debugger\[调试者/专家\] \--\>|请求业务| API\_Gateway
Debugger \--\>|管理 Prompt| Admin\_Dashboard
subgraph "<EFBFBD><EFBFBD>鈭?SAE (<28>煺漣<E785BA><EFBFBD>)"
subgraph "阿里云 SAE (生产环境)"
API\_Gateway\[Nginx\] \--\> Backend\_App
subgraph "Node.js Backend Pods (憭𡁜<EFBFBD>靘?"
subgraph "Node.js Backend Pods (多实例)"
Backend\_App\[Backend Service\]
PromptService\[Prompt Service\]
@@ -34,7 +37,7 @@ graph TD
DebugSet\[调试会话集合 (Set)\]
Backend\_App \--\>|1. 获取 Prompt| PromptService
PromptService \--\>|2. <EFBFBD><EFBFBD>摮?DB| MemoryCache
PromptService \--\>|2. 查缓存/DB| MemoryCache
PromptService \--\>|3. 校验 Debug 权限| DebugSet
end
end
@@ -49,23 +52,25 @@ graph TD
DB \--\>|6. NOTIFY prompt\_update| PromptService
end
### **2.2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*
### **2.2 核心特性**
1. **Postgres-Only**:利用 PostgreSQL 的 LISTEN/NOTIFY 机制实现多实例缓存同步,无需引入 Redis。
2. **无状态设计**DebugSet 和 MemoryCache 均存储在内存中,配合数据库实现最终一致性。
3. **零侵入性**:普通用户完全感知不到 Prompt 正在被调整,只有开启了 Debug 模式的特定角色能看到变化。
1. **Postgres-Only**嚗𡁜⏚<F0A1819C>?PostgreSQL <20>?LISTEN/NOTIFY <20><EFBFBD>摰䂿緵憭𡁜<E686AD>靘讠<E99D98>摮睃<E691AE>甇伐<E79487><E4BC90>𣳇<EFBFBD>撘訫<E69298> Redis<69>?
2. **<EFBFBD>删𠶖<EFBFBD><EFBFBD>挽霈?*嚗鋽ebugSet <20>?MemoryCache <20><><EFBFBD><EFBFBD>典銁<E585B8><E98A81><EFBFBD>銝哨<E98A9D><E593A8><EFBFBD><E6BB9A>唳旿摨枏<E691A8><E69E8F><EFBFBD><EFBFBD><E89D8F><EFBFBD><EFBFBD><EFBFBD>?
3. **<EFBFBD>嗡噩<EFBFBD><EFBFBD>?*嚗𡁏芦<F0A1818F>𡁶鍂<F0A181B6><EFBFBD><E79195><EFBFBD><E586BD><EFBFBD><E4B9A9>?Prompt 甇<>銁鋡怨<E98BA1><E680A8><EFBFBD><E6B99B><EFBFBD><EFBFBD><E69298><EFBFBD> Debug 璅<E79285><E288AA><EFBFBD>鸌摰朞<E691B0><E69C9E><EFBFBD><E884B0><EFBFBD><E8A781><EFBFBD><E79D83>?
## **3\. 数据库与权限设计**
### **3.1 <EFBFBD>鞟內霂?Schema (capability\_schema)**
### **3.1 提示词 Schema (capability\_schema)**
请将以下 Schema 添加到 backend/prisma/schema.prisma 的 capability\_schema 部分。
霂瑕<EFBFBD>隞乩<EFBFBD> Schema 瘛餃<E7989B><E9A483>?backend/prisma/schema.prisma <20>?capability\_schema <20><EFBFBD><E585B8>?
// \--- Prompt Management System \---
model PromptTemplate {
id Int @id @default(autoincrement())
code String @unique // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝚佗<EFBFBD>憒?'ASL\_SCREENING\_TitleAbstract'
code String @unique // 唯一标识符,如 'ASL\_SCREENING\_TitleAbstract'
name String // 人类可读名称
module String // <EFBFBD><EFBFBD>撅墧芋<EFBFBD>? ASL, DC, AIA, IIT
module String // 所属模块: ASL, DC, AIA, IIT
description String?
variables Json? // 预期变量列表,如 \["title", "abstract"\]
@@ -81,8 +86,8 @@ model PromptTemplate {
model PromptVersion {
id Int @id @default(autoincrement())
templateId Int @map("template\_id")
version Int // <EFBFBD><EFBFBD>𧋦<EFBFBD>?1, 2, 3...
content String // <EFBFBD>鞟內霂滚<EFBFBD>摰?(Handlebars/Mustache <EFBFBD><EFBFBD>)
version Int // 版本号 1, 2, 3...
content String // 提示词内容 (Handlebars/Mustache 格式)
modelConfig Json? // 模型参数: { "temperature": 0.1, "model": "deepseek-chat" }
status PromptStatus @default(DRAFT)
changelog String? // 修改说明
@@ -100,7 +105,7 @@ model PromptVersion {
}
enum PromptStatus {
DRAFT // <EFBFBD>厩阮 (隞?Debug 璅<E79285><E288AA><EFBFBD>)
DRAFT // 草稿 (仅 Debug 模式可见)
ACTIVE // 线上生效 (默认可见)
ARCHIVED // 归档
@@ -109,15 +114,17 @@ enum PromptStatus {
### **3.2 权限定义 (platform\_schema)**
<EFBFBD>拍鍂<EFBFBD><EFBFBD><EFBFBD>?RBAC 蝟餌<E89D9F>嚗屸<E59A97><EFBFBD>銁 permissions 銵其葉憸<E89189>蔭隞乩<E99A9E><E4B9A9><EFBFBD><EFBFBD>嚗?
利用现有的 RBAC 系统,需要在 permissions 表中预置以下权限:
| 权限 Code | 描述 | 适用角色 |
| :---- | :---- | :---- |
| prompt:view | <EFBFBD><EFBFBD> Prompt <EFBFBD>𡑒”<EFBFBD>諹祕<EFBFBD>?| 蝞∠<E89D9E><E288A0>? 靚<><E99D9A><EFBFBD>?|
| prompt:edit | <EFBFBD>𥕦遣<EFBFBD>厩阮<EFBFBD><EFBFBD><EFBFBD>?Draft <20><>𧋦 | 蝞∠<E89D9E><E288A0>? 靚<><E99D9A><EFBFBD>?|
| **prompt:debug** | **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗𡁜<E59A97><F0A1819C>?<3F>喲𡡒靚<F0A1A192><E99D9A><E79285> | **蝞∠<EFBFBD><EFBFBD>? 靚<><E99D9A><EFBFBD>?* |
| prompt:publish | 撠?Draft <EFBFBD><EFBFBD>銝?Active | 蝞∠<EFBFBD><EFBFBD>? 韏<>楛靚<E6A59B><E99D9A><EFBFBD>?|
| prompt:view | 查看 Prompt 列表和详情 | 管理员, 调试者 |
| prompt:edit | 创建草稿、修改 Draft 版本 | 管理员, 调试者 |
| **prompt:debug** | **核心权限**:开启/关闭调试模式 | **管理员, 调试者** |
| prompt:publish | Draft 发布为 Active | 管理员, 资深调试者 |
建议创建一个新角色 **PROMPT\_ENGINEER**,赋予上述所有权限。
撱箄悅<EFBFBD>𥕦遣銝<EFBFBD>銝芣鰵閫坿𠧧 **PROMPT\_ENGINEER**嚗諹<E59A97><EFBFBD><E988AD>餈唳<E9A488><E594B3><EFBFBD><E39787><EFBFBD>?
## **4\. 后端核心实现 (PromptService)**
文件路径backend/src/common/capabilities/prompt/prompt.service.ts
@@ -125,41 +132,44 @@ enum PromptStatus {
### **4.1 核心逻辑**
* **setDebugMode(userId, enabled)**:
1. **<EFBFBD><EFBFBD>**嚗𡁻<E59A97><F0A181BB><EFBFBD><EFBFBD><EFBFBD>亥砲 userId <EFBFBD>臬炏<EFBFBD><EFBFBD> prompt:debug <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UserContext <EFBFBD>𡝗䰻摨橒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇𥅾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Debug <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗𡁜銁<F0A1819C><E98A81><EFBFBD>銝剔輕<E58994>?Set\<string\>嚗諹扇敶訫<E695B6><E8A8AB><EFBFBD><EFBFBD><E99D9A><E79285><E288AA><EFBFBD><EFBFBD>?ID<49>?
1. **鉴权**:首先检查该 userId 是否拥有 prompt:debug 权限(通过 UserContext 或查库)。只有拥有权限的用户允许加入 Debug 集合。
2. **状态维护**:在内存中维护 Set\<string\>,记录开启了调试模式的用户 ID。
* **get(code, variables, userId)**:
1. <EFBFBD><EFBFBD>?userId <EFBFBD>臬炏<EFBFBD>?debugUsers <EFBFBD><EFBFBD><EFBFBD>銝准<EFBFBD>?
2. **<EFBFBD>?*嚗帋<E59A97><E5B88B><EFBFBD>䰻霂<EFBCB8><EFBFBD>銝剔𠶖<E58994><F0A0B696>蛹 DRAFT <20><><EFBFBD><EFBFBD><EFBFBD><E59581><EFBFBD>?
3. **<EFBFBD>?*嚗<><E59A97><EFBFBD>?Draft嚗㚁<E59A97><E39A81>亥砭<E4BAA5><E7A0AD><EFBFBD>蝻枏<E89DBB>銝剔<E98A9D> ACTIVE <EFBFBD><EFBFBD>𧋦<EFBFBD>?
4. **蝻枏<EFBFBD><EFBFBD>芸𦶢銝?*嚗帋<E59A97><E5B88B>唳旿摨𤘪䰻霂?ACTIVE <20><>𧋦撟嗅<E6929F><E59785><EFBFBD>摮塩<E691AE>?
5. 雿輻鍂 Handlebars 皜脫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### **4.2 <20>剜凒<E5899C>?(Hot Reload)**
1. 检查 userId 是否在 debugUsers 集合中。
2. **是**:优先查询数据库中状态为 DRAFT 的最新版本。
3. **否**(或无 Draft查询内存缓存中的 ACTIVE 版本。
4. **缓存未命中**:从数据库查询 ACTIVE 版本并写入缓存。
5. 使用 Handlebars 渲染变量。
### **4.2 热更新 (Hot Reload)**
* 监听 Postgres 的 prompt\_update 频道。
* 收到通知后,清空内存缓存。
* <20>穃𨯬 Postgres <20>?prompt\_update 憸煾<E686B8><E785BE>?
* <20><EFBFBD><E59785>𡁶䰻<F0A181B6>𠬍<EFBFBD><EFBFBD><EFBFBD><E5BE81><EFBFBD>蝻枏<E89DBB><E69E8F>?
## **5\. API 接口设计**
### **5.1 蝞∠<EFBFBD>蝡舀𦻖<EFBFBD>?(PromptController)**
### **5.1 管理端接口 (PromptController)**
| 方法 | 路径 | 权限要求 | 描述 |
| :---- | :---- | :---- | :---- |
| GET | /api/admin/prompts | prompt:view | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?Prompt 璅⊥踎<EFBFBD>𡑒” |
| GET | /api/admin/prompts/:id | prompt:view | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>璅⊥踎霂行<EFBFBD><EFBFBD>𠰴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| GET | /api/admin/prompts | prompt:view | 获取所有 Prompt 模板列表 |
| GET | /api/admin/prompts/:id | prompt:view | 获取特定模板详情及历史版本 |
| POST | /api/admin/prompts/draft | prompt:edit | 保存草稿 (生成新版本,状态为 DRAFT) |
| POST | /api/admin/prompts/publish | prompt:publish | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦 (<28><EFBFBD>?Draft \-\> Active) |
| POST | /api/admin/prompts/debug | **prompt:debug** | **<EFBFBD><EFBFBD><EFBFBD>霂閙芋撘?* ({ enabled: true }) |
| POST | /api/admin/prompts/publish | prompt:publish | 发布版本 (状态 Draft \-\> Active) |
| POST | /api/admin/prompts/debug | **prompt:debug** | **开关调试模式** ({ enabled: true }) |
### **5.2 业务集成示例 (ASL 模块)**
<EFBFBD>?ASL <EFBFBD>銝剛<EFBFBD><EFBFBD>?Prompt <20><EFBFBD>**敹<>◆隡惩<E99AA1> userId**嚗𣬚頂蝏煺<E89D8F><E785BA>芸𢆡憭<F0A286A1><E686AD><EFBFBD>啣漲<E595A3><EFBFBD>嚗?
ASL 模块中调用 Prompt 时,**必须传入 userId**,系统会自动处理灰度逻辑:
// backend/src/modules/asl/services/screening.service.ts
import { promptService } from '@/common/capabilities/prompt/prompt.service';
export class ScreeningService {
async screenPaper(paper: any, userId: string) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?Prompt
// <EFBFBD><EFBFBD> userId <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈䠷<EFBFBD>隡朞䌊<EFBFBD>冽嚉<EFBFBD>?DRAFT <EFBFBD>?Prompt
// 动态获取 Prompt
// 如果 userId 是开启了调试模式的“调试者”,这里会自动拿到 DRAFT Prompt
const prompt \= await promptService.get(
'ASL\_SCREENING\_TitleAbstract',
{ title: paper.title, abstract: paper.abstract },
@@ -171,48 +181,55 @@ export class ScreeningService {
}
}
## **6\. <EFBFBD>滨垢蝞∠<EFBFBD>蝡航挽霈?(Frontend-V2)**
## **6\. 前端管理端设计 (Frontend-V2)**
在 frontend-v2/src/modules/admin 下新增 Prompt 管理模块。
<EFBFBD>?frontend-v2/src/modules/admin 銝𧢲鰵憓?Prompt 蝞∠<E89D9E><E79285><E288AA>?
### **6.1 界面功能**
1. **<EFBFBD>𡑒”憿?*嚗𡁜<E59A97>蝷箸<E89DB7><E7AEB8>?Prompt 璅⊥踎<EFBFBD>?
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗?
* **雿滨蔭**嚗𡁶<E59A97><F0A181B6><EFBD81>典紡<E585B8><EFBFBD><E88AA3>硋𢰧銝贝<E98A9D><E8B49D>祆筑<E7A586><E7AD91><EFBFBD>?
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗帋<E59A97>敶梶鍂<E6A2B6>瑟𥅾<E7919F>?prompt:debug <20><><EFBFBD><EFBFBD>嗆遬蝷箄砲撘<E7A0B2><E69298><EFBFBD>?
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>擐?*嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><E59A97>蝡䠷▲<E4A0B7>典枂<E585B8><EFBFBD><E59C88>脰郎<E884B0>𦠜辺嚗尠<E59A97><EFBFBD>儭?靚<><E99D9A><E79285>撌脣<E6928C><E884A3><EFBFBD><E88D94><EFBFBD><E585B8>齿迤<E9BDBF>其蝙<E585B6><EFBFBD>蝔輻<E89D94> (DRAFT) <20>鞟內霂滩<E99C82>銵峕<E98AB5>雿鎿<E99BBF><EFBFBD>?
3. **蝻𤥁<EFBFBD><EFBFBD>?*嚗?
* <EFBFBD><EFBFBD> Markdown 擃䀝漁<EFBFBD>?
* <EFBFBD><EFBFBD><EFBFBD>𤩺覔<EFBFBD><EFBFBD><EFBFBD>𣂼𢆡<EFBFBD><EFBFBD>遬蝷綽<EFBFBD><EFBFBD><EFBFBD>瘝⊥<EFBFBD> prompt:publish <20><><EFBFBD><EFBFBD><E59A97><EFBFBD>𨅯<EFBFBD><EFBFBD><E692A3><EFBFBD><E884B2>桃蔭<E6A183><EFBFBD>?
### **6.2 <20><EFBFBD>撌乩<E6928C>瘚?(Workflow)**
1. **列表页**:展示所有 Prompt 模板。
2. **全局调试开关**
* **位置**:界面顶部导航栏或右下角悬浮球。
* **权限控制**:仅当用户拥有 prompt:debug 权限时显示该开关。
* **状态反馈**:开启后,全站顶部出现黄色警告条:“⚠️ 调试模式已开启:您当前正在使用草稿版 (DRAFT) 提示词进行操作”。
3. **编辑器**
* 支持 Markdown 高亮。
* 操作栏根据权限动态显示:如果没有 prompt:publish 权限,则“发布”按钮置灰。
### **6.2 典型工作流 (Workflow)**
1. **场景**:临床专家 Dr. Wang (角色: Debugger) 觉得文献筛选的准确率不够。
2. **修改**Dr. Wang 登录系统,进入 Prompt 管理页,修改 ASL\_SCREENING 的提示词,增加了一条排除标准,点击“保存草稿”。
3. **调试**Dr. Wang 点击顶部的 **“开启调试模式”**。
4. **验证**Dr. Wang 切换到 ASL 业务页面,上传几篇之前筛错的文献,点击运行。
* *系统后端检测到 Dr. Wang 在 Debug 列表中,加载 Draft 版 Prompt。*
5. **确认**:发现结果正确了。
6. **发布**Dr. Wang 回到管理页,点击“发布”(或者通知管理员发布)。
7. **结束**Dr. Wang 关闭调试模式。
1. **<EFBFBD>箸艶**嚗帋葩摨𠹺<E691A8>摰?Dr. Wang (閫坿𠧧: Debugger) 閫匧<E996AB><E58CA7><EFBFBD>讃蝑偦<E89D91><EFBFBD><E58EA9><EFBFBD><EFBFBD><EFBC86><EFBFBD>憭麄<E686AD>?
2. **靽格㺿**嚗鋽r. Wang <20><EFBFBD>蝟餌<E89D9F>嚗諹<E59A97><E8ABB9>?Prompt 蝞∠<E89D9E>憿蛛<E686BF>靽格㺿 ASL\_SCREENING <20><><EFBFBD>蝷箄<E89DB7><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><E98A9D><EFBFBD><E28AA5><EFBFBD><E69697><EFBFBD><EFBFBD><EFBFBD>孵稬<E5ADB5><EFBFBD>摮䁅<E691AE>蝔踱<E89D94><EFBFBD>?
3. **靚<><E99D9A>**嚗鋽r. Wang <20>孵稬憿園<E686BF><E59C92>?**<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>霂閙芋撘謿<EFBFBD>?*<2A>?
4. **撉諹<E69289>**嚗鋽r. Wang <20><><EFBFBD>?ASL 銝𡁜𦛚憿菟𢒰嚗䔶<E59A97>隡惩<E99AA1><EFBFBD><E89DAD><EFBFBD><EFBFBD><E6BBA8><EFBFBD><E597B5><EFBFBD>讃嚗𣬚<E59A97><F0A3AC9A><EFBFBD>銵䎚<E98AB5>?
* *蝟餌<E89D9F><E9A48C>𡒊垢璉<E59EA2>瘚见<E7989A> Dr. Wang <20>?Debug <20>𡑒”銝哨<E98A9D><E593A8>㰘蝸 Draft <20>?Prompt<70>?
5. **蝖株恕**嚗𡁜<E59A97><F0A1819C><EFBFBD><E59581>𨀣迤蝖桐<E89D96><E6A190>?
6. **<EFBFBD><EFBFBD>**嚗鋽r. Wang <20>𧼮<EFBFBD>蝞∠<E89D9E>憿蛛<E686BF><E89B9B>孵稬<E5ADB5>𨅯<EFBFBD><EFBFBD><E692A3><EFBFBD><E59885>𤥁<EFBFBD><F0A4A581><EFBFBD>𡁶䰻蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD><E692A3><EFBFBD>?
7. **蝏𤘪<E89D8F>**嚗鋽r. Wang <20>喲𡡒靚<F0A1A192><E99D9A><E79285><E288AA>?
## **7\. 实施计划**
### **Phase 1: <EFBFBD><EFBFBD>霈暹鴌撱箄挽 (1-2憭?**
### **Phase 1: 基础设施建设 (1-2天)**
1. <EFBFBD>𥕦遣<EFBFBD>唳旿摨栞” prompt\_templates, prompt\_versions<EFBFBD>?
2. <EFBFBD>?permissions 銵其葉<EFBFBD><EFBFBD> prompt:\* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
3. 摰䂿緵 PromptService <EFBFBD>𡒊垢<EFBFBD><EFBFBD><EFBFBD>?
### **Phase 2: 銝𡁜𦛚璅<E79285><E288AA><EFBFBD> (<28>?ASL 撘<><E69298><EFBFBD>甇?**
1. 创建数据库表 prompt\_templates, prompt\_versions
2. permissions 表中插入 prompt:\* 相关权限。
3. 实现 PromptService 后端逻辑。
1. <20><EFBFBD><E585B8>?ASL 璅<E79285><E288AA><EFBFBD><E5A19A><EFBFBD> promptService.get() <20><EFBFBD> Prompt<70>?
### **Phase 3: 蝞∠<E89D9E>蝡?MVP (3-4憭?**
### **Phase 2: 业务模块接入 (随 ASL 开发同步)**
1. <EFBFBD><EFBFBD><EFBFBD>蝡舐恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. 摰䂿緵<E482BF><EFBFBD><EFBFBD><E99D9A><EFBFBD><E69298><EFBFBD>隞嗚<E99A9E>?
## **8\. 摰匧<E691B0>銝𡡞<E98A9D><F0A1A19E>?*
1. 在开发 ASL 模块时,通过 promptService.get() 获取 Prompt。
### **Phase 3: 管理端 MVP (3-4天)**
1. 开发前端管理界面。
2. 实现全局调试开关组件。
## **8\. 安全与风控**
1. **权限隔离**:严格检查 prompt:debug 权限,防止普通用户误入调试模式。
2. **审计日志**PromptVersion 表中的 createdBy 字段必须记录实际修改人的 ID便于追溯是哪位调试者修改了 Prompt。
3. **兜底机制**:代码中保留 Hardcoded Prompt 作为系统级兜底。
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𠉛氖**嚗帋艇<E5B88B><EFBFBD><E6BDAD>?prompt:debug <20><><EFBFBD>嚗屸俈甇<EFBCB8>𡁶鍂<F0A181B6>瑁秤<E79181><EFBFBD>霂閙芋撘譌<E69298>?
2. **摰∟恣<E2889F><EFBFBD>**嚗䥪romptVersion 銵其葉<E585B6>?createdBy 摮埈挾敹<E68CBE>◆霈啣<E99C88>摰鮋<E691B0>靽格㺿鈭箇<E988AD> ID嚗䔶噶鈭舘蕭皞舀糓<E88880><EFBFBD><EFBFBD><E99D9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Prompt<70>?
3. **<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>**嚗帋誨<E5B88B><E8AAA8>葉靽萘<E99DBD> Hardcoded Prompt 雿靝蛹蝟餌<E89D9F>蝥批<E89DA5>摨𨰻<E691A8>?
## **9\. 结论**
撘訫<EFBFBD> **<EFBFBD>𡏭<EFBFBD>霂閗<EFBFBD><EFBFBD><EFBFBD>?* 閫坿𠧧<E59DBF>?RBAC <20><EFBFBD>嚗䔶蝙敺𡑒砲<F0A19192><EFBFBD>銝滢<E98A9D><E6BBA2><EFBFBD>銝芣<E98A9D><E88AA3><EFBFBD><E887AC><EFBFBD><E5A086>湔糓銝<E7B393>憟堒<E6869F><E5A092><EFBFBD> **AIOps <20><EFBFBD><EFBFBD><E7989A>**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>捂銝𡁜𦛚銝枏振<EFBFBD><EFBFBD>撟脫贋蝥蹂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣂷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡠺蝡见𧑐撖?AI <20><><EFBFBD>餈𥡝<E9A488><EFBFBD><E99D9A><EFBFBD><E59A97>蝢𡡞<E89DA2><F0A1A19E><EFBFBD><EFBFBD><EFBFBD><E9A48C>箸艶撖孵<E69296>蝖格<E89D96><EFBFBD>擃䁅<E69383><EFBFBD><E79899>
引入 **“调试者”** 角色和 RBAC 机制,使得该方案不仅是一个技术实现,更是一套完整的 **AIOps 协作流程**。它允许业务专家在不干扰线上用户的前提下,安全、独立地对 AI 效果进行调优,完美适配医疗场景对准确性的高要求。