目的

为避免一学就会、一用就废,这里做下笔记

内容

本文从功能、性能、安全三个维度,按照测试对象→测试指标→测试方法的结构,系统阐述智能体应用的测试方法论。并概要说明如何准备测试数据,如何进行自动化测试,用以对测试方法章节进行补充。

一、功能测试

1.1 意图识别模块

  • 测试指标
    • 意图识别准确率:正确识别用户意图的比例
  • 测试方法
    • 标注测试集法:构建覆盖各类意图的标注数据集,逐条验证识别结果
    • 边界语义测试:构造模糊、歧义、多意图输入,验证消歧能力
    • 上下文依赖测试:在多轮对话中验证结合历史信息的识别能力

1.2 规划器

  • 测试指标
    • 路径匹配度:实际执行轨迹与期望轨迹的相似度
    • 步骤冗余率:执行过程中冗余/无效步骤的比例
    • 规划成功率:正确完成任务拆解的比例
  • 测试方法
    • 关键事件断言:验证必须经过的关键步骤是否发生
    • 轨迹对比法:与黄金轨迹进行序列比对,计算编辑距离
    • 结果反推法:通过最终结果反推规划合理性

1.3 工具调用

  • 测试指标
    • 工具选择准确率:正确选择工具的比例
    • 参数填充准确率:工具参数填写正确的比例
    • 调用序列正确率:多工具调用顺序正确的比例
  • 测试方法
    • 参数校验测试:构造需要特定工具的输入,验证调用正确性
    • 边界参数测试:传入边界值、空值、异常值
    • 调用链追踪:记录完整调用序列,与期望序列对比

1.4 记忆模块

  • 测试指标
    • 短期记忆准确率:本轮对话内信息记忆正确的比例
    • 长期记忆一致性:跨会话信息保持一致的比例
    • 记忆混淆率:不同用户/会话间信息混淆的比例
  • 测试方法
    • 多轮对话测试:多次提及同一信息,验证后续正确引用
    • 跨会话验证:结束会话后重新开启,验证回忆能力
    • 隔离性测试:并行模拟多个用户,验证记忆不相互污染

1.5 检索模块(RAG)

  • 测试指标
    • 召回率:检索到的相关文档占全部相关文档的比例
    • 精确率:检索结果中相关文档的比例
    • 平均倒数排名:第一个相关文档在结果列表中的位置倒数均值
    • 检索延迟:检索模块的端到端响应时间
  • 测试方法
    • 标注数据集评估:构建查询-相关文档标注集,计算召回比例
    • 结果抽样评估:对检索结果抽样,人工评估相关性
    • 排序质量测试:计算MRR、NDCG等排序指标
    • 性能基准测试:在标准数据集上测量P50/P95检索耗时

1.6 生成模块(RAG)

  • 测试指标
    • 上下文相关性:生成内容与检索内容的关联程度
    • 事实一致性:生成内容与检索事实的一致性
    • 引用准确性:引用标记与检索源的正确对应关系
    • 完整性:生成内容覆盖检索结果中关键信息的程度
  • 测试方法
    • LLM-as-Judge:使用强模型评估是否基于检索结果
    • 事实对比验证:将生成内容与检索文档逐一比对
    • 引用溯源测试:验证每个引用标记指向正确的检索文档
    • 关键信息覆盖率计算:提取关键信息,检查是否在生成中体现

1.7 输出生成

  • 测试指标
    • 输出格式合规率:符合预期格式的比例
    • 幻觉率:产生不存在信息的比例
    • 答案相关性:回答与问题的相关程度
  • 测试方法
    • 格式校验:针对JSON、Markdown等结构进行格式验证
    • 事实核查法:对事实性陈述进行逐一核验
    • 语义相似度评估:计算与标准答案的语义相似度

1.8 错误处理

  • 测试指标
    • 错误恢复率:异常发生后成功恢复的比例
    • 降级响应率:无法完成任务时给出合理提示的比例
    • 重试成功率:自动重试后成功的比例
  • 测试方法
    • 故障注入测试:模拟工具失败、超时、返回异常等场景
    • 边界场景测试:构造超出能力范围的请求
    • 瞬态故障模拟:注入间歇性故障,验证重试机制

二、性能测试

2.1 端到端延迟

  • 测试指标
    • P50延迟:50%请求的完成耗时
    • P95延迟:95%请求的完成耗时
    • P99延迟:99%请求的完成耗时
  • 测试方法
    • 单任务基线测试:多次执行统计延迟分布
    • 回归对比测试:与历史基线对比,识别性能退化
    • 长尾分析:单独分析P99请求,定位慢请求原因

