用 Gemini 构建大规模内容审核系统
DEV 社区展示如何用 Google Gemini 进行垃圾内容检测,是 AI 在生产环境中的实战案例。
DEV 社区展示如何用 Google Gemini 进行垃圾内容检测,是 AI 在生产环境中的实战案例。
消除垃圾内容一直是 DEV(以及更广泛的 Forem 生态系统)的重中之重。如果你长期关注我们,应该还记得,这在过去曾是一个相当严重的问题。虽然没有任何平台能够宣称自己完全不存在垃圾内容,但如今的情况已经有了显著改善。
我们近期这些更新的首要目标很简单:在人工 Moderator 不得不处理之前,就将极低质量的内容移出平台。
Moderator 倦怠是真实存在的。通过自动移除那些“一眼就能看出来”的垃圾内容,我们可以让 Moderator 专注于需要细致判断的社区互动,而不是删除成百上千篇加密货币诈骗帖子。
我们并不依赖单一工具,而是将上游算法检测与“调用” Gemini 进行独立分析结合起来。
上游算法处理: 如果我们检测到明显趋势——例如,短时间内突然出现大量指向某个特定垃圾网站的帖子——就会在上游采取行动。我们更倾向于高效处理这类情况,而不需要针对每一个实例都查询一次 LLM。
Gemini 分析: 对于需要判断的单篇帖子,我们会向 Gemini 3 发送定制 prompt。我们会尽量避免出现任何误判;但当 AI 检测到明确的垃圾内容或有害内容特征时,它就会添加一个 label,从而触发自动化工作流。
为了让你更清楚地了解其技术实现,我们来看看 ContentModerationLabeler 服务。这个 Ruby 类负责构建上下文,并要求 Gemini 对帖子进行分类。
我们会持续打磨这些定制 prompt,以确保准确性。下面是我们在 prompt 中定义评估标准的方式。我们会明确告诉 Gemini 需要寻找什么,并区分“安全性”“质量”和“垃圾内容”:
def build_prompt
# ... (Context setup)
<<~PROMPT
Analyze the following article and assign it a content moderation label based on quality, relevance, and community standards.
# ...
**Assessment Criteria:**
1. **Safety First**: Is the content harmful, exploitative, or inciting violence/hostility?
2. **Content Quality**: Is the content well-written, informative, and valuable?
3. **Community Relevance**: Does the content align with the community's purpose and interests?
4. **Authenticity**: Does the content appear to be written by a real person with genuine insights?
5. **Spam Indicators**: Are there signs of promotional content, low-effort posts, or automated generation?
6. **Community Building**: Does the content foster discussion and community engagement?
# ...
PROMPT
end
我们取得成功的一个关键在于,并非只把文章文本发送给 Gemini。我们还会构建用户上下文(User Context)。
一篇看起来“没什么问题”的帖子,如果来自一个没有任何历史记录的全新账号,实际上可能是垃圾内容。反过来,一位拥有 badge 和多年历史记录的可信成员,则会获得更多信任。我们会把这些指标加入 prompt,让 Gemini 掌握完整情况:
def build_user_context
user = @article.user
<<~USER_CONTEXT
Author: #{user.name} (@#{user.username})
Member since: #{user.created_at.strftime('%B %Y')}
Badge achievements: #{user.badge_achievements_count}
Articles published: #{user.articles.published.count}
Comments made: #{user.comments.count}
Profile summary: #{user.profile&.summary || 'No summary provided'}
USER_CONTEXT
end
在 GitHub 上查看 ContentModerationLabeler
我们从数据中发现了一个有关垃圾内容数量的有趣现象。颇具讽刺意味的是,累计被标记为垃圾内容的数量,恰好在我们全面集成这些新系统之前达到了峰值。垃圾内容的峰值出现在 2025 年夏季。
出现这种情况,是因为威慑确实有效。一旦恶意行为者意识到,他们的自动化脚本撞上了一堵高墙,发布的帖子也会立即被我们的自动化系统彻底清除,他们就不会再继续浪费资源攻击我们的平台。较高的准入门槛,会让尝试次数随着时间推移逐渐减少。
这套系统还会继续演进。我们正在不断调整 prompt 和上游算法,以适应新的垃圾内容策略。
虽然平台上还有多个服务分别负责处理不同类型的垃圾内容,但你可以在我们的开源代码仓库中查看这一特定方案的完整源代码:
为了赋能社区 🌱
欢迎来到 Forem 代码库——它正是驱动 dev.to 的平台。我们非常高兴你的到来。在你的帮助下,我们可以进一步提升 Forem 的易用性、可扩展性和稳定性,从而更好地服务我们的社区。
Forem 是一款用于构建社区的开源软件。无论是同行、客户、粉丝群体、家人、朋友,还是任何人们需要聚在一起、成为某个集体一员的时间与空间,都可以使用它来创建社区。请参阅我们的公告文章,从宏观层面了解 Forem 是什么。
dev.to(简称 DEV)由 Forem 托管。这里是一个软件开发者社区,开发者们撰写文章、参与讨论,并建立自己的职业档案。为了帮助所有成员写出优秀代码并实现职业成长,我们重视相互支持且富有建设性的对话。这个生态系统涵盖从初学者到高级开发者的所有阶段,欢迎每个人在这里找到属于自己的位置……
部分评论可能仅对已登录的访问者可见。请登录以查看所有评论。
如果要采取进一步行动,你可以考虑屏蔽此人和/或举报滥用行为。