想象你是南太平洋上一支远洋渔船队的船长。眼前的海图是一片从未被完整探索过的海域——这就是 AI 模型的输入空间。新手渔民总爱在熟悉的浅滩反复下网,捞上一船沙丁鱼,却对深海里的怪物一无所知。真正的行家知道:最能掀翻船只的,不是常见鱼群,而是藏在深水、礁缝和冷暖洋流交汇处的“怪鱼”。它们平时几乎不露面,一旦撞上,就是船毁人亡。在 AI 安全测试里,这些“怪鱼”就是边缘用例(edge case)。本文要讲的核心,就是如何像一支聪明的船队那样,通过“用例自动生成”系统地织网、下饵、巡航,把罕见的危险输入提前捞上岸——而不是等它们撞沉用户的船。我们将从基础概念出发,学原理、挑工具、定标准、上流水线、省油耗,最后复盘几起真实“海难”。

岗位关联

对 AI 从业者而言,掌握自动化的边缘用例发现,意味着在模型上线前主动排雷,把“用户在线上踩雷”变成“工程师在测试期拆弹”,这是 AI 安全评测岗位的核心技能之一。

目录
  1. 可视化演示
  2. 基础概念
  3. 生成原理
  4. 关键算法
  5. 评测基准
  6. 工程实践
  7. 优化策略
  8. 案例剖析
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示变异式生成流水线、五种生成策略覆盖率对比及测试用例质量度量体系,直观呈现AI安全测试中的自动化用例生成机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

变异式生成流水线 种子输入经同义词替换/字符扰动/句式改写生成变体 变体经自动判言筛选出有效测试用例 Variants = Mutate(Seed, Operators) 保持语义接近探索输入邻域

基础概念

想象你接管了一支远洋渔船队,手里只有一张空白海图。海图上的每一寸水域,对应着 AI 模型可能看到的一种输入——这就是输入空间。老渔民都听过这样的故事:有的船在近海风平浪静,一出远洋就撞上从没见过的怪鱼,船员连名字都叫不出来。这类“平时见不到、遇到就出事”的输入,就是边缘用例。

边缘用例的定义并不神秘:它们在输入空间中出现的概率极低,分布稀疏,却能把模型推到失败模式上。所谓失败模式,是指模型输出错误、崩溃、被诱导或产生不安全内容的典型方式——就像怪鱼伤人的不同姿势:有的咬断缆绳,有的撞破船底,有的放出毒刺。

按成因,失败模式大致可分成几类:分布外输入(OOD),指输入偏离训练数据分布,如给只见过晴天照片的模型一张暴风雪图;对抗扰动,指人眼难以察觉的微小修改却能彻底改变输出;歧义样本,指输入本身模棱两可;还有罕见组合,指每个特征单独看都正常,组合起来却成了“毒药”。自动生成用例的核心价值,就是把这些被动等待的风险变成主动排查:与其等用户在线上撞见 bug,不如在测试期就织网去打捞。

知道海有多大、怪鱼长什么样,船队才能决定往哪儿开、用什么网。下一节,我们看看聪明的船长们是如何给这张海图做记号的。

∣X∣=∏i=1d∣Ai∣|X| = \prod_{i=1}^{d} |A_i|
这个公式算的是“这片海有多大”:把输入的每一维特征看成一个方向,每个方向上有多少种可能取值,全部乘起来就是输入空间的总大小。维度一多,空间会爆炸式膨胀——这正是边缘用例“难找”的数学根源。
  1. 输入集合$X$ 表示模型全部可能输入的集合,竖线符号 $|X|$ 取其元素总数。
    XX
  2. 特征维度$d$ 是输入的维度数,维度越大,输入空间的组织越复杂。
    dd
  3. 单维取值数$|A_i|$ 是第 $i$ 维特征上可取值的总数,如像素通道有 $256$ 种取值。
    ∣Ai∣|A_i|
  4. 连乘组合$\prod_{i=1}^{d}$ 把所有维度的取值数依次相乘,得到全部输入组合的数量。
    ∏i=1d∣Ai∣\prod_{i=1}^{d} |A_i|

生成原理

