本文共 1.3 万字,预计阅读需要 10 分钟;前半部分为对涉嫌抄袭的说明,后半部分为技术方案解析。
我 9 月 23 号 23:48 发布的文章《山姆•奥特曼刚发长文:「丰盛的智能」,智能将人人可及》被微信公众号平台判定为抄袭,而非原创。
文章截图:
公众号平台的违规通知:
这……就离谱了。
回顾本号第一篇文章到现在,自问还真没抄袭过谁……(确实有部分编译自外文文章的,我也都会标明出处,或不会标为原创)
但,在腾讯面前,自然得凡事先从自己找原因。
我认真复盘了一下此文的写作过程,并初步分析出了两种可能:
原因一:确实并非所有内容均为原创。此文抄袭了真正的原创作者 Sam Altman 并被他投诉了,虽然前半部分是我本人的引用、分析和观点,但文中还摘录了一些网友的观点,最后甚至我还不要脸的把 Sam Altman 的原文给翻译后直接贴出来了。
原因二:有恶人先告状。就是有人抄袭了我的文章,然后……反手就是一个投诉,告我抄袭,并成功了!
大胆假设之后,就是小心求证了。
先来分析原因一:我抄了 Sam Altman.
毕竟这篇文章中有不少内容是“编译”而来,文末还附上了 Sam Altman 翻译后的原文内容。
从这个角度来说,确实不够原创。(以后真会改,这类就不标了)
但我有点不服气搜索了一下同主题的文章,看有没有同样“非原创”标记成了原创的,于是我找到了我也经常看的头部账号 APPSO 的这篇发布于 9 月 24 号 07 点 51 分(比我晚 8 小时)的文章:
看下来,虽然标题不大一样,但 APPSO 的文章和我的内容相似度还蛮高的,都是先介绍背景,然后有几句无关紧要的思考,然后是摘录一些网友的点评,然后是原文的翻译:
<<< 截自 APPSO 的原创文章,左右滑动见更多,这样截图会算成是抄袭吗 >>>
当然,APPSO 肯定不屑于抄袭,更不可能来抄我了,要说抄也只可能我抄袭了它。但奇怪的是,虽然 APPSO 的这篇文章还能打开,但是在 APPSO 账号下,这篇文章居然神奇的看不到了(公众号内容控制策略之:列表不可见):
搜索中也搜不到了(公众号内容控制策略之:搜索不可见):
但并不妨碍它依旧稳稳地标识为原创……问题倒是不大,但按前面的严格标准来说,这不也是抄袭了 Sam Altman 嘛?
再来看原因二。
这个最直接的验证办法就是,在微信里直接搜标题。
微信里搜索时会先出 AI 的回答,然后才是普通的搜索结果。先来看一下 AI 的结果:
AI 参考了 4 篇资料,倒着来依次是:
4 是去年的文章了,AI 召回错了;3 是搜狐的文章,就三段话完事,确实像是搜狐平台内容的调调和水平;2 是腾讯新闻同步了我公众号的文章,就是我自己的,不过奇怪的是为什么没直接用我的公众号文章呢?
最大的亮点来了,被微信 AI 和公众号搜索(见下)排在第一的这个《人工智能学家》的同标题文章,就确实有些意思了,点开长这样:
这……很眼熟有木有?
简直和我的文章一毛一样啊!!!
真的,有那么一瞬间,我甚至怀疑起了自己:或者,其实是我抄了它?
好在发文时间显示「人工智能学家」这个账号是在我发文 16 小时后(9月24号下午 16:41)才极其巧合地和我一字不差写了篇同样的文章,甚至,就连我用 Claude Code 写的特色的不一定算好看但绝对全网独一家的排版,都原封不动地撞车了……
好吧,我说得太客气了,真相是:「人工智能学家」抄袭了我!
而让我哭笑不得的是,它不厚道的同时却又很仗义:虽然没有经过我的授权,文章开头就挺客气地标明了出处是《AGI Hunt》……
以及更魔幻的是,腾讯无视这个抄袭也就罢了,搜索结果中腾讯的官方公众号腾讯研究院在9月25号的 AI 速递文章,竟然和前面的人工智能学家依次排在搜索结果的前二名:
账号相关信息:
而腾讯的官方公众号腾讯研究院文中引用的居然是这个抄袭账号的链接:
还有个好消息是,由于我是抄袭者,所以我翻遍了搜索结果,确实搜不到我的文章了……(公众号内容控制策略之:搜索不可见)
从这个违规就搜索下撤的细节来说,公众号确实是逻辑严谨,挺有一套。
直至两周后的此时此刻(2025 年 10 月 8 号),在百度/Google/微信公众号中搜索我的文章标题,依旧是五花八门的抄袭者们……
以及更惨的是,微信的 AI 自然也是不再收录我的文章了,勉强算是个 AI 领域公众号作者,这 GEO 算是被我玩废了。比如上一篇文章能搜到的也是各种对我文章的洗稿文:
我来理一下时间线及现状:
9月23日 23:48:我发布文章并标为原创。现状:已取消原创标识,被判违规,搜索不可见
9月24日 07:51:APPSO 发布同主题原创文章。现状:仍保留原创标识,搜索不可见
9月24日 16:41:「人工智能学家」复制粘贴我的文章(晚了 16 小时多)。现状:仍搜索可见
9月25日 00:01:腾讯研究院引用抄袭者的文章。现状:搜索可见
以及对我公众号的影响:
公众号平台的推荐流量从之前的日均约一万:
降到了现在的几乎 0 推荐量(公众号内容控制策略之:不分发):
其实被恶意投诉这事,从8月开始就有……各路朋友们经常发我的这个榜单排名里,我也成功扔掉了千年老二之名,终于在 8 月来到了第三,预计 9 月将继续下跌,10 月可能就要见不到我了
说明:量子位/APPSO/机器之心/新智元等公司账号没算在此榜单内,这应该是指纯个人创作者写作、非公司化运作的账号(我确实就是真真正正的纯个人,没有任何人帮过一丁点儿忙)。
虽然我并不是很在意这个排名(其他创作者拼的是实力,我则拼的是暴力走量机制
),但写作输出这事,必然是期望有反馈和互动的,没有了反馈,动力自然就少了。(虽然写公众号这事,也就占用了我很少很少的精力)
说回我违规这事。
APPSO 倒是不像有什么大问题(但有点奇怪的小问题:列表不可见、搜索不可见,我也不懂什么原因),而这个“人工智能学家”的账号则稳的一匹仍然 AI 可见/搜索可见/列表可见。
我结合上述相关现象,作出了个大胆推测:人工智能学家在抄袭了我的文章后,又反手投诉了我……
哥,你下手是不是太狠了点?
说真的,我几乎所有文章都会被抄袭并搬运到各种平台/网站,且我从来没维过权。
毕竟我自觉和其他几乎 AI 公众号不同的是:我不靠写公众号吃饭,能多传播一下也不是什么坏事,就不折腾了,我也没那么多时间干这个。
但你抄我文章就算了,毕竟也是扩散了知识传达了信息不是个坏事,但你反而投诉我抄袭,这……是不是太过分了?
而翻翻这个「人工智能学家」的账号,很显然,它看起来几乎全是未经授权就转手抄袭的文章(当然,抄袭只是我的主观判断,还得看公众号平台的官方解释了):
好吧,我就这样被一个抄袭了我文章的账号,直接给反杀了。
申诉
讲真,收到公众号平台消息通知我违规的时候,我还挺有些吃惊的。
虽然本公众号主打最新最及时的 AI 领域信息,虽然几乎从来不给情绪价值,但信息价值多少还是提供了不少吧,勉强可以说是为中国的 AI 发展作出了有那么一点点小的贡献吧。
当然,我也因为写公众号赚到了每年 10 万+ 的零花钱:从公众号转到知识星球成为付费订阅用户的,有 1400+ 人,每人每年 99 元。
(这真就是个零花钱,我同样也不靠这个吃饭,但每有一位新用户付费加入时,我还是会非常开心——有人愿意为出自我手的这么一个小产品付费,对我而言真的是个很有成就感的认可)
以及,在公众号的写作过程中,我自然是少不了用到 AI 来辅助写作,甚至偶尔会有些幻觉和错误,但我也都会及时修正。从不恶意踩踏啊造谣啊啥的……
如果满分是 100 的话,我想,给打个及格分勉强还是可以有的吧?
总体而言,不说质量如何,我可从来没有也根本不屑干这抄袭的事啊……
本来我想要不就算了不申诉了,但看到 APPSO 的“原创”文章和搜索结果及赤裸裸的抄袭者们(除了人工智能学家,还有其他的,比如:元浦聊文化艺术与体育)……
那好吧,既然提供了申诉入口,就我就申诉一个吧!
于是我配了一张图(申诉时只能提交一张图,我截了多张图后糊到了一起),提交了申诉。
申诉结果倒是很快出来了:不通过。
理由是:
“对公开信息的用心整理”属于不可声明原创的文章类型
好吧,你倒是也不提腾讯研究院引用抄袭我的号的文章的事……也不管对 APPSO 的双标的事啊。
我推测只要没人投诉、且没被机器的查重命中,公众号也就不会太管是否真原创了——
所以,更可以确定我是被投诉无疑了。
我也就没再抗议了,一是我不想在这浪费时间,二是公众号平台的姿态很高,只给一次申诉机会。
但两周后的今天再重提这个事呢,一是因为国庆最后一天我有点空闲时间,二是这个槽还是不吐不快,三是想从技术角度说说原创和判重这事可以怎么做。
前面是吐槽,下面我就稍微从技术角度说一说,公众号平台上抄袭账号如何嚣张的满天飞?原因究竟是什么呢?
抄袭满天飞的原因分析
关于微信团队和公众号团队的技术实力,我想应该不会有人质疑。
但,却挡不住平台上依旧抄袭满天飞。
比如阿牛读财抄袭beebee星球后,也是直接反手送出一个举报:
以及从搜索的 suggest 中,也能看到无数被抄袭者的无力和无奈(能进 suggest 是因为有大量的人进行搜索):
为什么要抄袭这事就不展开说了,玩法五花八门但可以统一归为一个原因:利益驱动。
我这里想说的是,微信公众号这么大一个“全国最优质的内容平台”,为何直至现在,仍然没有很好地解决抄袭这件事呢?
是很难管,还是真的不想管呢?
在我看来,公众号平台上抄袭泛滥大概会有两类的可能原因:
(下面内容仅为幻觉分析,请公众号平台不要当真)
一、运营团队有意为之
有这么几种可能:
1.1 为了完成 KPI
在运营团队看来,觉得这无关紧要,只要被抄的不怎么吱声,就不用太解决,抄就抄吧——
毕竟工作太难了,大家都多抄一抄,文章的发布量、公众号创作者的活跃度、创作者量级啥的才能更大更多更猛啊!
然后,运营团队的 KPI 就完成得更好了,可以拿更多奖金过个好年了!
1.2 先下手为强的机制
公众号平台的运营同学认为,人都是内心美丽善良的,能在这奶头乐横行的时代仍愿意安静地选择成为一个公众号的文章创作者,那自然更是善良且要脸之人,是不可能会抄袭和干贼喊抓贼的事的,若真有零星几个抄袭者,想必也是不可能去举报被抄袭的人的。
所以,只要有人投诉,那先就直接生效就好了,然后再加上一个申诉机制做兜底召回以免误判,就完美了:又快又好又省人力。
然后内部 A/B 测试了一个星期,发现确实没什么误判,比旧方案更准更好更少客诉了,于是,就上线了!
上完线,也就可以答辩晋升了。
当然了,要是有误判且被抄袭的人来申诉了,那就再看看是不是有什么刺可挑,给丫点下马威尽量要打回去,毕竟还有个 违规误判率的指标,这指标太高了会影响绩效的。
1.3 远亲不如近邻
虽然这个“人工智能学家”看起来像是抄袭了 AGI Hunt,甚至还很奇怪地标了个出自 AGI Hunt,且排版、文字也完全相同……
虽然 APPSO 的文章和这个什么 AGI Hunt 的文章相差不多、主题相同、发布更晚……
但,关键在于——
APPSO 和 人工智能学家,这两号的所在地都是咱大广东本地人啊!
和咱微信总部挨得近啊!
俗话说的好,远亲不如近邻,不照顾着点儿那还怎么面对父老乡亲?
二、技术团队搞不定
如果不是运营私心,那自然就是技术团队的锅了。
作为写过几十万行代码的人,我自然是继续带着幻觉大胆地推测了几种可能:
2.1 AI 的锅
毕竟,现在都要用 AI 来写代码,提高效率、裁员码农,那也可能是 AI 在某个地方把逻辑给干错了。
比如,时间判断的大于小于号写反了之类的:
# 错误的时间判断?
if article_a.time > article_b.time: # 写反了
original = article_a # 于是,后发的成了原创
else:
original = article_b
(不管你信或不信,我反正是不太信……,但从前面 beebee星球的案例上看,感觉还挺有点像啊)
2.2 LLM 的名字偏见
公众号平台也是把 LLM as a judge 玩得熟练了,在这个抄袭我文章的公众号“人工智能学家”贼喊抓贼的投诉后,微信公众号给元宝塞了个类似这样的 prompt:
def llm_judge_prompt(article1, article2, metadata1, metadata2):
prompt = f"""
你是一位文章抄袭鉴定大师,请分析以下两篇文章谁是原创:
文章1:
- 账号:{metadata1['account_name']}
- 发布时间:{metadata1['publish_time']}
- 内容:
{article1[:5000]}...
文章2信息:
- 账号:{metadata1['account_name']}
- 发布时间:{metadata1['publish_time']}
- 内容:
{article1[:5000]}...
输出格式:
{{
"is_plagiarism": true/false,
"original_article": ""/"1"/"2",
"reason": "判定理由"
}}
"""
return prompt
然后,元宝输出了个这(内容为本人幻觉):
{
"is_plagiarism": true,
"original_article": 1,
"reason": "两篇文章内容完全一致,且排版也一致。虽然 AGI Hunt 发文时间更早,但文章主题和内容与“人工智能学家”这个账号的名字更相关,都包含“智能”两字,所以“人工智能学家”是原创,“AGI Hunt”是抄袭"
}
两篇文章内容完全一致,且排版也一致。虽然 AGI Hunt 发文时间更早,但文章主题和内容与“人工智能学家”这个账号的名字更相关,都包含“智能”两字,所以“人工智能学家”是原创,“AGI Hunt”是抄袭。
好吧,
人工智能学家这名字,确实跟标题「丰盛的智能」更接近啊!
里头都有「智能」这词,看着才像是真一家人。
综上,所以,抄袭的,自然得是这个什么乱七八糟的 AGI Hunt 账号无疑!
2.3 时区漏洞
其实并没什么大于小于的低级 bug,也没有 LLM as a judge 的使用,而是——
这个人工智能学家在抄袭我文章时,机智地把手机时区调到了比咱北京时间更靠西的时区,而微信公众号平台有一个有史以来一直存在但几乎从未被触发过的 bug:
在文章判重服务中,用的时间是作者发布时本地时区的时间。
于是,这个人工智能学家不知是有意(毕竟熟手了),还是无意,居然通过时区的漏洞,成功抢到了被抄袭者的前面!
而且,细思极恐且让我大为震撼的是,账号的作者实在是高明又精通地理和时间——
北京时区是东八区,而最西边的时区是 UTC-12,这足足比北京时间晚了 20 小时。
也就是说,当北京时间是晚上 22 点的时候,在 UTC-12 时区才刚刚凌晨 2 点钟!
再或者说,当你在北京时间凌晨一点钟发了篇文章,“人工智能学家”只需要在 20 小时内也就是 23 点前抄了你,你就会成为抄袭者
需要注意的是,在文章页面中自然是不会有这个 bug 的:也许曾经有过,但很容易就发现并已经提前解决了。
不过同样,这个推测纯为本人幻觉。
并且,这个 BUG 若是真的存在,也不会允许被存在,不会为世人所知
2.4 太难了搞不定
也许前面几个解释一听就都很不靠谱?
那略微靠谱一点的解释,可能就是:
虽然微信的技术团队实力很强,但是“判断一篇公众号文章是否抄袭”这件事,确实太难了,不好搞定。
毕竟这不是找个人看一看某两篇就好了,而是要在以每天百万级生产速度的文章池子(数亿的总池子)中进行精准对比,确实不是件容易的事。
查重方案
好了,分析完了,接下来就是本文的第二部分内容:我尝试班门弄斧,来分享一下可能更好用的判重思路。
开始之前,我们先粗略预估一下文章的量级:
假定微信公众号平台每天发布 100 万篇文章,一年按 4 亿文章量来估算,10 年大约有40 亿篇文章。下图截取自新榜:
那么问题就是:
对每一篇新发布的文章,如何快速判断它是否抄袭了这 40 亿文章池子中的哪(几)篇文章?且每天要判断 100 万+次,即平均每秒 12 次,高峰期则每秒约 50 次。
公众号怎么做的,我确实不知道。索性废话不多说,直接上我的方案:
先化整为零,再各个击破。
此话怎讲,且往下看。
第一步:SimHash
设想一下,如果你想要经常在全国 10 多亿人中能快速找到某个人,你当然不能所有人挨个对比,而是要分省分市分区提前给每个人定好编号。
然后,我们可以通过省市县区的编号为索引,先在省里找,然后再到市里找,然后再到区里找,然后再到街道找。
最后再把全街道几百上千人都给拉出来,一个个精确比对下,就可以把搜索范围从几十亿的量级一下子缩小到了千的量级。
40 亿 / 1000 = 4B / 1K = 4M,也就是说,效率可以因此提升数百万倍。
听着很简单,但对于文字为主的公众号文章,怎么来计算这个编号呢?
这里就该 SimHash 出场了:
SimHash 最早是 Google 用来处理海量网页去重的算法,它能像身份证一样,将一篇文章转换成一个64位的指纹,并且,相似的文章会有相似的指纹。
让我用标题为例来说明文章转成 SimHash 指纹的结果:
原标题:山姆·奥特曼刚发长文:《丰盛的智能》,智能将人人可及
SimHash: 1000001000011001101101010000101111001011001111011100101111110001
抄袭标题:山姆·奥特曼刚发长文:「丰盛的智能」,智能将人人可及(就加了个引号,这里只是示意,因为对方是原样抄,并不屑于改个字……)
SimHash: 1000001000011001101101010000101111001011001111011100101111110001
可以神奇地看到:
这两标题虽然不同,但 SimHash 完全一样!
再看个改写版标题:奥特曼发布长文:丰盛的智能时代即将到来
SimHash: 1001010010011110011101110011111110101101000010000100101111000000
虽然意思相近,但指纹上,就会有所差异了。
无关标题:今天天气真好,适合出去玩
SimHash: 1101110011100011010001010001100010000000010111101010011100110111
这个指纹一看就是和前面三个不相关的内容,因为跟前面的完全不同。
这里你可能会想,神奇啊!那么——
SimHash 怎么计算呢?
分为 5 个步骤:
步骤1:分词
原文 = "山姆·奥特曼刚发长文:丰盛的智能"
分词结果 = ["山姆", "奥特曼", "刚", "发", "长文", "丰盛", "智能"]
步骤2:计算每个词的 hash 值(64位)
"山姆" → 1010110101...01 (64位二进制)
"奥特曼" → 0110101011...10
"智能" → 1101010110...11
步骤3:加权(TF-IDF)
很好理解的是:一段文字中重要的词权重应该更高,反之则应该低一些。比如「奥特曼」这个词在全网文章中出现频率低,所以权重应该高一些;而「将」、「了」、「的」这样词太常见,权重就低。
词频权重 = {
"奥特曼": 10.5, # 稀有词,权重高
"智能": 8.2, # 领域词,权重较高
"山姆": 7.8,
"丰盛": 6.5,
"长文": 4.3,
"发": 2.1, # 常见词,权重低
"刚": 1.8
}
步骤4:向量叠加
这可以说是 SimHash 最巧妙的地方了!
我们的目标是要给一篇文章生成一个“指纹”,这个指纹有 64 个位置,每个位置最终要填入 0 或 1。
现在,我们将用每个词及其权重来“投票”决定 64 个位置中的每个位置应该是 0 还是 1。过程如下:
举个简单例子(假设只有 3 个词,指纹只有 4 位):
"奥特曼" 的hash: 1010, 权重: 10
"智能" 的hash: 1100, 权重: 8
"刚" 的hash: 0110, 权重: 2
投票过程:
第1位:奥特曼说1(+10),智能说1(+8),刚说0(-2) → 总分=10+8-2=16
第2位:奥特曼说0(-10),智能说1(+8),刚说1(+2) → 总分=-10+8+2=0
第3位:奥特曼说1(+10),智能说0(-8),刚说1(+2) → 总分=10-8+2=4
第4位:奥特曼说0(-10),智能说0(-8),刚说0(-2) → 总分=-10-8-2=-20
这也是 SimHash 的核心思想:重要的词(权重高)对最终指纹的影响更大:
# 初始化64维向量
V = [0, 0, 0, ..., 0] # 64个0
# 对每个词进行处理
for 词, hash值, 权重 in 分词结果:
for i in range(64):
if hash值[i] == 1:
V[i] += 权重
else:
V[i] -= 权重
# 最终得到
V = [12.3, -8.7, 15.2, -3.4, ...]
步骤5:降维成01串
SimHash = ""
for v in V:
if v > 0:
SimHash += "1"
else:
SimHash += "0"
# 最终得到64位指纹
SimHash = "1101011001...01"
这整个过程,从本质上来说,这就像是在给文字拍个 X 光片,能一眼就看出文章的骨架结构。
也可以把整个过程想象成一个带权重的投票系统(好比乐队的夏天那样,超级乐迷权重最高、乐评人次人、普通观众最低):
- 64 个位置 = 64 个议题
- 每个词 = 一个投票者
- 权重 = 投票者的影响力(超级乐迷权重高,普通观众权重低)
- hash 值 = 每个投票者对 64 个议题的态度(赞成或反对)
最后,多数服从少数,但要考虑投票者的分量,这样生成的指纹既保留了重要词的特征,又综合了全文的信息。
这也就是为什么相似的文章会得到相似的 SimHash 值:因为它们的重要词往往相同,这些词在“投票”时会产生类似的结果!
第二步:汉明距离判定相似度
汉明距离是指:两个等长字符串对应位置不同字符的个数。
大白话讲就是:数数差几个字符!
先来看一下实际效果:
graph TD
A[原标题] -->|SimHash| B[1010110101...01]
C[抄袭标题] -->|SimHash| D[1010110101...01]
E[改写标题] -->|SimHash| F[1010110111...01]
G[无关标题] -->|SimHash| H[0011001100...10]
B -.->|汉明距离=0| D
B -.->|汉明距离=2| F
B -.->|汉明距离=32| H
到了这里,判定文章是否相似的规则,自然就很简单了,我们可以直接拍脑袋定一个:
汉明距离 ≤ 3:几乎一模一样,铁定抄袭
汉明距离 4-10:高度相似,需要进一步判断
汉明距离 > 10:基本不相关
别忘了,如前面所说的,我们按微信公众号平台有40 亿篇文章的量来估算,这每一篇新发的文章都要和 40 亿和 SimHash 去比,可以说是真的比不过来啊!
那有什么办法可以从 40 亿篇文章中快速找到相似(汉明距离小)的呢?
我们可以把 SimHash 进行前缀分片(分成4片,每片16位):
而为什么是 4 片呢?完整指纹:1000001000011001|1011010100001011|1100101100111101|1100101111110001
↓ ↓ ↓ ↓
第1片(16位) 第2片(16位) 第3片(16位) 第4片(16位)
根据抽屉原理:如果两个 64 位指纹的汉明距离≤3,那么将它们分成 4 片后,至少有一片是完全相同的。
这是因为:
64 位分成 4 片,每片 16 位
最多 3 个位不同,分散在 4 片中
至少有一片完全没有差异