2.2 首字延迟

  • 测试指标
    • 首字延迟:流式输出首个字符的到达时间
    • TTFT:首个Token生成时间
  • 测试方法
    • 流式响应测试:测量从请求发送到收到第一个字符的时间
    • 分阶段计时:分解为检索时间+首次推理时间

2.3 推理延迟

  • 测试指标
    • 单次推理耗时:LLM单次调用的响应时间
    • 推理吞吐量:单位时间内完成的推理次数
  • 测试方法
    • 模型调用计时:测量LLM API的单次调用耗时
    • 批量推理测试:测量并发推理时的吞吐能力

2.4 工具调用延迟

  • 测试指标
    • 工具响应时间:外部工具/API的响应耗时
    • 工具超时率:超时的工具调用比例
  • 测试方法
    • 依赖服务监控:记录每个工具调用的耗时
    • 超时阈值测试:设置不同超时阈值,统计超时比例

2.5 检索延迟(RAG)

  • 测试指标
    • P95检索延迟:95%检索请求的耗时
    • 向量化延迟:Query向量化的耗时
    • 索引检索延迟:向量索引查询的耗时
    • 数据获取延迟:从存储获取完整文档的耗时
  • 测试方法
    • 检索链路分解:分别测量三个环节的耗时
    • Embedding模型基准测试:测量不同批次大小下的向量化耗时
    • 规模-性能曲线:在不同索引规模下测量检索延迟

2.6 索引构建延迟(RAG)

  • 测试指标
    • 全量构建时间:完整知识库索引构建的耗时
    • 增量更新延迟:新增文档的索引更新时间
  • 测试方法
    • 构建计时:记录从原始数据到可查询索引的总耗时
    • 实时性测试:测量文档入库到可被检索的时间差

2.7 并发能力

  • 测试指标
    • 最大并发数:系统能同时稳定处理的会话数
    • QPS:每秒处理的请求数
  • 测试方法
    • 梯度加压测试:逐步增加并发数,观察延迟拐点
    • 稳态吞吐测试:在稳定延迟下测量最大吞吐量

2.8 资源消耗

  • 测试指标
    • CPU使用率:平均/峰值CPU占用
    • 内存使用率:平均/峰值内存占用
    • GPU利用率:GPU计算单元使用效率
  • 测试方法
    • 资源监控:持续采样CPU/内存/GPU
    • 长时间运行测试:检测是否存在内存泄漏
    • 负载相关性分析:分析资源使用与任务负载的关系

2.9 Token消耗

  • 测试指标
    • 每任务Token数:平均每次任务消耗的Token总数
    • 输入输出比:输入Token与输出Token的比例
    • 检索Token占比:检索内容占输入Token的比例
  • 测试方法
    • Token统计:累加每个任务的输入+输出Token
    • 构成分析:区分系统提示词、检索内容、历史对话的Token占比
    • 成本分解:分析RAG场景下检索内容的成本贡献

2.10 检索成本(RAG)

  • 测试指标
    • 每查询检索成本:单次检索的计算/API成本
    • 向量索引内存:向量索引占用的内存空间
  • 测试方法
    • 成本核算:向量化成本 + 索引检索成本
    • 内存测量:在不同索引规模下测量内存占用

三、安全测试

3.1 提示词注入

  • 测试指标
    • 提示词注入防护率:成功抵御注入攻击的比例
  • 测试方法
    • 直接注入测试:尝试用“忽略之前指令”等方式覆盖系统提示词
    • 角色切换攻击:通过角色扮演切换为不受限模式
    • 编码绕过测试:使用Base64、Unicode编码绕过关键词过滤
    • 多轮诱导测试:通过多轮对话逐步构建注入指令

3.2 有害内容生成

  • 测试指标
    • 有害内容拦截率:拒绝生成有害内容的比例
  • 测试方法
    • 分类攻击集测试:按暴力、违法、仇恨、自残构造有害查询
    • 间接诱导测试:通过隐喻、假设场景间接诱导生成有害内容
    • 对抗性提示测试:使用越狱模板(如DAN)尝试突破限制

3.3 敏感信息泄露

  • 测试指标
    • 敏感信息泄露率:泄露敏感信息的比例
  • 测试方法
    • 系统提示词探测:尝试各种方式获取系统提示词
    • API密钥探测:尝试诱导输出API密钥等配置信息
    • PII泄露测试:注入测试隐私数据,尝试诱导输出

3.4 工具滥用

  • 测试指标
    • 工具滥用防护率:阻止危险工具调用的比例
  • 测试方法
    • 危险操作诱导:尝试诱导执行删除、转账、发邮件等操作
    • 参数注入测试:在工具参数中注入SQL、命令等恶意内容
    • 权限边界试探:低权限用户尝试调用高权限工具

