# 机器人评论分类器
来源:https://entropicthoughts.com/ai-comment-classifier
以下是我在处理某段代码时看到的一条评论:
> Tagger 会遍历整个集合以定位已标记的集群。当缓存的、通过脏数据追踪的标记计数显示没有需要标记的内容时(这是常见情况),就完全跳过遍历:不需要标记任何内容,因此遍历完全是浪费。当计数过时(例如编辑后立即发生)或非零时,我们才会进行实际查找,因此过时的标记永远不会显示。这与“标志”徽章所依赖的最终一致性信号相同。
这段话中有一点引起了我的注意:那个小小的括号说明“这是常见情况”。如果这是真的,那将是重要的信息!然而,这条评论是由机器人生成的,它*没有*判断在该领域什么是常见情况的感知能力。但通过生成这条评论,机器人欺骗了每一个未来的读者(包括人类和机器人),让他们相信系统存在一个并不存在的特性。
由于我知道在这种情况下评论是由机器人生成的,并且它包含的特性是幻觉,所以我可以修正评论。但情况并非总是如此简单。还有另一条评论:
> AcmeRate 的实时货币转换(体现在我们的行内小计中)与连接池不兼容:在重用的连接上,汇率查找是针对上一个会话的区域设置运行的,并返回错误货币的数字。因此,当订单包含外币行项目(因此涉及转换)时,会回退到使用新连接,否则继续使用连接池,这样大型国内订单就能保持快速。sessionInit 在请求配置组装之前运行,因此读取时 localeState 已经填充完毕。
这条评论暗示“继续使用连接池”以便“大型国内订单保持快速”很重要。如果是人类写的,我会假设他们经过深思熟虑,并确定必须保留这个优化。但如果是机器人写的,听起来更像是它为自己无权决定的事情辩护性地保留了代码中的某些内容,因为它根本不知道自己在做什么。¹¹ 这个优化毫无用处。只需要一点点领域经验就能知道,几乎每个订单都包含外币,而且大型国内订单即使不用连接池也很快。
## 如何检测语言差异 (https://entropicthoughts.com/ai-comment-classifier#how-do-detect-differences-in-language)
最有趣的部分可能不是分类器本身,而是它用来区分机器人生成的评论和人类评论的方法。值得了解的是,虽然这个模型是在广泛的人类作者数据上训练的,但我怀疑训练数据中绝大多数机器人生成的评论来自 Anthropic 模型,因此我们下面看到的特征与其说是区分*一般的机器人*和人类,不如说是区分*Anthropic LLM 模型*和人类。这是一个我们稍后会回到的重要观点。
我对计算语言学并不精通,所以在这个项目中,我做了一些粗略的阅读,找到了三种分解文本以尝试提取风格差异的基本方法。我尝试的所有方法都通过将源文本切割成更小的片段,计算这些片段在文本中出现的频率,然后观察机器人生成的文本与人类编写的文本相比,该频率是更高还是更低。
## 字符频率(62% 准确率) (https://entropicthoughts.com/ai-comment-classifier#character-frequency--62---accuracy-)
最基本的文本切割方式是按字符切割,这确实能提供有用的信息。一个简单的猜测,例如,破折号(`—`)可能表示评论是机器人生成的。确实如此!其他机器人比人类产生更多的排版符号包括分号(`;`)、Unicode 箭头(`→`)和省略号(`...`)。
字符频率分析还告诉我们,机器人生成的评论比人类的语法更复杂:它们包含更多的句号(`.`)、逗号(`,`)、括号(`(`和`)`)以及换行符。机器人也比人类更多地用直角的 ASCII 引号(`"`)包围字面字符串,例如引用用户界面中的文本。总的来说,机器人使用的符号种类比人类更多,并且产生的文本具有更高的符号密度。
有两类符号在人类文本中出现得更频繁:
- 用作引入下一部分分隔符的冒号(`:`),就像我在这个列表之前的那句话中所做的那样。
- 来自代码或代码部分被包含在注释中的符号,例如美元符号(`$`)、小于号和大于号(`<`和`>`)、反引号(`` ` ``)、等号(`=`)、感叹号(`!`)、方括号(`[`和`]`)。
机器人在评论中包含代码的可能性低于人类,也更不可能写`TODO`注释。
## 常用词频率(64% 准确率) (https://entropicthoughts.com/ai-comment-classifier#common-word-frequency--64---frequency-)
语言抽象的下一层可能是单词。然而,在这一点上我们必须小心。由于语言的工作方式(文档通常包含独特的单词),基于单词频率的分类器有可能学习到*主题*上的差异,而不是风格差异。为了避免主题泄露,我们只计算常用、非主题词的频率。这些词有时被称为*功能词*。
你知道吗?让我们把它变成一个有趣的游戏!
下面的列表包含八个单词组。其中一些组在人类编写的评论中更常见,另一些组在机器人生成的评论中更常见。对于每一行,标记它为“人类”或“机器人”,看看你能答对多少!
1. your of my other over since enough they be few towards
2. which how this have about down could out much should
3. must everything before away among the thousand past until their
4. while every both one each none within per nothing once outside
5. so its whether against through back would across up first several
6. therefore yet when off still inside around after from at without
7. more though his can although but except such second either
8. we you who I will because some there these why along our
完成了?然后你可以检查你的答案。第一组和最后两组(1–2 和 7–8)包含在人类编写的评论中经常使用的单词。中间四组(3–6)包含在机器人生成的评论中经常使用的单词。
我们发现,机器人生成的评论包含更多的介词和方向词(through, up, among, within, around, after, at 等),而人类编写的评论则包含更多的代词、修饰语和编织故事的词汇(we, you, because, although, except, should, either, some 等)。
## 词性频率(54%) (https://entropicthoughts.com/ai-comment-classifier#part-of-speech-frequencies--54---)
从单词向上一步的抽象可能是词性(pos)标签。一个词性标注器将单词替换为它们的语法类别,这可以揭示比仅通过单词可见的更高层次的句子结构。
我必须承认我对语法类别不是很在行,所以我不能对此进行明智的评论,但人类文本的一些标记包括:
- 人称代词(“we”,“us”)
- 存在句(“there”,“these”,当它们指向某物时)
- 情态动词(“should”,“can”)
- 疑问代词(“who”,“what”)
- 符号(像“geo”这样的缩写和像@符号这样的排版符号)
- 最高级(“latest”,“most”)
相比之下,机器人生成的评论包含更多的:
- 感叹词(“so”,“e.g.”,“yes”)
- 第三人称单数现在时动词(“affects”,“is”,“has”)
- 过去分词动词(“created”,“copied”,“associated”)
- 前限定词(“all”,“half”,“less than”)
- 小品词(“up”,“back”,“over”,当它们修饰前面的词时,如“start over”)
这暗示机器人生成的评论中明显的大量介词和方向词实际上可能起到小品词的作用,而不是介词和方向词。
也就是说,这是目前最弱的区分器,只有 54% 的准确率——仅比随机猜测好一点。
## 字符二元组(66%) (https://entropicthoughts.com/ai-comment-classifier#character-bigrams--66---)
我们可以不看单个字符的频率,而是看相邻两个字符组合的频率。这不是更高层次的抽象,但它确实更多地告诉了我们机器人和人类在单词构造和标点符号使用方面的差异。
从这个角度获得的主要发现是,机器人更频繁地以句号结束评论。我长期以来一直主张人类应该这样做³³部分原因是让读者知道评论是否被意外截断,但也是因为它迫使评论作者更好地构建句子,通常会提高评论质量。但他们还没有跟上,所以以句号结尾的评论是机器人生成评论的证据。
机器人在单词选择上也有一些奇怪的癖好,这些癖好在这个抽象层次开始显现。这些字符在机器人生成的单词的开头和结尾比在人类编写的单词中更常见:
- 以“re-”开头的单词(例如“report”、“recover”、“relocate”)。
- 以“co-”开头的单词(例如“coverage”、“config”、“copies”)。
- 以“st-”开头的单词(例如“store”、“stub”、“start”)。
- 以“-er”结尾的单词(例如“container”、“user”、“writer”)。
- 以“-al”结尾的单词(例如“terminal”、“individual”、“global”)。
- 也许还包括以“-k”和“-p”结尾的单词。
其中一些(对“re-”单词的偏好)我自己也注意到了,我愿意相信这可能是一个微弱的信号,最多。我推测机器人被诱使使用更有力的单词,而这些前缀和后缀可能更有力。
## 字符三元组(68%) (https://entropicthoughts.com/ai-comment-classifier#character-trigrams--68---)
一旦我们进入字符三元组,我们必须再次小心,因为字符三元组足够长,开始通过单词的部分捕捉主题差异。为了减少这种风险,我提取了几百个最具区分性的完整单词列表,并添加了一个预处理步骤,在将评论传递给三元组分析之前,删除了那些似乎泄露主题的内容。
通过字符三元组视角观察差异几乎没有提供新信息。在这里我们得知,机器人被训练使用“load”这个词(通过“oad”三元组),以及听起来像“surround”、“counter”和“account”的词(通过“oun”三元组)。
基于字符三元组的模型尽管没有揭示任何新东西却能获得如此高的准确率,是因为它也捕捉到了几乎所有前面层次的结果。三元组模型获得了我们通过字符频率、单词频率和二元组频率发现的许多相同信号。如果词汇量足够小且训练数据集足够大,它甚至可以检测到词性频率中的信号。
## 词性二元组(63%) (https://entropicthoughts.com/ai-comment-classifier#part-of-speech-bigrams--63---)
如果我们能从字符二元组中学习,也许我们也可以看看词性二元组。这是个好主意,因为从这里开始句子结构开始显现——这也是为什么词性二元组比单纯的词性频率提供更高准确率的原因。⁴⁴虽然应该指出词性标注代价高昂,并且仍然没有比单纯的字符频率有显著优势。
常见的词性二元组偏向人称代词和动词:
- 人称代词 + 动词或情态动词,如“we are”、“they should”、“we may”、“we can”、“we want”、“we deprecate”、“us have”。
- 限定词 + 动词,如“this guarantees”、“this is”、“this gives”。
- 人称动词 + to,如“want to”、“have to”、“move to”。
- 存在句 there + 动词,如“there is”、“these are”。
- 情态动词 + 动词,如“should be”、“can cause”、“will add”。
机器人生成的评论通过形容词更抽象,通过连词更复杂:
- 限定词、所有格或名词 + 形容词,如“an individual X”、“a single X”、“the only X”、“its border-right X”、“its vertical X”、“its already-persisted X”。
- 连词 + 限定词,如“and a”、“and the”、“or both”。
尽管我们可能从个人经验中认识到其中一些模式,但词性二元组本身并不是一个非常强大的模型。
## 词性三元组(65% 准确率) (https://entropicthoughts.com/ai-comment-classifier#part-of-speech-trigrams--65----accuracy-)
我们可以再进一步,查看连续的词性三元元组以捕获更多的句子结构。准确率比词性二元组没有提高多少,但我们可能会认识到许多人类和机器人的构造。
以下是一些人类风格写作的例子,其特点是大量使用动词和人称代词:
- “we may want”、“we can attach”、“they should upload”
- “want to store”、“have to solve”、“want to remove”
- “there is no”、“there is a”、“these are a”
- “since we do”、“after we apply”、“so we check”
- “we are looking”、“I’m guessing”、“we are determining”
- “we check the”、“we do no”、“we have a”
- “will trigger the”、“can have the”、“should cause no”
- “sends data for”、“tells users that”、“causes errors in”
相比之下,机器人生成的评论形容词丰富:
- “only difference is”、“first tab is”、“inner query aggregates”
- “col’s border-right”、“highlight’s vertical”、“layer’s already-persisted”
- “an individual checkbox”、“a single line”、“the only difference”
- “the original uploaded”、“a functioning green”、“the correct quick”
- “this flag is”、“the layout covers”、“this version does”
- “surround option affects”、“reporting service prints”、“state parameter contains”
- “thread reference autocomplete”、“used compression ratio”、“compared year title”
观察这些例子,似乎机器人也比人类使用更多的“大词”,但我还没有测试过。
## 所有特征一次输入(75%) (https://entropicthoughts.com/ai-comment-classifier#all-features-at-once--75---)
如果我们一次性将所有特征塞进模型,试图让它们消除冗余,那么剩下的特征按最具预测性的独立特征到最少预测性的顺序排列如下:
1. 机器人比人类更多地使用破折号。
2. 机器人比人类更多地使用连接性感叹词“so”。
3. 机器人比人类更多地以句号结束评论。
4. 机器人比人类更多地使用分号。
5. 机器人比人类更多地使用括号。
6. 机器人比人类更多地使用所有格形式“its”。
7. 机器人比人类更多地使用形容词。
8. 机器人比人类更多地使用单词“whether”。
在这前八个之后,其他预测器开始变得模糊,难以单独解释。我怀疑分类器的大部分能力并不来自单独的强大信号(如破折号和其他排版怪癖),而是来自其他信号的组合,这些组合共同描绘出一个连贯的图像。但这些组合可能因文档而异,它们不会像这样出现在单独的预测器列表中。
如果分类器在用户悬停在输入的某些部分时输出相关的特征组合,以便更好地了解分类器如何看待文本,这将是一个很酷的实验,但我还没有构建这个功能。
## 构建分类器的步骤 (https://entropicthoughts.com/ai-comment-classifier#steps-to-build-a-classifier)
构建任何分类器的第一步...