经验丰富的船长有个铁规矩:每次下网都在海图上画一个记号,已经标记过的水域不许反复撒网,必须优先去空白区。这套规矩翻译成技术语言,就是覆盖率驱动(coverage-driven):把输入空间划分成若干区域,生成器每产出一个用例,就检查它命中了哪些未覆盖区域,并优先补齐空白。

光有海图还不够,还得防止整支船队挤在同一个海湾。多样性探索用距离度量(如文本的编辑距离、图像的像素差、向量的余弦相似度)强制新用例和已有用例保持差异;对已经出现过的输入,要么直接丢弃,要么施加更强的变异,逼生成器“换个地方下网”。

真正让船队变聪明的,是反馈循环:把模型对已生成用例的反应当作“鱼讯”——出错越严重的区域,说明鱼越大,下次就往那个方向多下几网。生成器、执行器、模型评估三者形成环路,每轮迭代都调整下一批用例的分布。当多轮下来既没有新区域被覆盖、也没有新失败用例出现,说明该收网了——这就是迭代收敛策略。

有了海图的画法,还得有趁手的渔具。四种主流渔网,就是下一节的四种关键算法——它们各有脾气,也各有绝活。

C=NcoveredNtotalC = \frac{N_{\text{covered}}}{N_{\text{total}}}
覆盖率 $C$ 是“海图完成度”:已探索区域数除以总区域数。它衡量生成器把网撒得多广,是判断是否该换策略、是否该停止的核心指标之一。
  1. 已覆盖计数$N_{\text{covered}}$ 是至少被一个测试用例命中过的分区数量,相当于海图上画过记号的水域。
    NcoveredN_{\text{covered}}
  2. 分区总数$N_{\text{total}}$ 是输入空间被划分出的区域总数,由覆盖粒度决定。
    NtotalN_{\text{total}}
  3. 覆盖率计算两者相除得到覆盖率 $C$,值域在 0 到 1 之间,越接近 1 说明探索越全面。
    NcoveredNtotal\frac{N_{\text{covered}}}{N_{\text{total}}}

关键算法

船队的工具舱里躺着四件传家宝。第一件是“盲撒网”——随机模糊测试(Fuzzing)。它不管海况,随机生成大量输入一股脑砸向模型,成本极低、覆盖很广,但方向全靠运气,命中率低得可怜。

第二件是“变装饵”——变异测试(Mutation Testing)。抓一条已知的种子输入,通过替换、插入、删除、拼接等操作改变它,就像把上好的鱼饵染成怪颜色、泡上奇怪气味,诱使潜伏的怪鱼咬钩。种子质量直接决定变种的上限,所以选种子本身是门学问。

第三件是“猎食鱼”——对抗生成网络(GAN)。生成器和判别器互相较劲:生成器负责编造越来越像真的样本,判别器负责分辨“这是真数据还是编的”,两方在对抗中共同进化,最终生成器能针对模型弱点定制出最刁钻的输入。第四件是“进化筛选”——进化搜索(Evolutionary Search):把一批种子当成“鱼饵种群”,按模型反馈打分,淘汰差的、保留好的,再杂交变异,一代代迭代出最能触发失败的样本。

网撒下去,捞上来的不一定是鱼,可能是海草、旧靴子,甚至是成群的塑料垃圾。怎么鉴定战果、怎么给鱼分等级?船要靠港了——下一节是码头的鉴定师。

P=1−(1−p)nP = 1 - (1 - p)^{n}
这个公式回答“盲撒网到底靠不靠谱”:假设每个随机用例命中失败区域的概率是 $p$,那么连撒 $n$ 网,至少捞到一条怪鱼的概率是 $P$。它说明随机方法的极限——$p$ 太小而 $n$ 不够时,几乎等于白忙活。
  1. 单次命中率$p$ 表示随机生成的一个用例恰好落入失败区域的概率,在高维稀疏空间中它通常极小。
    pp
  2. 连续落空概率$(1-p)^{n}$ 表示 $n$ 个随机用例全部没有命中失败区域的概率。
    (1−p)n(1-p)^{n}
  3. 至少命中一次用 1 减去全部落空的情况,得到 $n$ 次尝试中至少发现一个边缘用例的概率 $P$。
    1−(1−p)n1 - (1-p)^{n}

评测基准