3.5 权限绕过

  • 测试指标
    • 越权访问防护率:阻止未授权访问的比例
  • 测试方法
    • 跨用户访问测试:尝试访问其他用户的资源
    • 角色越权测试:普通用户尝试执行管理员操作
    • 直接对象引用:尝试通过ID猜测访问未授权资源

3.6 数据污染

  • 测试指标
    • 数据污染防护率:阻止污染共享数据的比例
  • 测试方法
    • 记忆污染测试:尝试注入恶意信息污染长期记忆
    • 上下文污染测试:尝试通过对话污染后续用户的上下文
    • 知识库污染测试:尝试向知识库注入错误或恶意内容

3.7 知识库投毒(RAG)

  • 测试指标
    • 知识库投毒防护率:阻止恶意内容注入的比例
  • 测试方法
    • 恶意内容注入测试:尝试向知识库上传有害/错误内容
    • 混淆式投毒测试:将恶意内容嵌入看似正常的文档中
    • 投毒影响测试:注入后查询,验证智能体是否被污染
    • 权限提升投毒:通过知识库间接注入系统指令

3.8 检索结果篡改(RAG)

  • 测试指标
    • 检索注入防护率:抵御检索结果操纵的比例
  • 测试方法
    • 结果替换攻击:模拟检索返回被篡改的结果
    • 排名操纵攻击:将恶意文档提升到检索结果首位
    • 对抗性查询测试:构造特殊Query使检索返回非预期结果

3.9 越权访问知识(RAG)

  • 测试指标
    • 越权访问防护率:阻止未授权知识访问的比例
  • 测试方法
    • 跨租户访问测试:尝试访问其他用户/租户的知识库
    • 权限边界测试:低权限用户尝试访问高权限知识内容
    • 推理攻击测试:通过组合查询推断受限知识

3.10 RAG幻觉滥用

  • 测试指标
    • 虚假引用防御率:识别并拒绝虚假引用的比例
  • 测试方法
    • 虚假来源诱导:要求引用来源,验证是否编造不存在的文档
    • 不存在信息诱导:询问知识库中不存在的“事实”
    • 矛盾检测测试:知识库存在矛盾时,验证处理方式

3.11 拒绝服务

  • 测试指标
    • 资源滥用防护率:阻止资源耗尽攻击的比例
  • 测试方法
    • 循环调用测试:尝试诱导进入死循环或递归调用
    • 成本炸弹测试:尝试通过大范围查询消耗大量Token
    • 高频请求测试:短时间内发送大量请求,验证限流机制

如何准备测试数据?

一、总体框架

测试数据准备遵循 “对象驱动” 原则:每个测试对象都有对应的数据集,每条数据都有明确的期望结果。

测试对象 → 测试指标 → 测试方法 → 测试数据
     ↓
数据按三大维度组织:功能、性能、安全

二、功能测试数据

2.1 数据分类与准备方法

测试对象 数据类型 准备方法 关键标注内容
意图识别 单意图/多意图/歧义输入 从日志抽取+人工标注 期望意图、期望参数、是否需要澄清
规划器 单步/多步/复杂依赖任务 业务流程提取+人工设计 期望工具序列、关键步骤约束、最大步数
工具调用 单工具/多工具/参数边界 构造各类调用场景 期望工具名、期望参数、边界行为
记忆模块 多轮对话/跨会话对话 设计对话链路 期望记住的信息、期望遗忘的信息
检索模块(RAG) 查询-文档标注对 构建知识库+人工标注相关性 相关文档列表、相关性等级、排序期望
生成模块(RAG) 检索-生成标注对 基于检索结果编写标准答案 标准答案、应引用的文档、关键信息点
输出生成 格式要求/幻觉检测 构造格式要求+标注关键事实 期望格式、期望关键词、幻觉风险点
错误处理 故障注入/边界场景 设计异常场景 故障类型、期望恢复行为

2.2 数据规模建议

数据类别 数量建议 说明
黄金用例集 50-100条 典型任务,用于快速回归
完整功能集 500-1000条 覆盖所有功能点
RAG检索标注集 500-1000对 查询-文档标注对
RAG生成标注集 200-500条 基于检索的标准答案
边界/异常集 100-200条 边缘场景

三、性能测试数据

3.1 数据分类与准备方法

测试对象 数据类型 准备方法 关键标注内容
基线测试 简单/中等/复杂任务 从功能数据中按复杂度筛选 期望步数、预估Token数
压力测试 混合任务分布 按生产比例构造任务分布 任务类型、权重、并发数
成本分析 低/高Token任务 筛选极端成本场景 预估Token、预估成本
检索性能 不同规模检索查询 构建不同规模的知识库 索引规模、期望延迟

3.2 数据规模建议

