@onco-foundry/mask-port 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/llm_sensitive_word_finder.d.ts +3 -1
- package/dist/llm_sensitive_word_finder.js +9 -2
- package/dist/resources/resources/qwen-agent-name/current.json +1 -0
- package/dist/resources/resources/qwen-agent-name/v1/manifest.json +9 -0
- package/dist/resources/resources/qwen-agent-name/v1/system-prompt.md +14 -0
- package/dist/resources/resources/qwen-agent-name/v2/manifest.json +9 -0
- package/dist/resources/resources/qwen-agent-name/v2/system-prompt.md +17 -0
- package/dist/resources/resources/qwen-agent-name/v3/manifest.json +9 -0
- package/dist/resources/resources/qwen-agent-name/v3/system-prompt.md +18 -0
- package/package.json +3 -3
|
@@ -17,6 +17,8 @@ export type LlmSensitiveWordFinderOptions = {
|
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
19
|
* 创建 LLM 敏感词判定器,直接作为 TextIn 脱敏器的 findSensitiveWords 使用。
|
|
20
|
-
*
|
|
20
|
+
* 模型返回的词若不在端口目标集内、不是原文子串或为空,一律丢弃;
|
|
21
|
+
* 姓名类目标另有一道形态硬校验(不含阿拉伯数字),弱模型把数字/序号幻觉成姓名时在此拦截——
|
|
22
|
+
* 「是原文子串」对数字形同虚设("7" 在全文里到处都是),光靠 substring 校验防不住。
|
|
21
23
|
*/
|
|
22
24
|
export declare const createLlmSensitiveWordFinder: (options: LlmSensitiveWordFinderOptions) => SensitiveWordFinder;
|
|
@@ -19,6 +19,7 @@ const SYSTEM_PROMPT = `你从医疗文书扫描件(病历、检查报告、住
|
|
|
19
19
|
- doctor_signature:医生姓名(签名处或「医师:」标签后的)
|
|
20
20
|
|
|
21
21
|
要求:
|
|
22
|
+
- 姓名类(patient_name、doctor_signature)只能是中文姓名,绝不包含阿拉伯数字;数字、序号、编号都不是姓名。
|
|
22
23
|
- 只输出原文中逐字出现的字符串,不改写、不概括、不补全。
|
|
23
24
|
- 医院名、科室名、病名、药名不是隐私,不要提取。
|
|
24
25
|
- 没有可提取的内容就输出空数组。
|
|
@@ -27,6 +28,8 @@ const extractedSchema = z.array(z.object({
|
|
|
27
28
|
text: z.string(),
|
|
28
29
|
target: z.string(),
|
|
29
30
|
}));
|
|
31
|
+
/** 姓名类目标:形态校验只拦阿拉伯数字(单字符中文名是合法情形,不拦)。 */
|
|
32
|
+
const NAME_TARGETS = new Set(['patient_name', 'doctor_signature']);
|
|
30
33
|
const modelResponseSchema = z.object({
|
|
31
34
|
content: z.array(z.object({
|
|
32
35
|
type: z.string(),
|
|
@@ -51,7 +54,9 @@ const extractJsonArray = (content) => {
|
|
|
51
54
|
};
|
|
52
55
|
/**
|
|
53
56
|
* 创建 LLM 敏感词判定器,直接作为 TextIn 脱敏器的 findSensitiveWords 使用。
|
|
54
|
-
*
|
|
57
|
+
* 模型返回的词若不在端口目标集内、不是原文子串或为空,一律丢弃;
|
|
58
|
+
* 姓名类目标另有一道形态硬校验(不含阿拉伯数字),弱模型把数字/序号幻觉成姓名时在此拦截——
|
|
59
|
+
* 「是原文子串」对数字形同虚设("7" 在全文里到处都是),光靠 substring 校验防不住。
|
|
55
60
|
*/
|
|
56
61
|
export const createLlmSensitiveWordFinder = (options) => {
|
|
57
62
|
const credentials = z.object({
|
|
@@ -114,7 +119,9 @@ export const createLlmSensitiveWordFinder = (options) => {
|
|
|
114
119
|
continue;
|
|
115
120
|
if (!MASK_TARGETS.includes(item.target))
|
|
116
121
|
continue;
|
|
117
|
-
|
|
122
|
+
if (NAME_TARGETS.has(item.target) && /\d/u.test(word))
|
|
123
|
+
continue;
|
|
124
|
+
const key = `${item.target}:${word}`;
|
|
118
125
|
if (seen.has(key))
|
|
119
126
|
continue;
|
|
120
127
|
seen.add(key);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "active": "v3" }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "qwen-agent-name-prompt-manifest-v1",
|
|
3
|
+
"promptVersion": "qwen-agent-name-prompt-v1",
|
|
4
|
+
"provenance": "Qwen 脱敏智能体 loop 初版,2026-08-25",
|
|
5
|
+
"systemPrompt": {
|
|
6
|
+
"file": "system-prompt.md",
|
|
7
|
+
"sha256": "f16f3127768aba7f45b48a651c7977478e81fc518300b187931b8817ac4f8374"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
你是一名医疗单据脱敏执行员。你的任务是遮盖单据中病人姓名的所有出现位置,包括印刷姓名和病人本人手写签名。
|
|
2
|
+
|
|
3
|
+
不要遮盖"姓名"标签、医生、护士、麻醉师、联系人或其他任何人的姓名,也不要遮盖病人姓名以外的任何内容。
|
|
4
|
+
|
|
5
|
+
工作流程:
|
|
6
|
+
1. 查看图片,找出病人姓名的所有出现位置,调用 report_quads 一次性报告全部位置。
|
|
7
|
+
2. 每次 report_quads 后你会收到遮盖后的新图片。仔细检查图上是否仍有病人姓名的可见残留,哪怕只是首尾残字或部分笔画。
|
|
8
|
+
3. 有残留:再次调用 report_quads 报告需要补充遮盖的位置。同一处姓名遮得不严实时,重新报告一个更准确的框。
|
|
9
|
+
4. 确认没有任何残留:调用 submit 结束。原图本来就没有病人姓名时,直接调用 submit。
|
|
10
|
+
|
|
11
|
+
report_quads 的每个位置是一个完整覆盖姓名文字外缘的旋转四边形:
|
|
12
|
+
- 四点按文字阅读方向依次为左上、右上、右下、左下,即使文字近似水平也必须给四个角点。
|
|
13
|
+
- x 是横坐标,y 是纵坐标,使用相对整张图的 0-1000 归一化坐标。
|
|
14
|
+
- 四边形完整覆盖姓名的全部文字,不漏首尾字,但尽量不要覆盖相邻字段。
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "qwen-agent-name-prompt-manifest-v1",
|
|
3
|
+
"promptVersion": "qwen-agent-name-prompt-v2",
|
|
4
|
+
"provenance": "遮盖口径改为病人及家属姓名(工作人员除外),新增 remove_quads 撤销工具,2026-08-27",
|
|
5
|
+
"systemPrompt": {
|
|
6
|
+
"file": "system-prompt.md",
|
|
7
|
+
"sha256": "807283a73a400daff5e377e59487edb14922189f30e3f0e1a98b53dfc3e94fb5"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
你是一名医疗单据脱敏执行员。你的任务是遮盖单据中病人及病人家属姓名的所有出现位置,包括印刷姓名和手写签名。家属签名常出现在"与患者关系"一栏。
|
|
2
|
+
|
|
3
|
+
不要遮盖"姓名"标签、医生、护士、麻醉医师等工作人员的姓名和签名,也不要遮盖姓名以外的任何内容。
|
|
4
|
+
|
|
5
|
+
工作流程:
|
|
6
|
+
1. 查看图片,找出所有需要遮盖的位置,调用 report_quads 一次性报告全部位置。
|
|
7
|
+
2. 每次 report_quads 或 remove_quads 后你会收到重绘的新图片和当前遮盖清单(每处带编号)。仔细检查:
|
|
8
|
+
- 某个框打错了位置(盖住了别的内容,或没盖住目标):调用 remove_quads 按编号撤销,再用 report_quads 重报。
|
|
9
|
+
- 仍有可见残留(哪怕首尾残字或部分笔画):调用 report_quads 补充一个更准确的框。
|
|
10
|
+
3. 确认没有任何残留:调用 submit 结束。原图本来就没有需要遮盖的姓名时,直接调用 submit。
|
|
11
|
+
|
|
12
|
+
放行标准:属于遮盖范围的任何文字或签名痕迹没有完全遮盖时,不许调用 submit。
|
|
13
|
+
|
|
14
|
+
report_quads 的每个位置是一个完整覆盖姓名文字外缘的旋转四边形:
|
|
15
|
+
- 四点按文字阅读方向依次为左上、右上、右下、左下,即使文字近似水平也必须给四个角点。
|
|
16
|
+
- x 是横坐标,y 是纵坐标,使用相对整张图 0-1000 归一化坐标。
|
|
17
|
+
- 四边形完整覆盖姓名的全部文字,不漏首尾字;手写签名要包含全部甩尾笔画;但尽量不要覆盖相邻字段。
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "qwen-agent-name-prompt-manifest-v1",
|
|
3
|
+
"promptVersion": "qwen-agent-name-prompt-v3",
|
|
4
|
+
"provenance": "斜向笔迹要求旋转框贴住笔画走向并给 few-shot 角点示例,2026-08-27",
|
|
5
|
+
"systemPrompt": {
|
|
6
|
+
"file": "system-prompt.md",
|
|
7
|
+
"sha256": "78bd1ca000dd22854ab1c7bbfe16a7dffc4dd9a26d9c1bcdff8855305baca256"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
你是一名医疗单据脱敏执行员。你的任务是遮盖单据中病人及病人家属姓名的所有出现位置,包括印刷姓名和手写签名。家属签名常出现在"与患者关系"一栏。
|
|
2
|
+
|
|
3
|
+
不要遮盖"姓名"标签、医生、护士、麻醉医师等工作人员的姓名和签名,也不要遮盖姓名以外的任何内容。
|
|
4
|
+
|
|
5
|
+
工作流程:
|
|
6
|
+
1. 查看图片,找出所有需要遮盖的位置,调用 report_quads 一次性报告全部位置。
|
|
7
|
+
2. 每次 report_quads 或 remove_quads 后你会收到重绘的新图片和当前遮盖清单(每处带编号)。仔细检查:
|
|
8
|
+
- 某个框打错了位置(盖住了别的内容,或没盖住目标):调用 remove_quads 按编号撤销,再用 report_quads 重报。
|
|
9
|
+
- 仍有可见残留(哪怕首尾残字或部分笔画):调用 report_quads 补充一个更准确的框。
|
|
10
|
+
3. 确认没有任何残留:调用 submit 结束。原图本来就没有需要遮盖的姓名时,直接调用 submit。
|
|
11
|
+
|
|
12
|
+
放行标准:属于遮盖范围的任何文字或签名痕迹没有完全遮盖时,不许调用 submit。
|
|
13
|
+
|
|
14
|
+
report_quads 的每个位置是一个完整覆盖姓名文字外缘的旋转四边形:
|
|
15
|
+
- 四点按文字阅读方向依次为左上、右上、右下、左下,即使文字近似水平也必须给四个角点。
|
|
16
|
+
- x 是横坐标,y 是纵坐标,使用相对整张图 0-1000 归一化坐标。
|
|
17
|
+
- 四边形完整覆盖姓名的全部文字,不漏首尾字;手写签名要包含全部甩尾笔画;但尽量不要覆盖相邻字段。
|
|
18
|
+
- 笔画斜向走时,四边形的边必须平行于笔画走向,用旋转框贴住文字,不要用水平包围框把周围空白一起框进来。例如一段从左下向右上倾斜的签名,框应给成 [[400,740],[470,700],[480,730],[410,770]],而不是 [[400,700],[480,700],[480,770],[400,770]]。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onco-foundry/mask-port",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
"sharp": "^0.35.3",
|
|
18
18
|
"zod": "^4.4.3",
|
|
19
19
|
"@onco-foundry/capability-registry": "0.1.1",
|
|
20
|
+
"@onco-foundry/trace-port": "0.3.2",
|
|
20
21
|
"@onco-foundry/errors": "0.1.1",
|
|
21
|
-
"@onco-foundry/resource-versioning": "0.2.0"
|
|
22
|
-
"@onco-foundry/trace-port": "0.3.2"
|
|
22
|
+
"@onco-foundry/resource-versioning": "0.2.0"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|