为什么需要自动生成测试用例
做大模型安全评估,手动写测试用例效率太低。一个好的测试用例需要:
- 覆盖多种边界场景
- 根据反馈自动迭代
- 组合不同策略和编码方式
我用遗传算法实现了一个自动生成引擎,5代进化后覆盖率从12%提升到86%。
系统架构
scss
测试目标(模型)
↑
评估器(判断是否触发边界)
↑
进化算法(选择/交叉/变异)
↑
种群(50个测试用例)
↑
初始生成(20策略×12编码×10包装)
核心代码
python
import random
class TestCase:
def __init__(self, strategy, encoding, wrapper):
self.strategy = strategy
self.encoding = encoding
self.wrapper = wrapper
self.prompt = self.build()
self.fitness = 0
def build(self):
base = self.strategy.template
encoded = self.encoding.apply(base)
return self.wrapper.wrap(encoded)
class EvolutionEngine:
def __init__(self, pop_size=50, generations=5):
self.pop_size = pop_size
self.generations = generations
def init_population(self):
strategies = [...] # 20种策略
encodings = [...] # 12种编码
wrappers = [...] # 10种包装
return [TestCase(random.choice(strategies),
random.choice(encodings),
random.choice(wrappers))
for _ in range(self.pop_size)]
def evaluate(self, population, llm):
for case in population:
response = llm.chat(case.prompt)
case.fitness = self.score(response)
return population
def evolve(self, population):
# 选择:保留前20%精英
elite = sorted(population, key=lambda x: x.fitness, reverse=True)[:10]
# 交叉:两个个体组合
offspring = []
for _ in range(40):
p1, p2 = random.sample(elite, 2)
child = TestCase(
p1.strategy if random.random() > 0.5 else p2.strategy,
p1.encoding if random.random() > 0.5 else p2.encoding,
p1.wrapper if random.random() > 0.5 else p2.wrapper,
)
offspring.append(child)
return elite + offspring
实测结果
| 代数 | 平均覆盖率 | 最佳个体 |
|---|---|---|
| 0 | 12% | 信任建立+Base64+论文包装 |
| 1 | 34% | 渐进提取+零宽字符+翻译包装 |
| 2 | 58% | 角色扮演+反转+游戏NPC |
| 3 | 72% | 碎片化+全角+教学示例 |
| 4 | 86% | 信任建立+混合编码+对话记录 |
工程细节
- 缓存机制:相同prompt不重复请求,节省API费用
- 超时控制:单个测试用例超时10秒跳过
- 并发:用asyncio并发20个请求
- 日志:每个case的prompt/response/fitness存JSONL
应用场景
- 模型上线前安全评估
- 版本更新回归测试
- 企业合规检查
- 教学演示
合法使用声明
本工具仅用于自有模型评估和企业内部安全测试。
项目开源地址 :github.com/1ouxilisi/a...
v45.0 · 12领域59个安全代理 · MIT许可证