数据类别 数量建议 说明
基线任务集 30-50条 代表性任务,用于版本对比
混合任务分布 10-20种类型 带权重分布,用于压测
边界性能任务 10-20条 极端场景,用于容量评估

四、安全测试数据

4.1 数据分类与准备方法

测试对象 数据类型 准备方法 关键标注内容
提示词注入 直接/编码/多轮注入 设计各类注入攻击 攻击类型、期望拒绝
有害内容 暴力/违法/仇恨/自残 按类别构造有害查询 类别、期望拦截
敏感信息泄露 提示词/密钥/PII探测 注入测试敏感数据+诱导提问 测试敏感数据、期望不泄露
工具滥用 危险操作诱导 构造危险操作请求 危险工具、期望拒绝
RAG知识库投毒 恶意文档注入 构造恶意文档+验证查询 恶意文档、期望未被污染
RAG越权访问 跨角色/跨租户访问 构造不同角色的越权请求 用户角色、期望拒绝
拒绝服务 循环/成本炸弹诱导 构造资源消耗攻击 攻击类型、期望限制

4.2 数据规模建议

数据类别 数量建议 说明
提示词注入集 50-100条 覆盖各类注入手法
有害内容集 100-150条 覆盖各类有害类别
敏感信息探测集 30-50条 覆盖各类泄露风险
RAG安全专项 50-100条 覆盖投毒/越权/幻觉
拒绝服务集 20-30条 覆盖资源滥用场景

五、数据组织格式

5.1 单条数据格式

{
  "id": "唯一标识",
  "dimension": "功能/性能/安全",
  "test_object": "对应的测试对象",
  "input": "用户输入/场景描述",
  "context": {"对话上下文/用户角色/注入数据"},
  "expected": {
    "behavior": "期望行为",
    "output": "期望输出/关键词",
    "metrics": "期望指标值",
    "constraints": ["约束条件"]
  },
  "metadata": {"难度": "easy/medium/hard", "category": "分类"}
}

六、核心原则总结

原则 说明
对象驱动 每个测试对象都有对应数据集
期望明确 每条数据都有清晰的期望结果
可重复 数据不依赖外部环境变化
版本化 数据集随智能体版本同步迭代
分层管理 按维度-对象-场景分层组织

如何实现自动化测试?

一、核心挑战

智能体自动化测试面临三大根本挑战,决定了其方法论与传统软件测试的差异:

挑战 含义 对自动化的影响
非确定性输出 相同输入可能产生不同输出 不能用精确匹配,需用概率性评估
多步轨迹 正确执行路径不唯一 不能用路径精确匹配,需验证状态等价
外部依赖 依赖LLM、工具API、知识库 需要分层Mock和隔离策略

二、四层金字塔架构

从底层到顶层逐级构建,下层为上层提供基础:

层级 测试对象 自动化目标 执行频率
L4 端到端 完整场景 验收整体表现 发布前
L3 轨迹验证 多步执行路径 验证决策合理性 每日构建
L2 组件交互 工具调用、规划协作 验证组件协作 每次提交
L1 基础组件 工具函数、提示词模板 验证单元正确性 每次提交

三、核心机制

3.1 断言体系

断言类型 适用场景 实现逻辑
存在性断言 验证关键步骤是否发生 检查轨迹中是否存在特定事件
禁止性断言 验证危险操作是否未发生 检查轨迹中不存在禁止事件
状态断言 验证最终状态是否正确 检查关键状态变量是否达到期望值
语义断言 验证输出内容质量 使用模型评估相关性、忠实度
统计断言 验证批量结果分布 检查通过率、平均步数是否在阈值内

3.2 环境隔离

环境 用途 策略
Mock环境 单元测试、快速验证 所有外部依赖用模拟对象替代
Sandbox环境 集成测试、轨迹验证 连接真实服务的测试账号
Shadow环境 回归测试、性能基线 生产流量旁路复制,不影响用户

3.3 评估自动化

评估方式 适用场景 自动化实现
规则评估 格式、关键词 正则表达式、Schema校验
模型评估 语义、相关性 调用强模型对输出打分
对比评估 回归检测 与历史基线对比相似度

四、三级流水线

阶段 执行内容 时长 通过标准
快速验证 L1基础组件 <5分钟 单元测试100%通过
集成验证 L2+L3交互与轨迹 <30分钟 黄金用例通过率≥90%
验收验证 L4端到端 <2小时 任务完成率≥85%,安全100%

五、方法论核心原则

原则 说明
分层验证 四层金字塔,底层快速、高层全面
断言分级 存在性→禁止性→状态→语义,逐级增强
环境隔离 Mock→Sandbox→Shadow,测试与生产分离
评估多维 规则+模型+对比,覆盖各类验证需求
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