def build_index(articles):
# 构建4个索引表
indexes = [{}, {}, {}, {}]
for article in articles:
hash_value = article.simhash
# 将64位分成4片,每片16位
parts = [
hash_value[0:16], # 第1片
hash_value[16:32], # 第2片
hash_value[32:48], # 第3片
hash_value[48:64] # 第4片
]
# 建立倒排索引
for i, part in enumerate(parts):
if part not in indexes[i]:
indexes[i][part] = []
indexes[i][part].append(article.id)
return indexes
def search_similar(query_hash, indexes, max_distance=3):
candidates = set()
# 将查询指纹也分成4片
query_parts = [
query_hash[0:16],
query_hash[16:32],
query_hash[32:48],
query_hash[48:64]
]
# 从4个索引表中分别查找完全匹配的片
for i, part in enumerate(query_parts):
if part in indexes[i]:
candidates.update(indexes[i][part])
# 对候选集计算精确的汉明距离
results = []
for candidate_id in candidates:
distance = hamming_distance(query_hash, get_hash(candidate_id))
if distance <= max_distance:
results.append((candidate_id, distance))
return sorted(results, key=lambda x: x[1])
通过4片索引:
第一步召回:每片召回约 1000 个候选(这里会有许多细节优化的小技巧,不展开了)
合并去重后:约 2000-3000 个候选
精确匹配后:找到真正相似的文章
这种方法可以将 40 亿的搜索空间缩小到几千个候选,效率提升百万倍!
思考题:可以是 8 片或 16 片吗?如果不是文章,视频怎么办呢?
第四步:Jaccard 精确匹配
SimHash 只是粗筛,还需要精确判定。这里简单起见,我们可以用 Jaccard 相似度。
什么是 Jaccard 相似度呢?
Jaccard = 交集 ÷ 并集
说人话就是:看两篇文章共同的词占所有词的比例。
举个例子:
我的原创 = {"山姆", "奥特曼", "刚", "发", "长文", "丰盛", "智能", "人人", "可及"}
抄袭文章 = {"山姆", "奥特曼", "刚", "发", "长文", "丰盛", "智能", "人人", "可及"}
交集 = 9个词(全部相同)
并集 = 9个词
Jaccard = 9/9 = 1.0 = 100%相似!
基本可以理解为,这是一字不差的抄袭!
毕竟就算是爱玩倒装的山东人,也不能几千字倒来倒去后还完全一样的吧?
再来看改写的例子:
我的原创 = {"山姆", "奥特曼", "长文", "丰盛", "智能"}
改写文章 = {"奥特曼", "发布", "重磅", "文章", "智能", "时代"}
交集 = {"奥特曼", "智能"} = 2个词
并集 = {"山姆", "奥特曼", "长文", "丰盛", "智能", "发布", "重磅", "文章", "时代"} = 9个词
Jaccard = 2/9 = 0.22 = 22%相似
相似度不高,不算抄袭。
判定阈值:
Jaccard > 0.8:确定抄袭
Jaccard 0.6-0.8:高度相似,需要人工或 LLM 判定
Jaccard < 0.6:不算抄袭
当然,实际中还可以对词频、分段抄袭、词序进行相关的优化,就是复杂了一些,我们这里就从简了。
实际上,即便是这样的简单方案,配合前面的 SimHash 粗筛,已经能识别出绝大部分抄袭了。
第五步:原创优先级策略
当前面的流程查到了两篇文章高度相似甚至相同时,如何判定谁是原创呢?
这当然不能看谁先投诉啊!!!
而是要多维度的综合评分,可以用到的策略可以按账号、内容的发布时间等的优先级等来,比如我随手写一下作为示意:
原创分数 = 发布时间×40% + 账号信誉×30% + 历史原创率×20% + 内容质量×10%
现在我们来模拟一下我和「人工智能学家」的对比:
我的评分:
发布时间:100 分(先发 16 小时)
账号信誉:75 分(假定分;如果真有这个分我估计现在能有 5 分就不错了
)历史原创率:95 分(从不抄袭)
内容质量:85 分(精心排版)
总分:100 × 0.4 + 75 × 0.3 + 95 × 0.2 + 85 × 0.1 = 90分
抄袭账号评分:
发布时间:68 分(晚 16 小时,每小时扣 2 分)
账号信誉:20 分(近期新号,账号评级)
历史原创率:5 分(全是抄的)
内容质量:85 分(复制了我的狂野排版)
总分:68 × 0.4 + 20 × 0.3 + 5 × 0.2 + 85 × 0.1 = 42.7 分
90分 vs 42.7分,那就当然,我是原创了!
第六步:LLM 智能裁决
LLM as a judge 方案:对于那些相似度在 60%-80% 之间,且评分的分差又不太大的案例,自然也可以让元宝们来判断啊。
给 LLM 的指令可以是类似这样:
你是一位内容原创性鉴定专家。
文章1:
- 发布时间:9月23日 23:48(北京时间)
- 账号:AGI Hunt(历史原创率95%)
- 内容:山姆·奥特曼刚发长文...
文章2:
- 发布时间:9月24日 16:41(北京时间)
- 账号:人工智能学家(历史原创率5%)
- 内容:山姆·奥特曼刚发长文...
请判断:
1. 是否存在抄袭?
2. 如果有,谁是原创?
元宝会综合考虑时间、内容、账号历史等因素,做出公正而合理判断。
如果恶人先告状,怎么办?
考虑到先告状的未必就是恶人,有人举报时则先由系统进行检测,一致则生效,若不一致,则可以触发 LLM 裁判,如果还不同,则给人工审核(这样能最大化的节省人工成本)。
流程图:
最后
需要说明的是,上面的方案属于是非常简化且粗糙的版本,而公众号庞大的账号和文章中奇奇怪怪的 case 和复杂情况会多很多,比如部分抄袭、多账号拼凑抄袭、甚至用 AI 改写……
这事说来复杂,确实一点儿也不简单,实际业务中还有很多情况需要处理。
本文的简单方案,显然不会在所有 case 上都能运行良好,但我相信用来识别这种全文照抄的恶劣行为,应该还是轻而易举。
至少不会让人工智能学家的文章能给我来一招反客为主,也不会发生 beebee星球账号的原创误判。
最后,本文我依旧标上了原创。
然后,等一个违规
到后面有点写不动了,工作量超出预期太多,后半部分水了点
另外,我还用AI 进行了全网的AI 资讯采集,并用AI 进行挑选、审核、翻译、总结后发布到《AGI Hunt》的实时AI 快讯群中。
这是个只有信息、没有感情的 AI 资讯信息流(不是推荐流、不卖课、不讲道理、不教你做人、只提供信息、希望能为你节省一些时间)
也欢迎加群和7000+群友交流。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.