船队回港,码头上早有鉴定师等候。他们手里有三件工具:第一件是“标准鱼谱”——基准测试集,一组公认的、覆盖已知危险模式的输入集合,用来做对照:新模型在鱼谱上表现如何,和旧模型比是进步还是退步。

第二件是“刻度尺”——覆盖率指标。它把生成器的工作量化:跑了多少区域、命中多少种失败模式、新增了多少有价值用例,全是可比较的数字。第三件是“分级标签”——严重程度分级。鉴定师不会把鲨鱼和沙丁鱼同等对待,而是按致命、高危、中危、低危分级:致命级会直接导致安全事故、财产损失或有害内容外发,优先级最高;低危只是轻微质量瑕疵,可以慢慢修。

最考验鉴定师功力的是“误报分析”。有些捞上来的东西看着吓人,其实是漂在水面的烂木头——即被自动判定为“失败”、但人工复核后模型行为完全正常的用例。误报太多会耗尽工程师的耐心,所以需要抽样人工复核、和人工标注组(triage)配合,把噪音滤掉,只留真问题。

鉴定完毕,鱼获入库。但一支正规船队不会只在出海时才有流程——母港的调度、航班表、账本才是持续运转的关键。这就是工程实践。

S=∑kwk×nkS = \sum_{k} w_{k} \times n_{k}
这是“风险账本”的算法:每种严重级别对应一个权重,把各级别的用例数量乘上权重再加总,就得到整体风险分 $S$。它让“发现了多少问题”从一堆数字变成一个更有意义的综合指标。
  1. 分级计数$n_{k}$ 是第 $k$ 个严重级别下发现的用例数量,比如致命级 3 个、高危级 12 个。
    nkn_{k}
  2. 权重设定$w_{k}$ 是该级别的权重,级别越高权重越大,体现危害的放大效应。
    wkw_{k}
  3. 加权求和$S$ 是把每个级别的数量和对应权重相乘后全部相加得到的综合风险分。
    ∑kwk×nk\sum_{k} w_{k} \times n_{k}

工程实践

一支成熟的远洋船队,靠的不是船长一个人的英明,而是母港体系:有标准的甲板作业流程、有固定的航班表、有每一笔鱼获的账本。在 AI 评测中,这就是把用例自动生成做成流水线工程。

自动化框架把“数据准备 → 用例生成 → 模型执行 → 结果评定 → 归档”串成一条自动流水线,工程师只需配置好策略和预算,剩下的交给调度器。CI 集成让这条流水线定期巡航:每次模型更新、每次发版前,自动跑一批新生成的边缘用例,像例行体检一样防止回归。

调度策略决定先测什么:按上次评测的风险分布排序,高危区域优先,资源紧张时宁可少测低危区域。结果管理则把每个用例、模型输出、标注结论、复现脚本统一存档,形成可追踪、可回放、可对比的“鱼获台账”——出了问题能定位到是哪一网捞上来的。

船队再大,油耗也有限。在燃料和预算面前,老船长们总结出一套精打细算的心法——优化策略。

T=NttotalT = \frac{N}{t_{\text{total}}}
吞吐量 $T$ 衡量流水线“单位时间能处理多少用例”。它提醒我们:生成再聪明,如果执行和归档跟不上,船队照样堵在港口。
  1. 用例总量$N$ 是一个评测周期内生成并执行完的用例总数。
    NN
  2. 总耗时$t_{\text{total}}$ 是从生成、执行到归档的全部时间消耗。
    ttotalt_{\text{total}}
  3. 吞吐量计算两者相除得到吞吐量 $T$,衡量流水线单位时间的处理能力。
    Nttotal\frac{N}{t_{\text{total}}}

优化策略

老船长最恨两件事:捞到重复的鱼,和在没鱼的水域空烧油。优化策略解决的就是这两个问题。去重合并:对生成结果做哈希去重和相似度聚类,把相互重复、差异微小的用例合并,只留下最有代表性的一条——既省执行时间,也避免评测报告被无意义的重复用例灌水。

种子选择:变异测试的变种质量上限由种子决定。好的种子本身就是“接近失败区域”的样本,经过变异能快速引爆更多问题;反之,普通种子变异半天也掀不起浪。做法上可以维护一个“历史上触发过失败”的种子库,优先从库里选种、轮回补充。并行加速:多艘船同时在不同水域下网,即多进程、多 GPU 并行执行生成与评测,把吞吐量成倍拉高;代价是资源争抢,需要给每个任务设独立预算,防止一条流水线饿死其他任务。

