精确去重和近似去重无法识别"表述不同但含义相同"的文本(例如"今天天气怎么样"与"今日气候如何")。dedup-semantic 节点通过 Embedding 模型将文本映射为向量,比较向量距离判定语义相似度,去除语义重复的记录。
工作原理与适用场景
dedup-semantic 对指定字段计算 Embedding 向量,将向量距离在阈值以内的记录归为语义重复簇,每簇保留一条代表性记录。
适用场景:
节点配置
{
"id": "node_1",
"type": "dedup-semantic",
"parameters": {
"field": "<字段名>",
"threshold": "<距离阈值>",
"model": "<模型名>",
"output": "<输出列列表>",
"global": true,
"workspace": "<工作空间>",
"dataset": "<数据集>",
"column_name": "<Dataset列名>"
}
}参数说明
参数 | 类型 | 必填 | 默认值 | 说明 |
| String | 是 | 无 | 去重依据的字段名,须为文本类型。 |
| String | 否 |
| 向量距离阈值,取值范围 0~1,数值越小越严格。 |
| String | 否 |
| Embedding 模型名称。 |
| String | 否 |
| 节点输出列,多个列名以逗号分隔。 |
| Boolean | 否 |
| 是否开启全局去重。设置为 |
| String | 条件必填 | 无 | Dataset 所在工作空间。当 |
| String | 条件必填 | 无 | Dataset 名称。当 |
| String | 否 | 与 | Dataset 中语义去重的列名。仅在全局去重模式下生效,用于指定 Dataset 中与 |
阈值选择建议
阈值 | 严格程度 | 说明 |
| 非常严格 | 仅过滤几乎同义的表述。 |
| 推荐默认 | 适合大多数语义去重场景。 |
| 较宽松 | 可能误删相关但不同义的文本。 |
| 过于宽松 | 不推荐,容易造成大量有效数据被误删。 |
输入和输出
输入要求
接收上游节点输出的任意列数据。
要求数据中包含
field参数指定的字段,且该字段为文本类型。
输出列
列名 | 类型 | 来源 | 说明 |
| 原始类型 | 透传 |
|
| array(double) | 新增 | 文本 Embedding 向量。可被下游 |
| bigint | 新增 | 批内行标识,供内部使用。 |
行数变化
M -> N(M >= N)。语义相似的记录归为一簇,每簇保留一条,输出行数小于或等于输入行数。
效果预览
以下示例展示 field = "question"、threshold = "0.1" 时的去重效果。
处理前(5 条)
question | input | output |
什么是机器学习? | 请解释 | 机器学习是... |
机器学习的定义是什么? | 概述 | ML是一种通过数据训练... |
如何入门Python编程? | 指南 | 推荐从官方教程开始... |
Python零基础怎么学? | 入门 | 建议先学基础语法... |
什么是深度学习? | 简述 | 深度学习是机器学习的子集... |
处理后(3 条)
question | input | output | __dedup_emb | __dedup_rid |
什么是机器学习? | 请解释 | 机器学习是... | [0.12, -0.34, ...] | 1 |
如何入门Python编程? | 指南 | 推荐从官方教程开始... | [0.56, 0.78, ...] | 3 |
什么是深度学习? | 简述 | 深度学习是机器学习的子集... | [-0.11, 0.45, ...] | 5 |
"什么是机器学习?"与"机器学习的定义是什么?"语义等价(向量距离小于 0.1),归为一簇保留一条;"如何入门Python编程?"与"Python零基础怎么学?"同理。5 条数据去重后保留 3 条。__dedup_emb 列可供下游 semantic-cluster 节点直接复用。
使用示例
示例一:批内语义去重
对当前批次内的 question 字段进行语义去重,使用默认阈值 "0.1"。
{
"id": "n4",
"type": "dedup-semantic",
"parameters": {
"field": "question",
"threshold": "0.1"
}
}示例二:全局语义去重
开启全局去重,与 Dataset 中的历史向量进行跨批次语义比对。
{
"id": "n4",
"type": "dedup-semantic",
"parameters": {
"field": "question",
"threshold": "0.1",
"global": true,
"workspace": "my-ws",
"dataset": "my-ds"
}
}示例三:三级去重完整管道
按照 精确去重 -> 近似去重 -> 语义去重的顺序逐级去重。前置精确和近似去重可大幅减少语义去重的输入数据量,降低 Embedding 计算成本。
{
"nodes": [
{
"id": "n1",
"type": "project",
"parameters": {
"question": "a",
"input": "b",
"output": "c"
}
},
{
"id": "n2",
"type": "dedup-exact",
"parameters": {
"field": "question"
}
},
{
"id": "n3",
"type": "dedup-fuzzy",
"parameters": {
"field": "question",
"threshold": "3",
"global": true,
"workspace": "my-ws",
"dataset": "my-ds"
}
},
{
"id": "n4",
"type": "dedup-semantic",
"parameters": {
"field": "question",
"threshold": "0.1",
"global": true,
"workspace": "my-ws",
"dataset": "my-ds"
}
}
]
}示例四:自定义 Embedding 模型
指定 text-embedding-v3 模型,设置更严格的阈值 "0.05",通过 column_name 显式指定 Dataset 中的列名。
{
"id": "n4",
"type": "dedup-semantic",
"parameters": {
"field": "question",
"threshold": "0.05",
"model": "text-embedding-v3",
"global": true,
"workspace": "my-ws",
"dataset": "my-ds",
"column_name": "question"
}
}使用建议与边界行为
使用建议
语义去重需要 GPU 推理计算 Embedding,计算成本较高。建议在 dedup-exact 和 dedup-fuzzy 之后使用,前置去重可大幅减少输入数据量。推荐管道顺序:dedup-exact -> dedup-fuzzy -> dedup-semantic。
默认阈值
"0.1"适合大多数场景,数值越小越严格。__dedup_emb扩展列可供下游semantic-cluster节点直接复用,避免重复计算 Embedding。全局去重适用于增量入库场景,需确保 Dataset 已开启向量索引。
无需在
dedup-semantic前单独调用 embedding 节点,该算子内部已包含 Embedding 生成逻辑。
边界与异常
场景 | 行为 |
| 校验失败,Pipeline 不会启动。 |
| 校验失败,Pipeline 不会启动。 |
| 校验失败,Pipeline 不会启动。 |
Embedding 模型不可用 | 运行时报错。 |
| 该行不参与去重,不出现在输出中。 |
输入数据为空 | 正常返回空结果集。 |