LLM 文本去重实战教程
使用 AI 嵌入向量对大规模文本数据集进行去重
LLM 文本去重实战教程
使用 AI 嵌入向量对大规模文本数据集进行去重
LLM 文本去重实战(2026):三级漏斗——哈希(免费)→嵌入近邻(便宜)→LLM 仲裁灰区(精确),阈值用 200 对标注校准出自动合并/自动判异两条线。含聚类保留策略、增量模式、合并溯源。
LLM 文本去重实战教程
文本数据集中的重复项——重复提交的工单、同一产品以五种方式列出、几乎相同的文章——会破坏分析、膨胀 RAG 索引并使训练数据产生偏差。精确匹配去重无法捕捉任何有趣的情况(“无法登录我的账户” vs “登录对我没用”)。生产环境的解决方案是三级漏斗:廉价哈希 → 嵌入相似度 → LLM 仲裁,仅在必要时使用昂贵的工具。
为什么采用漏斗形状
比较所有对是 O(n²) 的——100 万条记录意味着 5000 亿对;你无法天真地通过 LLM(甚至嵌入比较)来处理。每个阶段将候选数量减少几个数量级:
阶段 2:嵌入 + ANN
python
import numpy as np
from openai import OpenAIclient = OpenAI()
def embed_batch(texts: list[str]) -> np.ndarray:
resp = client.embeddings.create(model='text-embedding-3-small', input=texts)
return np.array([d.embedding for d in resp.data])
对于实际规模,将向量放入 pgvector/FAISS 并查询邻居;
内存中的余弦相似度适用于最多约 5 万条记录:
emb = embed_batch(records)
emb /= np.linalg.norm(emb, axis=1, keepdims=True)
sims = emb @ emb.T
cand_pairs = [(i, j) for i in range(len(records)) for j in range(i+1, len(records))
if sims[i, j] > 0.85] # 阈值:参见下面的校准
阈值校准是整个游戏的关键:一次标记约 200 对跨相似度带的对,然后选择两个截止点——高于约 0.95 自动合并,低于约 0.80 自动判异,只有中间带进入阶段 3。该带通常只占对数的几个百分点,这使得 LLM 仲裁变得经济实惠。(将向量存储在 pgvector 中,这也可以作为你的搜索索引。)
阶段 3:LLM 仲裁
python
def judge(a: str, b: str) -> dict:
prompt = f'''这两条记录是重复的(同一真实事物),还是不同的?
措辞/拼写/格式的变化 = 重复。不同的尺寸/颜色/版本/意图 = 不同。
A: {a}
B: {b}
JSON: {{"verdict": "duplicate"|"distinct", "reason": "<一行>"}}'''
resp = client.chat.completions.create(
model='gpt-4o-mini',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}],
)
return json.loads(resp.choices[0].message.content)
生产中重要的注意事项:
此管道的用武之地
操作说明
常见问题
成本大概多少? 嵌入每千条短记录只需几分之一美分;LLM 仲裁仅触及灰带。10 万条记录的去重通常只需个位数美元——上述设计就是原因。
我可以跳过嵌入只做哈希吗? 对于格式相同的数据,也许可以;但你会错过所有释义。嵌入阶段正是找到“相同含义,不同词语”的关键。
跨语言重复? 多语言嵌入模型会将翻译聚类在一起——相同的漏斗有效;只需确认你的阶段 3 提示说明翻译是否算作重复(取决于你的用例)。
*最后更新:2026 年 6 月。*
相关工具
相关教程
OpenAI API 模式中的成本与吞吐量权衡——跨 openai 和 python 的批处理对比
Bubble.io与OpenAI完整集成指南
Zapier 与 OpenAI 完整集成指南
使用 vLLM 构建生产级 AI——PagedAttention 实现 GPU 推理
使用 Dify 构建生产级 AI——开源 LLM 工作流平台
何时以及如何针对特定领域任务微调大语言模型