预算控制:给每次生成设定燃料上限——时间预算或算力预算。当覆盖率收敛、连续多轮没有新失败用例、或预算耗尽时,果断收网。无休止的探索不仅烧钱,还会让评测结果失去焦点。

理论和工具都齐了。收起海图,看看真实海域里发生过的几起“海难”——它们是自动生成用例最值得投入的战场。

D=1−NdupND = 1 - \frac{N_{\text{dup}}}{N}
多样性指标 $D$ 是“鱼获不重复程度”:1 减去重复用例占比。$D$ 越接近 1,说明这轮渔获越丰富,羊毛没白薅。
  1. 重复数量$N_{\text{dup}}$ 是本轮生成结果中被判定为互相重复的用例数量。
    NdupN_{\text{dup}}
  2. 生成总数$N$ 是本轮生成的用例总数,包含重复与不重复。
    NN
  3. 多样性比例$D$ 用 1 减去重复占比,得到去重后保留的独特性比例,用来评估生成策略是否在有效产出。
    1−NdupN1 - \frac{N_{\text{dup}}}{N}

案例剖析

第一起海难:大模型幻觉。模型像一位过于自信的渔夫,明明网里空空,却绘声绘色地向你描述一条根本不存在的鱼。用自动生成的方式构造“事实性矛盾”“常识冲突”“虚构概念”的提问,能批量钓出这类幻觉,帮助团队定位知识边界和质量短板。

第二起海难:图像识别对抗。在照片上叠加人眼几乎察觉不到的噪声,能让模型把“校车”认成“鸵鸟”。这类对抗样本通常用梯度方法生成,最经典的 FGSM 公式如下:沿着损失上升最快的方向加一点扰动,模型输出就被彻底带偏。

第三起海难:NLP 鲁棒性与语音噪声。把“这是个傻公司”改写成拼音、谐音、同义词,安全过滤器可能瞬间失明;给语音识别加上背景音乐、方言口音,识别结果可能完全变味,进而带坏下游意图识别。这些场景都能用变异生成器自动制造——改几个字、加一段噪、换一种口音,边缘用例就源源不断。

复盘这几起“海难”,我们发现共同规律:每一个能用自动生成撞出来的问题,都不该等到用户来撞。织好网、画好图、定好标、跑起来、控好成本——这就是边缘用例发现这门手艺的全貌。

xadv=x+ϵ×sign⁡(∇xL(x,y))\mathbf{x}_{\text{adv}} = \mathbf{x} + \epsilon \times \operatorname{sign}\left(\nabla_{\mathbf{x}} L(\mathbf{x}, y)\right)
FGSM 是“化妆术”的数学版:给原始图片 $\mathbf{x}$ 化上一层人眼看不见的妆($\epsilon$ 控制浓淡),方向选在能让模型损失飙升的方向上,化完妆的 $\mathbf{x}_{\text{adv}}$ 就会骗过模型的判断。
  1. 原始输入$\mathbf{x}$ 是模型的原始输入样本,比如一张图片展平后的像素向量。
    x\mathbf{x}
  2. 损失梯度$\nabla_{\mathbf{x}} L$ 是损失函数对输入求出的梯度,梯度指向“往哪个方向修改输入,模型损失上升最快”。
    ∇xL\nabla_{\mathbf{x}} L
  3. 符号取向$\operatorname{sign}(\cdot)$ 把梯度压缩成方向符号,只保留正负号、丢掉大小。
    sign⁡(∇xL)\operatorname{sign}(\nabla_{\mathbf{x}} L)
  4. 扰动叠加$\epsilon$ 控制扰动幅度,方向乘上幅度后叠加到原始输入上,就得到对抗样本 $\mathbf{x}_{\text{adv}}$。
    x+ϵ×sign⁡(∇xL)\mathbf{x} + \epsilon \times \operatorname{sign}(\nabla_{\mathbf{x}} L)

AI 应用场景

大模型上线前的红队安全测试

阶段:AI安全测试(上线前红队评测)

