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:
@@ -4,13 +4,14 @@
|
||||
| :---- | :---- |
|
||||
| **对应 PRD** | **PRD\_工具B\_病历结构化机器人\_V2.md** |
|
||||
| **版本** | **V2.0** (架构升级:双模型交叉验证) |
|
||||
| **<EFBFBD>嗆<EFBFBD>?* | Draft |
|
||||
| **<EFBFBD>詨<EFBFBD><EFBFBD>格<EFBFBD>** | <EFBFBD><EFBFBD>遣銝<EFBFBD>銝芷<EFBFBD><EFBFBD>臭縑摨衣<EFBFBD><EFBFBD>餌<EFBFBD><EFBFBD><EFBFBD>𧋦蝏𤘪<EFBFBD><EFBFBD>硋<EFBFBD><EFBFBD>𠬍<EFBFBD><EFBFBD>朞<EFBFBD>**<2A>峕芋<E5B395>页<EFBFBD>DeepSeek & Qwen嚗匧僎<E58CA7>烐<EFBFBD><E78390>?*銝?*<2A>芸𢆡鈭文<E988AD>撉諹<E69289>**嚗諹圾<E8ABB9>?AI 撟餉<E6929F><E9A489>桅<EFBFBD><E6A185>?|
|
||||
| **状态** | Draft |
|
||||
| **核心目标** | 构建一个高可信度的医疗文本结构化引擎,通过**双模型(DeepSeek & Qwen)并发提取**与**自动交叉验证**,解决 AI 幻觉问题。 |
|
||||
|
||||
## **1\. 总体架构设计 (Architecture Overview)**
|
||||
|
||||
蝟餌<EFBFBD><EFBFBD>嗆<EFBFBD>隞𢛶<EFBFBD>𨅯<EFBFBD>蝥踵<EFBFBD>扳<EFBFBD>瘞渡瑪<EFBFBD>嘥<EFBFBD>蝥找蛹 **<EFBFBD>陖<EFBFBD>见僎<EFBFBD>烐<EFBFBD>瘞渡瑪<EFBFBD>?*<2A><>㺭<EFBFBD>株<EFBFBD><E6A0AA>亙<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>𤑳<EFBFBD>銝支葵銝滚<E98A9D><E6BB9A>?LLM 璅∪<E79285>撟嗉<E6929F>憭<EFBFBD><E686AD>嚗𣬚<E59A97><F0A3AC9A>𨀣<EFBFBD><F0A880A3>𡁜<EFBFBD><F0A1819C>𨅯<EFBFBD>蝒<EFBFBD><E89D92>瘚见<E7989A><E8A781>𢛶<EFBFBD>肽<EFBFBD>銵峕<E98AB5>撖對<E69296><E5B08D><EFBFBD><EFBFBD>舘<EFBFBD><E88898>箏<EFBFBD>鈭箏極撉諹<E69289>蝵烐聢<E78390>?
|
||||
### **1.1 蝟餌<E89D9F><E9A48C>嗆<EFBFBD><E59786>?*
|
||||
系统架构从“单线性流水线”升级为 **“Y型并发流水线”**。数据进入后,分发给两个不同的 LLM 模型并行处理,结果汇聚到“冲突检测引擎”进行比对,最后输出到人工验证网格。
|
||||
|
||||
### **1.1 系统架构图**
|
||||
|
||||
graph TD
|
||||
Client\[React 前端 (Grid & Drawer UI)\]
|
||||
@@ -45,45 +46,50 @@ graph TD
|
||||
Orchestrator \--4.脱敏--\> PII\_Engine
|
||||
PII\_Engine \--5.并行调用--\> ClientA & ClientB
|
||||
ClientA & ClientB \--6.返回JSON--\> CrossValidator
|
||||
CrossValidator \--7.霈∠<EFBFBD>銝<EFBFBD><EFBFBD>湔<EFBFBD>?-\> PG
|
||||
CrossValidator \--7.计算一致性--\> PG
|
||||
Client \--8.拉取网格数据--\> VerifyAPI
|
||||
VerifyAPI \--9.人工裁决--\> PG
|
||||
|
||||
## **2\. 技术选型 (Tech Stack)**
|
||||
|
||||
| 撅<EFBFBD>漣 | <20><><EFBFBD>舐<EFBFBD>隞?| <20>匧<EFBFBD><E58CA7><EFBFBD>眏 |
|
||||
| 层级 | 技术组件 | 选型理由 |
|
||||
| :---- | :---- | :---- |
|
||||
| **<EFBFBD>𡒊垢獢<EFBFBD>沲** | **Fastify 5.x** | 擃䀹<EFBFBD>扯<EFBFBD>撘<EFBFBD>郊 I/O嚗屸<E59A97><E5B1B8><EFBFBD>憭<EFBFBD><E686AD>擃睃僎<E79D83>烐芋<E78390>贝<EFBFBD><E8B49D>具<EFBFBD>?|
|
||||
| **璅∪<EFBFBD><EFBFBD>亙<EFBFBD>** | **LangChain.js** | 蝏煺<EFBFBD>撠<EFBFBD><EFBFBD> DeepSeek <EFBFBD>?Qwen <EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽𦻖<EFBFBD><EFBFBD><EFBFBD>靘蹂<EFBFBD><EFBFBD><EFBFBD>揢璅∪<EFBFBD><EFBFBD>?|
|
||||
| **隞餃𦛚<EFBFBD>笔<EFBFBD>** | **BullMQ** | <EFBFBD>詨<EFBFBD>蝏<EFBFBD>辣<EFBFBD><EFBFBD>2 <20><>閬<EFBFBD>⏚<EFBFBD>?Flow <20>蠘<EFBFBD><E8A098>𡝗<EFBFBD><F0A19D97>函<EFBFBD><E587BD>埝䔉摰䂿緵<E482BF>𦦵<EFBFBD>敺<EFBFBD>舅銝芣芋<E88AA3>钅<EFBFBD>餈𥪜<E9A488><F0A5AA9C>萘<EFBFBD><E89098>餉<EFBFBD><E9A489>?|
|
||||
| **<EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚?* | **Lodash (<EFBFBD>箇<EFBFBD>) \+ Dice Coefficient (餈偦𧫴)** | <EFBFBD>其<EFBFBD>瘥𥪜笆銝支葵 JSON 撖寡情<E5AFA1><E68385><EFBFBD>畾萄榆撘<E6A686><E69298><EFBFBD><EFBFBD><EFBFBD>祉㮾隡澆漲<E6BE86>臭蝙<E887AD>函<EFBFBD><E587BD>閧<EFBFBD> Dice 蝟餅㺭<EFBFBD>?Levenshtein 頝萘氖嚗峕<EFBFBD>銝漤<EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>见<EFBFBD><EFBFBD>誩<EFBFBD><EFBFBD>?|
|
||||
| **<EFBFBD>唳旿摨?* | **PostgreSQL 15** | 摮睃<EFBFBD> JSONB <EFBFBD>澆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>璅∪<EFBFBD>蝏𤘪<EFBFBD><EFBFBD>?|
|
||||
| **<EFBFBD>滨垢鈭支<EFBFBD>** | **React \+ TanStack Table** | V2 <EFBFBD>嫣蛹<EFBFBD>冽艶蝵烐聢嚗峕㺭<EFBFBD>桅<EFBFBD>憭扳𧒄<EFBFBD><EFBFBD>閬?TanStack Table (Headless) <EFBFBD>滚<EFBFBD><EFBFBD>𡁏<EFBFBD>皛𡁜𢆡<EFBFBD>?|
|
||||
| **后端框架** | **Fastify 5.x** | 高性能异步 I/O,适合处理高并发模型调用。 |
|
||||
| **模型接入** | **LangChain.js** | 统一封装 DeepSeek 和 Qwen 的调用接口,便于切换模型。 |
|
||||
| **任务队列** | **BullMQ** | 核心组件。V2 需要利用 Flow 功能或手动编排来实现“等待两个模型都返回”的逻辑。 |
|
||||
| **冲突检测** | **Lodash (基础) \+ Dice Coefficient (进阶)** | 用于比对两个 JSON 对象的字段差异。文本相似度可使用简单的 Dice 系数或 Levenshtein 距离,暂不需要重型向量库。 |
|
||||
| **数据库** | **PostgreSQL 15** | 存储 JSONB 格式的双模型结果。 |
|
||||
| **前端交互** | **React \+ TanStack Table** | V2 改为全景网格,数据量大时需要 TanStack Table (Headless) 配合虚拟滚动。 |
|
||||
|
||||
## **3\. 核心流程设计 (Core Logic)**
|
||||
|
||||
### **3.1 智能体检 (Health Check Logic)**
|
||||
|
||||
* **閫血<EFBFBD><EFBFBD>嗆㦤嚗?* <20>冽<EFBFBD><E586BD>典<EFBFBD>蝡舫<E89DA1>㗇𥋘<E39787>𨀣<EFBFBD><F0A880A3>砍<EFBFBD><E7A08D>萘<EFBFBD><E89098>祇𡢿<E7A587>?
|
||||
* **<EFBFBD>扯<EFBFBD><EFBFBD>餉<EFBFBD>嚗?*
|
||||
1. <EFBFBD>𡒊垢霂餃<EFBFBD>霂亙<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 100 銵䕘<E98AB5>銝滩粉<E6BBA9>券<EFBFBD>嚗剹<E59A97>?
|
||||
2. 霈∠<EFBFBD>蝏蠘恣<EFBFBD><EFBFBD><EFBFBD>嚗?
|
||||
* emptyRate: 蝛箏<EFBFBD>?/ <20>餉<EFBFBD><E9A489>啜<EFBFBD>?
|
||||
* avgLength: <EFBFBD>䂿征銵𣬚<EFBFBD>撟喳<EFBFBD>摮㛖泵<EFBFBD>啜<EFBFBD>?
|
||||
3. **<EFBFBD>行⏛蝑𣇉裦嚗?* <20>?emptyRate \> 0.8 <EFBFBD>?avgLength \< 10嚗諹<EFBFBD><EFBFBD>?status: 'BAD'<EFBFBD>?
|
||||
4. **Token 憸<EFBFBD>摯嚗?* totalRows \* avgLength \* 1.5 (蝎㛖裦隡啁<EFBFBD>)<29>?
|
||||
### **3.2 <20>𣬚𤩅<F0A3AC9A>𣂼<EFBFBD>銝𦒘漱<F0A69298>厰<EFBFBD>霂?(Double-Blind & Validation)**
|
||||
* **触发时机:** 用户在前端选择“文本列”的瞬间。
|
||||
* **执行逻辑:**
|
||||
1. 后端读取该列的前 100 行(不读全量)。
|
||||
2. 计算统计指标:
|
||||
* emptyRate: 空值 / 总行数。
|
||||
* avgLength: 非空行的平均字符数。
|
||||
3. **拦截策略:** 若 emptyRate \> 0.8 或 avgLength \< 10,返回 status: 'BAD'。
|
||||
4. **Token 预估:** totalRows \* avgLength \* 1.5 (粗略估算)。
|
||||
|
||||
餈蹱糓 V2 <20><><EFBFBD><EFBFBD>譌<EFBFBD>?
|
||||
#### **A. <20>鞟內霂滚極蝔?(Prompt Engineering)**
|
||||
### **3.2 双盲提取与交叉验证 (Double-Blind & Validation)**
|
||||
|
||||
这是 V2 的心脏。
|
||||
|
||||
#### **A. 提示词工程 (Prompt Engineering)**
|
||||
|
||||
为了方便比对,必须强制两个模型输出**完全一致的 JSON 结构**。
|
||||
|
||||
銝箔<EFBFBD><EFBFBD>嫣噶瘥𥪜笆嚗<EFBFBD><EFBFBD>憿餃撩<EFBFBD>嗡舅銝芣芋<EFBFBD>贝<EFBFBD><EFBFBD>?*摰<><E691B0>銝<EFBFBD><E98A9D>渡<EFBFBD> JSON 蝏𤘪<E89D8F>**<2A>?
|
||||
* **System Prompt:** "You are a medical structural extraction assistant..."
|
||||
* **Constraint:** "Output strictly in JSON format. Keys must be: \['tumor\_size', 'lymph\_node', ...\]."
|
||||
* **Temperature:** 霈曆蛹 0嚗諹蕭瘙<E895AD><E79899>憭抒&摰𡁏<E691B0>扼<EFBFBD>?
|
||||
* **Temperature:** 设为 0,追求最大确定性。
|
||||
|
||||
#### **B. 交叉验证算法 (The Judge)**
|
||||
|
||||
敶?Model A (DeepSeek) <EFBFBD>?Model B (Qwen) 餈𥪜<EFBFBD>蝏𤘪<EFBFBD><EFBFBD>𠬍<EFBFBD><EFBFBD>扯<EFBFBD>瘥𥪜笆嚗?
|
||||
当 Model A (DeepSeek) 和 Model B (Qwen) 返回结果后,执行比对:
|
||||
|
||||
function validate(jsonA, jsonB) {
|
||||
const conflicts \= \[\];
|
||||
const keys \= Object.keys(jsonA);
|
||||
@@ -95,10 +101,10 @@ function validate(jsonA, jsonB) {
|
||||
// 1\. 精确匹配
|
||||
if (valA \=== valB) continue;
|
||||
|
||||
// 2\. <EFBFBD>啣<EFBFBD>澆<EFBFBD>銝<EFBFBD><EFBFBD>硋龪<EFBFBD>?(憒?"3cm" vs "3.0cm")
|
||||
// 2\. 数值归一化匹配 (如 "3cm" vs "3.0cm")
|
||||
if (isNumber(valA) && isNumber(valB) && parse(valA) \=== parse(valB)) continue;
|
||||
|
||||
// 3\. (<EFBFBD>舫<EFBFBD>? 霂凋<E99C82><E5878B>訾撮摨血龪<E8A180>?
|
||||
// 3\. (可选) 语义相似度匹配
|
||||
// if (similarity(valA, valB) \> 0.95) continue;
|
||||
|
||||
conflicts.push(key);
|
||||
@@ -107,12 +113,13 @@ function validate(jsonA, jsonB) {
|
||||
return conflicts.length \=== 0 ? 'CLEAN' : 'CONFLICT';
|
||||
}
|
||||
|
||||
## **4\. <EFBFBD>唳旿摨栞挽霈?(Database Schema)**
|
||||
## **4\. 数据库设计 (Database Schema)**
|
||||
|
||||
V2 需要存储两份 AI 结果以及用户的裁决结果。
|
||||
|
||||
V2 <20><>閬<EFBFBD><E996AC><EFBFBD>其舅隞?AI 蝏𤘪<E89D8F>隞亙<E99A9E><E4BA99>冽<EFBFBD><E586BD><EFBFBD><EFBFBD><EFBFBD>喟<EFBFBD><E5969F>栶<EFBFBD>?
|
||||
### **Prisma Schema 更新**
|
||||
|
||||
// 隞餃𦛚銵?
|
||||
// 任务表
|
||||
model ExtractionJob {
|
||||
id String @id @default(uuid())
|
||||
// ...其他字段
|
||||
@@ -121,7 +128,7 @@ model ExtractionJob {
|
||||
targetFields Json // 目标字段定义 \[{name: "肿瘤大小", desc: "..."}\]
|
||||
}
|
||||
|
||||
// <EFBFBD>閗<EFBFBD>霈啣<EFBFBD>銵?
|
||||
// 单行记录表
|
||||
model ExtractionItem {
|
||||
id String @id @default(uuid())
|
||||
jobId String
|
||||
@@ -131,47 +138,51 @@ model ExtractionItem {
|
||||
resultA Json? // DeepSeek 结果 { "size": "3cm" }
|
||||
resultB Json? // Qwen 结果 { "size": "3.0 cm" }
|
||||
|
||||
// <EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚讠<EFBFBD><EFBFBD>?
|
||||
// 冲突检测结果
|
||||
status ItemStatus // PENDING, CLEAN, CONFLICT, RESOLVED
|
||||
conflictFields String\[\] // \["size"\] 霈啣<EFBFBD><EFBFBD>芯<EFBFBD>摮埈挾<EFBFBD>脩<EFBFBD>鈭?
|
||||
conflictFields String\[\] // \["size"\] 记录哪些字段冲突了
|
||||
|
||||
// <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝥喟<EFBFBD><EFBFBD>?(<28>冽<EFBFBD>鋆<EFBFBD><E98B86><EFBFBD>𤾸<EFBFBD><F0A4BEB8>伐<EFBFBD><E4BC90>𤥁<EFBFBD><F0A4A581><EFBFBD><EFBFBD>湔𧒄<E6B994>芸𢆡<E88AB8>坔<EFBFBD>)
|
||||
// 最终采纳结果 (用户裁决后写入,或者一致时自动写入)
|
||||
finalResult Json?
|
||||
}
|
||||
|
||||
## **5\. 接口设计 (API Endpoints)**
|
||||
|
||||
### **5.1 璅∠<EFBFBD>銝𡡞<EFBFBD>蝵?*
|
||||
### **5.1 模版与配置**
|
||||
|
||||
* GET /api/templates: 获取预设的疾病和报告模版列表。
|
||||
* POST /api/jobs: 创建任务,Payload 中需包含 diseaseType 和 reportType,便于后端组装 Prompt。
|
||||
|
||||
* GET /api/templates: <20>瑕<EFBFBD>憸<EFBFBD>挽<EFBFBD><E68CBD>𪆴<EFBFBD><F0AA86B4><EFBFBD><EFBFBD>亙<EFBFBD>璅∠<E79285><E288A0>𡑒”<F0A19192>?
|
||||
* POST /api/jobs: <20>𥕦遣隞餃𦛚嚗釶ayload 銝剝<E98A9D><E5899D><EFBFBD>鉄 diseaseType <20>?reportType嚗䔶噶鈭𤾸<E988AD>蝡舐<E89DA1>鋆?Prompt<70>?
|
||||
### **5.2 网格验证 (Grid Verification)**
|
||||
|
||||
* GET /api/jobs/:id/rows: <EFBFBD><EFBFBD>△<EFBFBD>瑕<EFBFBD>撉諹<EFBFBD><EFBFBD>唳旿<EFBFBD>?
|
||||
* **Response:** 餈𥪜<EFBFBD> originalText, resultA, resultB, conflictFields<EFBFBD>?
|
||||
* POST /api/items/:id/resolve: <EFBFBD>閗<EFBFBD>鋆<EFBFBD><EFBFBD><EFBFBD>?
|
||||
* **Payload:** { field: "tumor\_size", chosenValue: "3cm" }<EFBFBD>?
|
||||
* **Logic:** <EFBFBD>湔鰵 finalResult嚗<EFBFBD><EFBFBD><EFBFBD>𡏭砲銵峕<EFBFBD><EFBFBD>匧<EFBFBD>蝒<EFBFBD><EFBFBD>畾菟<EFBFBD>撌脰圾<EFBFBD>喉<EFBFBD>撠?status <EFBFBD>湔鰵銝?RESOLVED<EFBFBD>?
|
||||
* GET /api/jobs/:id/rows: 分页获取验证数据。
|
||||
* **Response:** 返回 originalText, resultA, resultB, conflictFields。
|
||||
* POST /api/items/:id/resolve: 单行裁决。
|
||||
* **Payload:** { field: "tumor\_size", chosenValue: "3cm" }。
|
||||
* **Logic:** 更新 finalResult,如果该行所有冲突字段都已解决,将 status 更新为 RESOLVED。
|
||||
|
||||
## **6\. 前端详细设计 (Frontend)**
|
||||
|
||||
### **6.1 全景验证网格 (Verification Grid)**
|
||||
|
||||
* **蝏<EFBFBD>辣<EFBFBD>匧<EFBFBD>嚗?* 靘萘<E99D98><E89098>刻<EFBFBD> **TanStack Table** (<EFBFBD>餉<EFBFBD>撅? \+ **UI 蝏<EFBFBD>辣摨?* (皜脫<E79A9C>撅?<3F>?
|
||||
* **组件选型:** 依然推荐 **TanStack Table** (逻辑层) \+ **UI 组件库** (渲染层)。
|
||||
* **冲突单元格渲染:**
|
||||
* 敶?conflictFields.includes(column.id) <EFBFBD>塚<EFBFBD><EFBFBD>訫<EFBFBD><EFBFBD>潭葡<EFBFBD>㮖蛹**撖寞<E69296>璅∪<E79285>**<2A>?
|
||||
* <EFBFBD>曄內銝支葵撠𤩺<EFBFBD><EFBFBD>殷<EFBFBD>\[DS: 3cm\] <EFBFBD>?\[QW: 3.0cm\]<EFBFBD>?
|
||||
* <EFBFBD>冽<EFBFBD><EFBFBD>孵稬隞颱<EFBFBD><EFBFBD>厰僼嚗諹圻<EFBFBD>?resolve API嚗<49><E59A97>蝡臭<E89DA1>閫<EFBFBD>凒<EFBFBD>堆<EFBFBD>Optimistic Update嚗劐蛹<EFBFBD>劐葉<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>?
|
||||
### **6.2 靘扯器<E689AF>誩<EFBFBD><E8AAA9>?(Context Drawer)**
|
||||
* 当 conflictFields.includes(column.id) 时,单元格渲染为**对比模式**。
|
||||
* 显示两个小按钮:\[DS: 3cm\] 和 \[QW: 3.0cm\]。
|
||||
* 用户点击任一按钮,触发 resolve API,前端乐观更新(Optimistic Update)为选中状态。
|
||||
|
||||
### **6.2 侧边栏原文 (Context Drawer)**
|
||||
|
||||
* **触发:** 点击表格行的空白处或“查看原文”图标。
|
||||
* **功能:** 展示 originalText。
|
||||
* **高亮优化:** 简单实现 String.indexOf 查找当前字段的值并标黄。
|
||||
|
||||
* **閫血<E996AB>嚗?* <20>孵稬銵冽聢銵𣬚<E98AB5>蝛箇蒾憭<E892BE><E686AD><EFBFBD>𨀣䰻<F0A880A3>见<EFBFBD><E8A781><EFBFBD><EFBFBD>嘥㦛<E598A5><E3A69B><EFBFBD>?
|
||||
* **<2A>蠘<EFBFBD>嚗?* 撅閧內 originalText<78>?
|
||||
* **擃䀝漁隡睃<E99AA1>嚗?* 蝞<><E89D9E>訫<EFBFBD><E8A8AB>?String.indexOf <20>交𪄳敶枏<E695B6>摮埈挾<E59F88><E68CBE><EFBFBD>澆僎<E6BE86><E5838E><EFBFBD><EFBFBD>?
|
||||
## **7\. 风险控制与性能优化**
|
||||
|
||||
| 潜在风险 | 解决方案 |
|
||||
| :---- | :---- |
|
||||
| **<EFBFBD><EFBFBD><EFBFBD>?Token <EFBFBD>鞉𧋦** | 1\. 暺䁅恕雿輻鍂 DeepSeek (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鞉𧋦) \+ Qwen (雿擧<EFBFBD><EFBFBD>? 蝏<><E89D8F><EFBFBD>?2\. <20>兩<EFBFBD>靝<EFBFBD>璉<EFBFBD><E79289>嗪𧫴畾萎艇<E8908E>潭㜃<E6BDAD>芣<EFBFBD><E88AA3><EFBFBD>㺭<EFBFBD>柴<EFBFBD>?|
|
||||
| **憭<EFBFBD><EFBFBD><EFBFBD>笔漲<EFBFBD>?* | 銝支葵璅∪<E79285>敹<EFBFBD>◆ **撟嗅<E6929F>靚<EFBFBD>鍂 (Promise.all)**嚗諹<E59A97>䔶<EFBFBD><E494B6>臭葡銵䎚<E98AB5><E48E9A>㟲雿栞<E99BBF>埈𧒄<E59F88>硋<EFBFBD>鈭擧<E988AD><E693A7>Y<EFBFBD><EFBCB9><EFBFBD>葵璅∪<E79285><E288AA>?|
|
||||
| **璅∪<EFBFBD><EFBFBD>澆<EFBFBD>銝滚𨯬霂?* | Prompt 銝剖<EFBFBD><EFBFBD>?Few-Shot (撠烐甅<EFBFBD>? 蝷箔<E89DB7>嚗峕<E59A97>蝖桀<E89D96>蝷?JSON <20>澆<EFBFBD><E6BE86><EFBFBD><EFBFBD><EFBFBD>?JSON 閫<><E996AB>憭梯揖嚗諹䌊<E8ABB9>券<EFBFBD>霂?1 甈~<E79488>?|
|
||||
| **<EFBFBD>滨垢蝵烐聢<EFBFBD>⊿▼** | 憒<EFBFBD><EFBFBD><EFBFBD>唳旿頞<EFBFBD><EFBFBD> 1000 <20>∴<EFBFBD>撘<EFBFBD><E69298>?Virtual Scrolling (<EFBFBD>𡁏<EFBFBD>皛𡁜𢆡)<29>?|
|
||||
| **双倍 Token 成本** | 1\. 默认使用 DeepSeek (极低成本) \+ Qwen (低成本) 组合。 2\. 在“体检”阶段严格拦截无效数据。 |
|
||||
| **处理速度慢** | 两个模型必须 **并发调用 (Promise.all)**,而不是串行。整体耗时取决于最慢的那个模型。 |
|
||||
| **模型格式不听话** | Prompt 中增加 Few-Shot (少样本) 示例,明确展示 JSON 格式。如果 JSON 解析失败,自动重试 1 次。 |
|
||||
| **前端网格卡顿** | 如果数据超过 1000 条,开启 Virtual Scrolling (虚拟滚动)。 |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user