当用户刷到一条“AI 生成”的资讯、一段由大模型生成的配图或一段自动合成的视频时,平台如何用一个统一的标签让他快速识别?这正是 EU Icons for labelling AI-generated content 希望解决的问题:为 AI 生成内容提供一套可识别、可集成、可验证的视觉标签方案。作为开发者,理解这套标签的设计目的和集成方式,比单纯下载一张图片更重要,因为标签最终要进入真实的产品界面、内容流水线和多语言环境里运行。
本文会从设计语义、开发准备、Web 集成、移动端适配、合规验证、常见问题和最佳实践几个层面展开。文章里的代码和配置都以最小可运行示例为准,落地时再根据项目的技术栈、图标资产版本和业务场景调整。适合内容平台前端、全栈开发者、产品经理以及负责内容合规或 AI 应用集成的工程人员阅读。
1. 为什么 AI 生成内容需要统一的视觉标签
1.1 用户面对的内容不确定性
AI 生成内容正在以文字、图片、音频、视频等形态大规模进入内容平台。用户在浏览时面临一个很实际的问题:眼前这条内容到底来自真人创作,还是由模型生成?过去依赖肉眼判断并不可靠,因为高质量生成结果的细节越来越接近人工创作。
这也是为什么 AI 生成内容标签的意义不只是一个“小角标”。它给用户提供了一个判断上下文的关键信息,帮助用户在阅读、转发、二次创作时建立基本信任。没有这个信息,用户只能自己猜测来源,平台也难以对内容风险和生产链路做出区分。
1.2 从平台自律到可识别标准
在欧盟推动“塑造欧洲数字未来”计划的过程中,AI 生成内容的可识别性被逐步放在数字信任建设的重要位置。面向公众发布的 AI 生成内容,仅靠平台内部标记已经不够,还需要一套相对通用的视觉和机器可读表达方式,让不同平台、不同语言环境下的用户都能理解“这条内容由 AI 生成”。
EU Icons for labelling AI-generated content 正是这类探索的产物。它关注的不只是“放一个图标”,而是如何用统一的设计语言,把内容的生成方式外化为用户可以感知的信号。对开发者来说,这意味着标签需要遵守视觉规范,同时还要考虑国际化、可访问性、深色模式和机器可识别能力。
1.3 标签要解决的不只是“看起来存在”
一个合格的 AI 内容标签至少需要满足四个目标:
- 可见性:标签在界面中能被用户发现,而不是藏在某个需要点击展开的菜单里。
- 可理解性:用户看到标签后能知道它表示“由 AI 生成”,而不是误认为某种装饰。
- 一致性:同一套标签在桌面端、移动端、图片和视频场景中保持一致的语义和视觉表达。
- 可校验性:产品内部或外部工具能通过 DOM 属性、元数据或内容凭证确认该内容确实被标记过。
如果只把标签当作一个静态图片插入页面,后续的多语言、无障碍、深色模式、动态内容渲染都会出问题。因此,本文后面所有代码都围绕“可配置、可复用、可验证”来展开。
2. 标签图标的设计逻辑与视觉规范
2.1 图标语义:来源、生成属性与状态
在设计或集成 AI 标签时,首先要明确标签表达的核心信息:
- 来源:内容由 AI 工具生成,而不是人类拍摄或撰写。
- 生成属性:内容可能经过 AI 编辑、合成、扩写或完全生成。
- 状态:当前内容属于纯 AI 生成,还是人类与 AI 协作生成。
不同业务对这三种信息的展示程度不同。大多数内容平台只需要向用户展示“AI 生成”这一最基础状态;一些专业内容平台还会进一步区分“AI 辅助生成”和“AI 生成后人工审核”。因此,在设计组件时不要写死文案,而要把状态和文案都做成可配置项。
2.2 常见视觉表达方式
不同组织和平台对“AI 生成”表达方式并不统一。常见的设计元素包括:
- 字母组合:将 AI 两个字母放进图标或徽标中,直白且识别成本低。
- 像素点或网格:用离散数据点暗示“由程序计算生成”。
- 星形或闪烁符号:表达合成、非实拍、非自然形成。
- 徽章样式:带圆角背景容器,模拟平台认证标签的视觉习惯。
不同平台的最终选择会受自身设计语言影响。EU 相关设计资产最终以官方发布为准,集成前应到官方渠道核对是 SVG、PNG 还是字体图标,并保留版本信息。下面代码块里的 SVG 只是示意实现,用于说明封装思路,不代替官方资产。
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" focusable="false"> <rect x="1" y="1" width="14" height="14" rx="4" fill="currentColor" opacity="0.15"/> <path d="M5 11.5 6.5 4 9 12.5l2-8.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" fill="none"/> </svg>这段 SVG 示意了一个带圆角背景的字母风格图标。集成时把<path>元素替换成官方资产路径即可,整体组件结构可以保留。
2.3 颜色、尺寸和对比度
视觉标签最容易在集成阶段出现问题的是颜色对比度和尺寸。
从可访问性角度看,界面中的文字或图形需要与背景保持足够对比度。一般建议正文标签文字至少满足 4.5:1 的对比度,非文本图形元素至少满足 3:1。这意味着不能简单地在浅色图片上使用白色标签文字,也不能在深色背景下使用低亮度灰色。
推荐的做法是给标签一个不透明的背景容器,并在容器内使用明确的前景色。这样无论内容背景是照片、插画还是视频画面,标签都能保持相对稳定的可读性。
标签尺寸也要分场景:
- 信息流中的小尺寸标签:高度不小于 20px,文字字号不小于 10px。
- 文章详情或视频播放页标签:高度 24px 到 32px,视觉更明显。
- 移动端触控场景:如果标签本身可以被点击查看详情,建议点击区域不小于 24px,更方便操作。
2.4 标签文案的国际化和多语言
EU 标签面向的是多语言环境,因此文案不能写死在组件里。常见做法是在前端国际化字典中统一维护:
export const AI_LABEL_I18N = { en: 'AI generated', zh: 'AI 生成', de: 'KI-generiert', fr: 'Généré par IA', es: 'Generado por IA', ja: 'AI生成', ko: 'AI 생성' };组件内部根据当前语言读取对应文案。即使某些官方界面对应语种还没有定义文案,也建议先使用本地化资源文件占位,方便后续翻译补全。不要在图标的 SVG 内部写死文字,否则不同语言环境会非常难维护。
3. 开发前准备:资产、场景和依赖
3.1 获取官方图标资产并确认版本
集成前先确认官方图标的版权协议、文件格式和更新日期。不要直接从第三方博客或设计网站下载一份没有来源说明的图标文件,因为后续无法判断图标是否过期、是否被修改过。
建议把官方图标资产放入项目的assets/icons/ai-labelling/目录,并在 README 中记录下载地址、版本号和日期:
assets/icons/ai-labelling/ svg/ ai-label.svg ai-label-dark.svg png/ ai-label.png ai-label@2x.png ai-label@3x.png README.md如果官方只有 SVG,可以用脚本导出 PNG 和 WebP 等格式。如果官方同时提供 Font Icon,则需要评估项目是否已经使用字体图标体系,避免为了一个标签引入一套完整字体库。
3.2 明确集成场景
不同场景的集成方式差别很大,开发前先列出标签要出现的所有位置:
- 图文信息流卡片
- 文章详情页和图片来源说明
- 图片和短视频画面角落
- 音频节目简介
- 聊天机器人回复气泡
- 文档导出和 PDF 内嵌版本
- 外部分享卡片或 Open Graph 缩略图
场景越多,越需要把标签封装成统一组件,而不是在每个页面里复制粘贴样式。
3.3 最小环境依赖
如果项目是 React、Vue、Angular 等现代前端框架,标签组件不需要额外第三方依赖,使用原生 SVG、CSS 和一个组件文件即可。若需要自动检测内容是否来自 AI,则要接入后端接口或内容管理系统的元数据字段。
后端在返回内容数据时,建议增加统一字段,例如:
{ "id": "article_123", "title": "示例文章标题", "ai_generated": true, "ai_generation_type": "fully_generated" }前端根据ai_generated字段决定是否渲染标签。不要把判断逻辑写在前端里,因为前端无法可靠识别内容是否由 AI 生成,只能根据后端传递的元数据来展示。
4. 在 Web 应用中集成 AI 生成标签
4.1 使用官方 SVG 封装基础组件
以 React 为例,封装一个AILabel组件,支持尺寸、深浅色和自定义文案。这样的组件既能在信息流中使用,也能在文章页和视频封面中使用。
import type { CSSProperties, ReactNode } from 'react'; export type AILabelSize = 'sm' | 'md' | 'lg'; export type AILabelVariant = 'light' | 'dark' | 'outline'; export interface AILabelProps { text?: ReactNode; size?: AILabelSize; variant?: AILabelVariant; locale?: string; className?: string; style?: CSSProperties; } const SIZE_MAP: Record<AILabelSize, string> = { sm: 'ai-label--sm', md: 'ai-label--md', lg: 'ai-label--lg' }; export function AILabel({ text = 'AI generated', size = 'md', variant = 'light', className, style }: AILabelProps) { const classes = ['ai-label', SIZE_MAP[size], `ai-label--${variant}`]; if (className) { classes.push(className); } return ( <span className={classes.join(' ')} style={style}> <svg className="ai-label__icon" width="16" height="16" viewBox="0 0 16 16" role="img" aria-label={typeof text === 'string' ? text : 'AI generated'} focusable="false" > <rect x="1" y="1" width="14" height="14" rx="4" fill="currentColor" opacity="0.15" /> <path d="M5 11.5 6.5 4 9 12.5l2-8.5" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round" fill="none" /> </svg> {text ? <span className="ai-label__text">{text}</span> : null} </span> ); }组件中将 SVG 的aria-label设置为标签文案,屏幕阅读器可以读取。focusable="false"避免 SVG 被键盘单独聚焦。实际接入时把<path>替换为官方图标路径。
4.2 在内容卡片和文章详情中使用
内容卡片是标签最常出现的位置之一。推荐将标签放在卡片标题上方,或放在作者信息附近的元信息区,避免遮挡正文。一个简单示例如下:
export function ArticleCard({ article }: { article: Article }) { return ( <article className="article-card" >.ai-label { display: inline-flex; align-items: center; gap: 6px; padding: 2px 8px; border-radius: 999px; font-size: 12px; line-height: 1.2; font-weight: 500; white-space: nowrap; } .ai-label--sm { font-size: 10px; padding: 1px 6px; } .ai-label--lg { font-size: 14px; padding: 4px 12px; } .ai-label--light { color: #1a1a1a; background-color: #f0f0f0; border: 1px solid #d1d1d1; } .ai-label--dark { color: #f5f5f5; background-color: #2c2c2c; border: 1px solid #555555; } .ai-label--outline { color: inherit; background-color: transparent; border: 1px solid currentColor; }深色模式下不要只依赖透明度变化,要给标签一个不透明背景,确保叠加在复杂图片上时仍然可读。高对比模式下可优先使用outline变体,并允许系统级样式覆盖。
4.4 为爬虫和工具补充机器可读元数据
视觉标签解决用户识别问题,机器可读元数据解决工具和爬虫识别问题。在页面头部加入以下方式,可以实现一个项目内的统一约定:
<meta name="ai-generated" content="true" /> <meta name="ai-generation-type" content="fully_generated" />也可以使用 JSON-LD 结构化数据,让内容来源信息更容易被搜索引擎和第三方工具理解:
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "示例文章标题", "datePublished": "2025-01-01T10:00:00+08:00", "about": ["AI generated content", "labelling"] } </script>这里要注意:如果项目并没有接入官方结构化数据规范,就不要把自定义字段伪装成官方标准。>mobile/ ai-label-sm ai-label-md ai-label-lg
如果在图片底部叠加标签,不要把标签压在关键内容上。可以在图片边缘预留渐变遮罩,再放置标签,这样即使画面较亮,标签也保持可读性。
5.2 图片和视频画面上的标签叠加
图片和视频中的标签需要持续存在一段时间,而不是只在内容第一帧出现。视频场景建议在播放器控制栏或画面右上角叠加小尺寸标签,并确保标签不会随控制栏自动隐藏,或者至少每隔一段时间出现一次。
实现上可以使用播放器插件机制。以 HTML5 视频为例,在右上角加入一个绝对定位的标签元素:
<div class="video-wrap"> <video controls> <source src="example.mp4" type="video/mp4" /> </video> <span class="video-wrap__ai-label">AI 生成</span> </div>.video-wrap { position: relative; } .video-wrap__ai-label { position: absolute; top: 12px; right: 12px; z-index: 10; padding: 2px 8px; font-size: 12px; color: #ffffff; background: rgba(20, 20, 20, 0.7); border-radius: 999px; }这种方案适合视频本身没有内置水印的情况。如果希望标签在视频被下载后依然存在,则需要把标签烧录进视频画面,属于离线处理能力,通常由后端的音视频处理管道完成。
5.3 音频和聊天输出的文字标签
音频内容没有直观画面,标签只能出现在节目标题、简介、播放器列表和分享卡片上。如果音频是 AI 合成语音,建议在简介中明确标注,并在播放器界面的标题下方显示小标签。
聊天机器人和 AI Agent 输出场景则更特殊。用户每次看到 AI 回复时,都可以在气泡中使用小标签区分,例如“AI 生成”。这个标签不应该被复制到下一轮上下文中,属于纯展示信息。比较好的做法是在前端渲染时根据会话消息上的ai_generated字段决定是否展示,不要试图在对话文本中插入不可见字符。
6. 运行验证:从功能到合规检查
6.1 可视化检查
集成完成后,先进行人工可视化检查,检查内容包括:
- 标签是否在真实页面上显示,而不是只在设计稿中显示。
- 标签是否遮挡标题、作者、正文或图片有效信息。
- 浅色和深色模式下对比度是否足够。
- 鼠标悬停、键盘聚焦和移动端点击时样式是否稳定。
- 多语言切换后是否出现文字截断。
建议在开发环境同时准备浅色和深色两套界面,并在手机上检查真实渲染效果。
6.2 可访问性与对比度检查
标签是强语义信息,不能只让视力正常的用户看到。可以通过浏览器自动化测试验证标签是否存在于无障碍树中。
使用 Playwright 可以写一个最小检查用例:
import { test, expect } from '@playwright/test'; test('AI label is visible and accessible', async ({ page }) => { await page.goto('/articles/ai-demo'); const label = page.locator('.ai-label'); await expect(label).toBeVisible(); const svg = label.locator('svg'); await expect(svg).toHaveAttribute('role', 'img'); await expect(svg).toHaveAttribute('aria-label', /AI/); });同时可以使用@axe-core/cli对页面做自动化无障碍检查,重点关注颜色对比度问题:
npx @axe-core/cli https://example.com/articles/ai-demo --rules color-contrast该命令会输出页面中对比度不达标的元素列表,方便定位到标签或相邻文字。
6.3 元数据和检索验证
机器可读元数据是否正确,需要检查渲染后的 DOM 和页面源码。
- 页面头部是否存在
<meta name="ai-generated">。 - 内容卡片上是否存在
>curl -I https://example.com/assets/icons/ai-labelling/svg/ai-label.svg如果返回 404,检查构建日志和源文件路径。建议在组件中直接以 import 方式引入 SVG,交给打包工具生成带 hash 的静态资源地址,避免手写路径。
7.2 颜色和样式被全局 CSS 覆盖
现象:标签在本地预览正常,进入线上页面后文字颜色变成白色、背景消失。
可能原因:
- 全局 CSS 设置了
svg { fill: ... }或span { color: ... },覆盖了组件内联样式。 - CSS 类名冲突,组件类名被业务样式覆盖。
- 构建时样式顺序不稳定。
检查方式:
打开开发者工具查看
.ai-label的计算样式,看看哪些规则在起作用。优先提高组件样式优先级,或者使用 CSS Modules、BEM 命名等隔离方式。避免在全局层面使用*和svg这类宽泛选择器直接改变 SVG 颜色。7.3 标签被容器裁剪或遮挡
现象:标签显示一半,或者被图片、视频控件挡住。
可能原因:
- 父容器设置了
overflow: hidden,宽度不够时标签被裁切。 - 标签的
z-index低于视频控制层。 - 在弹性布局中,标签宽度被其他元素挤压。
检查方式:
在开发者工具中移除父容器的
overflow或给标签临时加高z-index,确认是否恢复显示。生产环境建议使用flex-shrink: 0和white-space: nowrap,避免标签被压缩换行。7.4 自动化测试通过但人工检查失败
现象:Playwright 测试显示标签存在,但人工看不出明显标签。
可能原因:
- 标签文字与背景对比度过低,截图检查很难发现。
- 标签被放置到页面底部或折叠区域。
- 视频场景中标签只在首帧显示,播放后消失。
检查方式:
人工检查时要覆盖真实内容流、长页面滚动、视频播放 10 秒以上。自动化测试不仅要检查存在性,还要用视觉回归工具对标签位置进行截图对比,确保关键页面在版本迭代中不会悄悄丢失标签。
7.5 排错优先级和速查表
遇到标签相关问题,建议按这个顺序排查:
- 确认接口或元数据里是否真的有
ai_generated=true。 - 确认标签组件是否进入了渲染条件分支。
- 确认图标文件是否存在于产物目录。
- 确认 CSS 是否被覆盖。
- 确认标签是否被容器裁切或遮挡。
- 确认是否因多语言缺失导致文案为空。
问题现象 常见原因 检查方式 处理建议 标签不显示 接口无字段或组件未渲染 查看网络请求和页面 DOM 后端补字段,前端判空处理 SVG 404 静态资源未同步 curl 资源地址 用 import 方式引入资源 颜色被覆盖 全局 CSS 优先级更高 查看计算样式 使用 CSS Modules 或提升类名优先级 标签被裁剪 容器 overflow 移除 overflow 试验 修改布局或增加 flex-shrink 文案为空 缺少语言资源 切换 locale 查看 补齐 i18n 文件 视频标签消失 标签随控制栏隐藏 播放视频观察 固定标签或定时显示 8. 最佳实践与后续扩展
8.1 把标签写进内容生产流水线
标签不应该由运营或编辑在发布时手动添加,而应该在内容生成、上传、审核、发布的链路中自动写入。常见做法是:
- 内容生成服务调用大模型后,把生成结果标记为
ai_generated=true。 - 内容审核服务通过后,保留原始标记,不覆盖、不丢失。
- 发布服务把该字段同步到数据库、搜索索引和 CDN 缓存。
- 前端渲染时读取该字段并自动显示标签。
如果图片、视频、音频经过多轮处理,还要确保处理管道能把来源属性透传下去。比如 AI 生成的图片被压缩、裁剪后,如果处理服务不保留元数据,前端就无法知道它仍属于 AI 生成内容。
8.2 可视化标签与机器可读信息同步
标签的视觉展示和机器可读信息必须来自同一数据源。不要出现页面上显示“AI 生成”,但 HTML 源码和接口中没有“ai-generated”字段的情况。否则用户会认为平台在诚实标注,但外部工具和后续合规审计无法验证。
在项目内部,可以定义统一的字段规范:
{ "ai_generated": true, "ai_generation_type": "fully_generated", "ai_editor": "text-to-image-model-v2" }如果后续标准更新,只需在数据层和组件层同步适配,不需要每个页面分别修改。
8.3 与 AI Agent 输出管道结合
AI Agent 应用越来越多,Agent 的每条回复、每个生成文档、每次自动调用工具后的总结成果,都应该考虑是否带上“由 AI 生成”的标签。尤其是在 Agent 输出被用户直接采集、上传到知识库或再次发布到平台的时候,来源标记能够保留内容溯源信息。
对于 Agent 应用,建议在消息模型层面增加生成源字段,而不是在 UI 层做规则判断:
interface AgentMessage { id: string; role: 'user' | 'assistant' | 'tool'; content: string; aiGenerated?: boolean; toolSource?: string; }这样前端可以稳定判断哪些消息需要展示标签,哪些消息是用户历史输入。
8.4 关注标准演进和生态集成
AI 内容标签领域还在持续演化,不同组织和平台可能采用不同规范。开发者在落地时,要关注官方图标资产是否更新、机器可读元数据是否有新的行业标准,以及浏览器或社交平台是否对
<meta>标签提供原生支持。在标准尚未完全统一之前,不建议把关键判断逻辑绑定在某个平台的临时字段上。更稳妥的方式是让项目内部有一个抽象层,例如统一的
AIMetadata类型,后端适配不同来源的数据格式,前端只依赖这个抽象层渲染标签。8.5 开发者可复用的落地清单
最后整理一份可以直接贴到团队需求文档中的落地清单:
- 从官方渠道获取图标资产,并记录版本号和来源地址。
- 将标签封装为可复用组件,支持尺寸、颜色、语言配置。
- 后端内容接口增加
ai_generated字段,并保持历史数据可追溯。 - 信息流、详情页、图片、视频、音频和聊天输出均评估标签位置。
- 标签组件满足基本可访问性要求:SVG 有
role="img",文案有对比度保障。 - 页面 HTML 至少提供一种机器可读标记,例如
>
- 全局 CSS 设置了