解决的问题:人工红队写攻击提示词又慢又贵,覆盖有限;用变异生成 + 进化搜索自动生成越狱提示词、诱导性提问,能在模型部署前成百上千倍地扩大攻击面,把高危漏洞暴露在发布之前。

具体案例:某大模型团队在部署前,用种子提示词 + 同义替换、角色切换、编码变形等变异算子自动生成 10 万条对抗性对话,安全拦截率从 64% 提升到 91%,还提前发现了 3 类从未见过的高危越狱方式,成功阻止了一次“带病上线”。

自动驾驶感知模型回归门禁

阶段:持续集成与基准测试

解决的问题:真实路采数据成本高,难以覆盖雨雾、逆光、罕见障碍物等组合场景;通过程序化仿真 + 对抗扰动自动生成极端天气和刁钻视角下的图像,在 CI 阶段对感知模型做回归门禁,防止新版本“修好一个 bug 又瞎一只眼”。

具体案例:某自动驾驶团队在 CI 流水线中加入自动生成的夜间雨雾场景集,目标检测模型在一轮迭代中 mAP 掉了 4 个点,正是由于新结构对低光照不敏感,问题在合入主干前就被拦下。

智能客服的内容风控

阶段:上线后持续监控与迭代

解决的问题:敏感词变体(谐音、拆字、拼音、表情包伪装)无穷无尽,人工维护黑名单永远慢半拍;用字典变异自动生成违禁词变体,定期补充风控规则,大幅压低漏检率。

具体案例:某电商客服系统部署了自动变体生成器,每周自动产出 5 万条敏感词变体并推送审核,将违规内容漏检率降低了 70%,同时把审核人力从 12 人降到 4 人。

Python 演示

python75 行
import random class SimpleToxicityDetector:    """A minimal toxicity detector: word-list hit means toxic. For demo only."""     def __init__(self, toxic_words):        self.toxic_words = toxic_words        self.gc_count = 0     def predict(self, text):        score = sum(1 for w in self.toxic_words if w in text)        self.gc_count += 1        return "toxic" if score >= 1 else "safe"  class EdgeCaseFuzzer:    """Edge-case generator: word-level mutation on seeds to produce risky inputs."""     def __init__(self, seeds, dictionary, detector):        self.seeds = seeds        self.dictionary = dictionary        self.detector = detector        self.generated_count = 0     def mutate(self, text):        words = text.split()        if not words:            return text        idx = random.randrange(len(words))        action = random.choice(["swap", "insert", "delete", "replace"])        if action == "swap" and idx + 1 < len(words):            words[idx], words[idx + 1] = words[idx + 1], words[idx]        elif action == "insert":            words.insert(idx, random.choice(self.dictionary))        elif action == "delete":            del words[idx]        else:            words[idx] = random.choice(self.dictionary)        return " ".join(words)     def generate(self, rounds=30, mutants=2):        for _ in range(rounds):            sample = random.choice(self.seeds)            for _ in range(mutants):                sample = self.mutate(sample)            self.generated_count += 1            yield sample  def main():    detector = SimpleToxicityDetector(["bad", "stupid", "idiot"])    fuzzer = EdgeCaseFuzzer(        seeds=["you are a good helper", "please help me with my homework",               "this product is amazing and useful"],        dictionary=["bad", "very", "not", "stupid", "great", "slow", "fast"],        detector=detector,    )    hit = 0    total = 0    print("=== Auto-generate edge cases and evaluate ===")    for i, case in enumerate(fuzzer.generate(30, 2), 1):        label = detector.predict(case)        total += 1        is_hit = label == "toxic"        if is_hit:            hit += 1        mark = " <-- HIT" if is_hit else ""        print(f"#{i:02d} [{label}] {case}{mark}")    print(f"\nTotal {total} cases, hit {hit}, hit-rate {hit / total:.1%}")    print(f"Model predict called {detector.gc_count} times")  if __name__ == "__main__":    random.seed(42)    main()
目的:演示一篇完整的“边缘用例自动发现”小循环——用词级变异从种子文本生成新输入,喂给一个玩具毒性检测器,统计命中失败的用例比例。
  1. class SimpleToxicityDetector:定义一个极简的“被测模型”,词表命中即判为 toxic,用来模拟 AI 模型的输入输出接口。
  2. def predict(self, text):模型推理入口:输入一段文本,返回安全或毒性标签,并用 self.gc_count 统计调用次数。
  3. class EdgeCaseFuzzer:边缘用例生成器:持有种子库、变体词表和被测模型,是“船队”的大脑。
  4. action = random.choice(["swap", "insert", "delete", "replace"])每次变异随机选择一种“改饵手法”:交换、插入、删除或替换词,保证变种多样性。
  5. sample = self.mutate(sample)对同一个种子连做多次变异,模拟“层层变装”逼近失效区域。
  6. label = detector.predict(case)把生成的用例喂给模型,得到反馈——这就是“模型反馈循环”的最小实现。
  7. hit += 1当模型输出 toxic 说明找到了“怪鱼”,累计边缘用例命中数,最后算出命中率。

