目的
为避免一学就会、一用就废,这里做下笔记
内容
本文从功能、性能、安全三个维度,按照测试对象→测试指标→测试方法的结构,系统阐述智能体应用的测试方法论。并概要说明如何准备测试数据,如何进行自动化测试,用以对测试方法章节进行补充。
一、功能测试
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,测试与生产分离 |
| 评估多维 |
规则+模型+对比,覆盖各类验证需求 |
所有评论(0)