常见误区

误区我只要随机生成几百万个输入丢给模型,总能撞上几个边缘用例,为什么还要研究原理和算法?

正解随机撒网在低维空间或许有效,但 AI 输入动辄上千维,输入空间稀疏得可怕,纯随机相当于在大洋里捞针,命中率趋近于零。真正高效的做法是覆盖率驱动 + 多样性探索 + 模型反馈,让生成器“越捞越准”,而不是“越捞越多”。

为何常见:随机测试写起来最简单、观感上最省事,容易让人误以为“量大管饱”。

误区自动生成一跑就是上万条失败用例,这模型是不是废了?赶紧换模型吧。

正解失败用例的数量反映的是“生成策略的侦查能力”和“测试预算”的双重作用,不能直接等价于模型质量。就像一支厉害的侦探队能查出更多案子,不代表这座城市比别的城市更乱。正确姿势是结合基准测试集和覆盖率,看失败用例的密度、分布和严重程度,再评判模型。

为何常见:人容易把“发现问题多”和“问题本身多”混淆,忽略了测试工具的放大效应。

误区我把这 1 万个边缘用例存进库里,以后每次发版都跑一遍就安全了。

正解模型每次迭代、训练数据每次更新,都会让旧用例的“攻击面”失效——模型可能已经记住并修复了这些坑,也可能对旧扰动不再敏感。真实世界的新场景也在不断出现。所以边缘用例需要持续自动生成、定期升级,像海图一样随季风更新,而不是当成祖传家谱供着。

为何常见:静态测试集成本低、效果好,让人误以为稳定性等于安全性,忽略了对抗的“军备竞赛”本质。

误区覆盖率都到 95% 以上了,边缘用例肯定找得差不多了,可以放心上线。

正解覆盖率只是代理指标,它衡量“我们探索过多少区域”,不保证“区域内没有漏网之鱼”。网格划粗了、连续值离散化没对准、模型对微小扰动过敏,都会让覆盖率失真。更严重的是,真实失败往往集中在覆盖指标照顾不到的交互组合上。覆盖率要结合误报分析、人工抽检和事后线上监控一起用。

为何常见:数字天然给人安全感,覆盖率又最容易量化,于是被当成“安全检查通过”的免死金牌。

面试题

Q1. 下列关于“边缘用例”的描述,最准确的是?

单选题 · easy

  • A.数据集中出现频率最高的样本
  • B.分布常见区域模型表现稳定的输入
  • C.输入空间稀疏分布易引发模型的异常← 正确答案
  • D.只存在于图像任务中的特殊数据

答案:C。边缘用例的关键特征是“稀有但危险”:在输入空间中分布稀疏、一旦出现就容易触发模型失败。A 是高频样本,B 是常见稳定输入,D 以偏概全——文本、语音任务同样存在边缘用例。

Q2. 随机模糊测试(Fuzzing)生成测试用例的主要方式是?

单选题 · easy

  • A.对种子输入进行随机变异与拼接← 正确答案
  • B.由工程师手工编写全部测试数据
  • C.用海量真实数据训练一个全新的模型
  • D.只使用线上用户的历史日志

答案:A。模糊测试的核心是“自动 + 随机”:对种子输入做随机变异、拼接或直接随机生成,低成本高覆盖。B、C、D 都不涉及对输入做随机化改造,不属于模糊测试的定义。

Q3. 某评测任务把输入空间划分成 100 个分区,当前用例覆盖了 62 个,则覆盖率是多少?

单选题 · mid

  • A.62%← 正确答案
  • B.38%
  • C.100%
  • D.6.2%

答案:A。覆盖率 = 已覆盖分区数 / 分区总数 = 62 / 100 = 62%。B 是未覆盖比例,C 和 D 是干扰项,只要记得“已覆盖除以总数”就不会错。

Q4. 以下哪些算法会利用模型的输出或梯度反馈来引导边缘用例生成?

多选题 · mid

  • A.随机模糊测试方法
  • B.对抗生成网络 GAN← 正确答案
  • C.进化搜索策略← 正确答案
  • D.固定词典替换方法

答案:BC。GAN 靠判别器对真假样本的反馈不断优化生成器,进化搜索靠模型打分来淘汰和保留种子,二者都依赖反馈信号。随机模糊测试和固定字典替换只是机械地生成或替换,不需要模型的任何反馈。

Q5. 在 GAN 生成边缘用例的框架中,判别器(Discriminator)的主要作用是?

单选题 · mid

  • A.负责生成全新的随机输入样本数据
  • B.判别输入真伪并反向引导生成器的进化← 正确答案
  • C.自动删除所有被标记的失败用例
  • D.计算每条输入数据的字节大小

答案:B。GAN 中生成器负责“造假”,判别器负责“打假”。二者对抗中,判别器让生成器不断改进,最终生成能骗过判别器的、接近模型失败区域的样本。A 是生成器的活,C、D 都不是 GAN 中的角色。

Q6. 关于边缘用例评测中的“误报”,下列说法正确的是?

单选题 · hard

  • A.误报指生成器产出了大量重复的数据
  • B.误报指自动判失败但人工复核正常的用例← 正确答案
  • C.误报指模型在某些输入上完全没有输出
  • D.误报指覆盖率指标超过了百分之一百

答案:B。误报是“假警报”:自动筛查把它当成失败用例,人工复核却发现模型行为正常。大量误报会消耗工程师精力,所以需要 triage 过滤。A 是重复问题,C 是模型故障,D 在数学上不可能。

Q7. 下列哪些措施可以显著提升边缘用例生成的效率?

多选题 · mid

  • A.对相似用例进行去重合并← 正确答案
  • B.优先选择高质量种子进行变异← 正确答案
  • C.并行执行生成与评测任务← 正确答案
  • D.无限延长生成时间消耗

答案:ABC。去重减少无效执行,好种子提高变异命中率,并行化提升吞吐量,三者都是经典优化手段。D 看似有效实则无效:无预算地延长生成时间不仅烧钱,还会因覆盖率收敛而收益递减。

Q8. FGSM 构造对抗样本时,选择的是哪个方向添加噪声?

单选题 · hard

  • A.损失函数对输入梯度的符号方向← 正确答案
  • B.输入数据整体的均值方向
  • C.随机初始化生成的方向
  • D.模型权重矩阵的转置方向

答案:A。FGSM 沿损失对输入的梯度符号方向扰动,即“让损失上升最快的方向”,再乘一个小步长 epsilon 叠加到原图。它是有方向性的攻击,不是随机或基于均值、权重的操作。

Q9. 针对大模型幻觉问题,自动生成边缘用例的常用思路是?

单选题 · mid

  • A.构造事实矛盾或虚构概念提问← 正确答案
  • B.只生成标准问答对并反复重放
  • C.禁止模型输出超过二十字的回答
  • D.将模型温度参数调到最高值

答案:A。幻觉是模型在不确定答案时“一本正经地胡说”。用事实矛盾、常识冲突、虚构概念的提问去钓,能批量暴露幻觉。B 是正常评测,C、D 是规避或调参,不是发现幻觉的生成策略。

Q10. 用例自动生成可以应用在以下哪些 AI 安全场景中?

多选题 · easy

  • A.大模型红队自动生成越狱提示词← 正确答案
  • B.自动驾驶感知模型的极端场景测试← 正确答案
  • C.语音识别系统的噪声鲁棒性测试← 正确答案
  • D.数据库索引结构层面的性能优化

答案:ABC。红队提示词、驾驶极端场景、语音噪声输入,都是“向模型输入罕见或对抗样本以暴露失败”的场景,是边缘用例生成的主战场。数据库索引优化属于系统工程范畴,与模型输入空间的用例生成无关。