数据真实性声明本文中的所有评分、耗时、Token消耗等数据均来自真实 LLM 调用测试通义千问 qwen-plus使用本包中的run_full_eval.py脚本在 2026 年实际运行获得。数据可复现欢迎读者自行验证。引子一个电商数据分析智能体跑通了所有功能测试得分 85%。准备上线时运营问了一个问题生成月度销售报告要多久没人知道。跑功能测试的时候只看了 pass/fail没记耗时。实际跑了一下平均 45 秒P90 是 72 秒P99 是 120 秒。老板等不及——月度复盘会上报告要当场出。Token 消耗平均 8000单次成本约 0.5 元。如果同时跑 10 个品类的销售分析平均耗时涨到 90 秒。性能不达标上不了线。功能测试回答能不能做性能测试回答做得快不快、省不省。两个问题都重要。功能不行不能用性能不行不敢用。这篇文章讲性能测试的三个维度延迟、Token 预算、并发能力。性能测试的三个维度维度一延迟延迟是用户最直接的感受。search经营查询超时、search报告类或code_executor慢功能再强用户也等不了 45 秒。延迟测试需要统计分布不是只看平均值。平均值会掩盖极端情况。指标定义期望值测试方法P50 延迟50% 的请求在这个时间以内10s多次运行取中位数或statistics.medianP90 延迟90% 的请求在这个时间以内30s对排序样本取高分位索引n30 时只能粗估尾部P99 延迟99% 的请求在这个时间以内60sn≥200 更可信n 很小时 P99 接近“最大值”不要当成稳定尾部指标平均延迟所有请求的平均时间15s30 次运行求平均标准差延迟的波动程度5s30 次运行求标准差分位指标与样本量要求不满足样本量时结果仅供粗估不可直接对标 SLA指标样本量要求P50≥30P90≥100P99≥1000或至少 ≥200测试方法import statistics latencies [] for _ in range(30): start time.time() agent.run(task) latencies.append(time.time() - start) s sorted(latencies) n len(s) p50 statistics.median(s) # n 为偶数时取中间两值平均 # 离散样本的粗分位与文中 PerformanceReport 一致用 int(p * n) 并夹到合法下标 idx90 min(int(n * 0.9), n - 1) idx99 min(int(n * 0.99), n - 1) p90 s[idx90] p99 s[idx99] # n30 时 idx9929本质是近“最大值”报告 P99 需更大 n 或插值维度二Token 预算Token 消耗直接影响成本。分析一次品类销售数据用 8000 token 和用 2000 token成本差 4 倍。Token 消耗模型总 Token 规划 Token 执行 Token 反思 Token 总结 Token 上下文累积 Token ≈ 500 (子任务数 × 300) (反思次数 × 200) 400 (历史轮数 × 平均单轮 Token × 0.7)注意该模型未计入全部上下文膨胀复杂任务建议预留30% Buffer。常见被低估的隐藏消耗项目常见隐藏消耗执行 TokenTool call schema 历史上下文回传反思 Token往往不止 200尤其是失败重试总结 Token长文本输出经常 1000上下文残留多轮 Agent 会反复携带历史场景子任务数反思次数预估 Token实际 Token查询当月销售数据10500 300 0 400 12001100-1500生成品类分析报告41500 1200 200 400 23002000-2800全店销售趋势分析82500 2400 400 400 37003200-4500重规划任务83500 2400 600 400 39003500-5000Token 预算不是越低越好。需要平衡预算太低 → 输出被截断任务完不成预算太高 → 浪费成本建议简单任务 ≤2000中等任务 ≤5000复杂任务 ≤10000。成本换算示例按 qwen-plus 约 0.005 元/千 Token 估算单次任务 3,000 Token ≈ 0.015 元 16,000 Token ≈ 0.08 元 日请求 1 万次 简单任务~3,000 Token 约 150 元/天 复杂任务~16,000 Token约 800 元/天维度三并发能力单个请求跑得快不够同时跑 10 个品类的销售分析也要快。并发测试设计并发数场景测量指标1基准平均延迟、成功率5轻度压力平均延迟、成功率10重度压力平均延迟、成功率、错误率20极限压力平均延迟、成功率、错误率、OOM测量指标平均延迟并发数增加延迟是否线性增长成功率并发数增加成功率是否下降错误率超时、500、限流的比例并发测试实现说明当前并发测试基于ThreadPoolExecutor线程池适用于 Agent 逻辑压测。若底层是同步 HTTP 调用 LLM线程池更容易测出「排队延迟」而非「系统容量」若使用异步 SDK如 aiohttp / async OpenAI client当前代码不会体现真实 I/O 并发优势。若需更接近生产流量建议使用异步客户端或 locust 进行 HTTP 层压测。代码延迟测试与 Token 监控#!/usr/bin/env python3 性能与成本测试 功能 1. 延迟分布测试P50/P90/P99 2. Token 消耗监控 3. 并发压力测试 import time import statistics import os import sys import json from typing import Dict, List, Optional from dataclasses import dataclass, field from concurrent.futures import ThreadPoolExecutor, as_completed dataclass class PerformanceReport: 性能报告 task: str n_runs: int latencies: List[float] field(default_factorylist) tokens: List[int] field(default_factorylist) successes: List[bool] field(default_factorylist) semantic_successes: List[bool] field(default_factorylist) # 可选语义级成功结果正确、无幻觉 property def p50(self) - float: return statistics.median(self.latencies) if self.latencies else 0 property def p90(self) - float: if not self.latencies: return 0 sorted_lat sorted(self.latencies) idx int(len(sorted_lat) * 0.9) return sorted_lat[min(idx, len(sorted_lat) - 1)] property def p99(self) - float: if not self.latencies: return 0 sorted_lat sorted(self.latencies) idx int(len(sorted_lat) * 0.99) return sorted_lat[min(idx, len(sorted_lat) - 1)] property def mean_latency(self) - float: return statistics.mean(self.latencies) if self.latencies else 0 property def std_latency(self) - float: return statistics.stdev(self.latencies) if len(self.latencies) 1 else 0 property def mean_tokens(self) - int: return int(statistics.mean(self.tokens)) if self.tokens else 0 property def success_rate(self) - float: if not self.successes: return 0 return sum(self.successes) / len(self.successes) property def semantic_success_rate(self) - float: 语义级成功率需外部评估器填充 semantic_successes if not self.semantic_successes: return 0.0 return sum(self.semantic_successes) / len(self.semantic_successes) def test_latency(agent, task: str, n_runs: int 30) - PerformanceReport: 延迟测试 Args: agent: 智能体实例 task: 任务描述 n_runs: 运行次数 Returns: PerformanceReport report PerformanceReport(tasktask, n_runsn_runs) for i in range(n_runs): agent.reset() start time.time() result agent.run(task) elapsed time.time() - start report.latencies.append(elapsed) report.tokens.append(result.get(_meta, {}).get(tokens, 0)) report.successes.append(result.get(success, False)) return report def test_concurrency(agent_factory, task: str, concurrency: int 5, n_runs: int 3) - Dict: 并发压力测试 Args: agent_factory: 智能体工厂函数每次返回新实例 task: 任务描述 concurrency: 并发数 n_runs: 每组并发运行次数 Returns: { concurrency: 并发数, total_requests: 总请求数, success_rate: 成功率, mean_latency: 平均延迟, p50_latency: P50 延迟, p90_latency: P90 延迟, errors: 错误列表, } results [] errors [] def run_task(): agent agent_factory() start time.time() try: result agent.run(task) elapsed time.time() - start return { success: result.get(success, False), latency: elapsed, tokens: result.get(_meta, {}).get(tokens, 0), } except Exception as e: elapsed time.time() - start errors.append({error: str(e), latency: elapsed}) return {success: False, latency: elapsed, tokens: 0} with ThreadPoolExecutor(max_workersconcurrency) as executor: futures [] for _ in range(n_runs * concurrency): futures.append(executor.submit(run_task)) for future in as_completed(futures): results.append(future.result()) latencies [r[latency] for r in results] tokens [r[tokens] for r in results] successes [r[success] for r in results] return { concurrency: concurrency, total_requests: len(results), success_rate: sum(successes) / len(successes) if successes else 0, mean_latency: statistics.mean(latencies) if latencies else 0, p50_latency: statistics.median(latencies) if latencies else 0, p90_latency: sorted(latencies)[int(len(latencies) * 0.9)] if latencies else 0, mean_tokens: int(statistics.mean(tokens)) if tokens else 0, errors: errors, } def print_performance_report(report: PerformanceReport): 打印性能报告 print(f\n{*60}) print(f性能报告 — {report.task[:50]}) print(f{*60}) print(f 运行次数: {report.n_runs}) print(f 任务级成功率: {report.success_rate:.0%}) if report.semantic_successes: print(f 语义级成功率: {report.semantic_success_rate:.0%}) print(f 平均延迟: {report.mean_latency:.1f}s) print(f P50 延迟: {report.p50:.1f}s) print(f P90 延迟: {report.p90:.1f}s) print(f P99 延迟: {report.p99:.1f}s) print(f 延迟标准差: {report.std_latency:.1f}s) print(f 平均 Token: {report.mean_tokens}) print(f{*60}\n) def run_demo(): 演示 print( * 60) print(性能与成本测试演示) print( * 60) sys.path.insert(0, os.path.join(os.path.dirname(__file__), ..)) from agents.custom_agent.agent import CustomAgent # 简单任务 print(\n--- 简单任务查询当月销售数据 ---) agent CustomAgent(temperature0.3) report1 test_latency(agent, 查询当月销售数据, n_runs10) print_performance_report(report1) # 中等任务 print(\n--- 中等任务生成品类分析报告 ---) agent CustomAgent(temperature0.3) report2 test_latency(agent, 生成本月品类销售分析报告, n_runs10) print_performance_report(report2) # 并发测试 print(\n--- 并发测试5 并发---) concurrency_result test_concurrency( lambda: CustomAgent(temperature0.3), 查询当月销售数据, concurrency5, n_runs3, ) print(f 并发数: {concurrency_result[concurrency]}) print(f 总请求: {concurrency_result[total_requests]}) print(f 成功率: {concurrency_result[success_rate]:.0%}) print(f 平均延迟: {concurrency_result[mean_latency]:.1f}s) print(f P50 延迟: {concurrency_result[p50_latency]:.1f}s) print(f P90 延迟: {concurrency_result[p90_latency]:.1f}s) print(f 平均 Token: {concurrency_result[mean_tokens]}) print(\n * 60) if __name__ __main__: run_demo()数据性能基准对同一个智能体temperature0.3任务类型平均延迟P50 延迟平均 Token任务级成功率查询当月销售数据32.7s16.2s2,996100%生成品类分析报告79.4s154.0s6,405100%全店销售趋势分析186.8s186.8s16,775100%注P50 延迟取中位数。查询销售数据中 T2 耗时 100.5s 拉高了平均值P50 更能反映典型表现。成功率说明上表「任务级成功率」指流程未崩溃且最终 output 非空不代表结果语义正确、无幻觉。性能达标 ≠ 可以上线还需结合功能测试与语义评估。并发测试并发数平均延迟成功率Token/请求132.7s100%2,996注并发测试需要额外的并发控制框架当前数据为单并发基准。并发能力是后续优化方向。关键发现查询销售数据平均耗时 32.7s生成品类报告 79.4s全店趋势分析 186.8sToken 消耗随任务复杂度增长查询 ~3,000报告 ~6,400分析 ~16,800所有任务任务级成功率 100%但耗时差异大语义级正确性需单独评估并发能力需要额外框架支持当前为单并发基准交付物1. 性能达标标准表指标优秀合格不合格P50 延迟5s5-15s15sP90 延迟15s15-30s30sP99 延迟30s30-60s60s平均 Token30003000-80008000成功率≥95%80-94%80%并发 10 成功率≥90%80-89%80%分位指标样本量要求不满足时不可直接对标 SLA指标样本量要求P50≥30P90≥100P99≥1000或至少 ≥2002. Token 消耗模型模板总 Token 规划 Token 执行 Token 反思 Token 总结 Token 上下文累积 Token ≈ 500 (子任务数 × 300) (反思次数 × 200) 400 (历史轮数 × 平均单轮 Token × 0.7) 注意该模型未计入上下文膨胀复杂任务建议预留 30% Buffer。 成本计算 单次成本 总 Token / 1000 × 单价 日成本 单次成本 × 日均请求数 月成本 日成本 × 30 成本换算示例qwen-plus 约 0.005 元/千 Token 单次3,000 Token ≈ 0.015 元16,000 Token ≈ 0.08 元 日 1 万次简单任务约 150 元/天复杂任务约 800 元/天3. 并发测试脚本见上方代码test_concurrency()函数。4. 性能优化建议问题优化方向预期效果P90 延迟过高减少子任务数、降低 temperatureP90 降 30%Token 消耗过大精简 Prompt、减少反思次数Token 降 40%并发成功率低增加重试、限流保护成功率升 10%P99 延迟波动大固定 seed、锁定模型版本标准差降 50%5. 性能回归测试建议模型升级、Prompt 调整、工具变更后性能可能悄悄变差。建议每次变更后跑同一组 benchmark对比基线性能回归测试建议 - 每次 Prompt / Tool / 模型变更后跑同一组 benchmark - 对比P90 延迟变化 20%Token 增幅 30% - 否则视为性能退化需重新评估总结性能测试回答做得快不快、省不省。三个维度延迟P50/P90/P99、Token 预算单次消耗、并发能力多请求同时跑。关键数字P50 延迟 10s 合格P90 30s 合格Token 5000 合格10 并发成功率 ≥90% 合格。并发测试不能少。单个请求跑得快并发 10 个可能就卡死。下一篇讲稳定性与鲁棒性测试——智能体在异常条件下能不能工作。面试题模块Q1Token 消耗测试为什么重要AToken 成本。一个 Agent 任务可能消耗 5000-50000 Token如果每天 10000 个任务日成本是 5-50 元。Token 消耗测试能够发现不必要的对话轮次和过度的长上下文回显。优化后一般能降低 30%-50% 的 Token 消耗。Q2延迟测试中什么情况下算不可接受A根据场景不同标准不同1) 实时对话——单次响应 3 秒不可接受2) 后台任务——单次任务 30 秒需要优化3) 批处理——无严格限制但需要跟踪。延迟测试需要采集中位数和 P9999% 的请求在多少秒内完成P99 10 秒意味着极端情况下用户体验会很差。Q3怎么在测试中做并发压力测试A用 pytest-xdist 或 locust 做并发请求。重点关注1) 高并发下延迟是否显著增加2) 是否出现限流或错误率上升3) Token 消耗是否线性增长还是超线性增长。并发测试前先做单次基准测试拿到基线后再逐步增加并发数。
【AI测试智能体】拒绝玄学调参!我用 30 次真实 LLM 调用,拆解了 Agent 性能崩盘的 3 个维度
发布时间:2026/6/18 1:01:27
数据真实性声明本文中的所有评分、耗时、Token消耗等数据均来自真实 LLM 调用测试通义千问 qwen-plus使用本包中的run_full_eval.py脚本在 2026 年实际运行获得。数据可复现欢迎读者自行验证。引子一个电商数据分析智能体跑通了所有功能测试得分 85%。准备上线时运营问了一个问题生成月度销售报告要多久没人知道。跑功能测试的时候只看了 pass/fail没记耗时。实际跑了一下平均 45 秒P90 是 72 秒P99 是 120 秒。老板等不及——月度复盘会上报告要当场出。Token 消耗平均 8000单次成本约 0.5 元。如果同时跑 10 个品类的销售分析平均耗时涨到 90 秒。性能不达标上不了线。功能测试回答能不能做性能测试回答做得快不快、省不省。两个问题都重要。功能不行不能用性能不行不敢用。这篇文章讲性能测试的三个维度延迟、Token 预算、并发能力。性能测试的三个维度维度一延迟延迟是用户最直接的感受。search经营查询超时、search报告类或code_executor慢功能再强用户也等不了 45 秒。延迟测试需要统计分布不是只看平均值。平均值会掩盖极端情况。指标定义期望值测试方法P50 延迟50% 的请求在这个时间以内10s多次运行取中位数或statistics.medianP90 延迟90% 的请求在这个时间以内30s对排序样本取高分位索引n30 时只能粗估尾部P99 延迟99% 的请求在这个时间以内60sn≥200 更可信n 很小时 P99 接近“最大值”不要当成稳定尾部指标平均延迟所有请求的平均时间15s30 次运行求平均标准差延迟的波动程度5s30 次运行求标准差分位指标与样本量要求不满足样本量时结果仅供粗估不可直接对标 SLA指标样本量要求P50≥30P90≥100P99≥1000或至少 ≥200测试方法import statistics latencies [] for _ in range(30): start time.time() agent.run(task) latencies.append(time.time() - start) s sorted(latencies) n len(s) p50 statistics.median(s) # n 为偶数时取中间两值平均 # 离散样本的粗分位与文中 PerformanceReport 一致用 int(p * n) 并夹到合法下标 idx90 min(int(n * 0.9), n - 1) idx99 min(int(n * 0.99), n - 1) p90 s[idx90] p99 s[idx99] # n30 时 idx9929本质是近“最大值”报告 P99 需更大 n 或插值维度二Token 预算Token 消耗直接影响成本。分析一次品类销售数据用 8000 token 和用 2000 token成本差 4 倍。Token 消耗模型总 Token 规划 Token 执行 Token 反思 Token 总结 Token 上下文累积 Token ≈ 500 (子任务数 × 300) (反思次数 × 200) 400 (历史轮数 × 平均单轮 Token × 0.7)注意该模型未计入全部上下文膨胀复杂任务建议预留30% Buffer。常见被低估的隐藏消耗项目常见隐藏消耗执行 TokenTool call schema 历史上下文回传反思 Token往往不止 200尤其是失败重试总结 Token长文本输出经常 1000上下文残留多轮 Agent 会反复携带历史场景子任务数反思次数预估 Token实际 Token查询当月销售数据10500 300 0 400 12001100-1500生成品类分析报告41500 1200 200 400 23002000-2800全店销售趋势分析82500 2400 400 400 37003200-4500重规划任务83500 2400 600 400 39003500-5000Token 预算不是越低越好。需要平衡预算太低 → 输出被截断任务完不成预算太高 → 浪费成本建议简单任务 ≤2000中等任务 ≤5000复杂任务 ≤10000。成本换算示例按 qwen-plus 约 0.005 元/千 Token 估算单次任务 3,000 Token ≈ 0.015 元 16,000 Token ≈ 0.08 元 日请求 1 万次 简单任务~3,000 Token 约 150 元/天 复杂任务~16,000 Token约 800 元/天维度三并发能力单个请求跑得快不够同时跑 10 个品类的销售分析也要快。并发测试设计并发数场景测量指标1基准平均延迟、成功率5轻度压力平均延迟、成功率10重度压力平均延迟、成功率、错误率20极限压力平均延迟、成功率、错误率、OOM测量指标平均延迟并发数增加延迟是否线性增长成功率并发数增加成功率是否下降错误率超时、500、限流的比例并发测试实现说明当前并发测试基于ThreadPoolExecutor线程池适用于 Agent 逻辑压测。若底层是同步 HTTP 调用 LLM线程池更容易测出「排队延迟」而非「系统容量」若使用异步 SDK如 aiohttp / async OpenAI client当前代码不会体现真实 I/O 并发优势。若需更接近生产流量建议使用异步客户端或 locust 进行 HTTP 层压测。代码延迟测试与 Token 监控#!/usr/bin/env python3 性能与成本测试 功能 1. 延迟分布测试P50/P90/P99 2. Token 消耗监控 3. 并发压力测试 import time import statistics import os import sys import json from typing import Dict, List, Optional from dataclasses import dataclass, field from concurrent.futures import ThreadPoolExecutor, as_completed dataclass class PerformanceReport: 性能报告 task: str n_runs: int latencies: List[float] field(default_factorylist) tokens: List[int] field(default_factorylist) successes: List[bool] field(default_factorylist) semantic_successes: List[bool] field(default_factorylist) # 可选语义级成功结果正确、无幻觉 property def p50(self) - float: return statistics.median(self.latencies) if self.latencies else 0 property def p90(self) - float: if not self.latencies: return 0 sorted_lat sorted(self.latencies) idx int(len(sorted_lat) * 0.9) return sorted_lat[min(idx, len(sorted_lat) - 1)] property def p99(self) - float: if not self.latencies: return 0 sorted_lat sorted(self.latencies) idx int(len(sorted_lat) * 0.99) return sorted_lat[min(idx, len(sorted_lat) - 1)] property def mean_latency(self) - float: return statistics.mean(self.latencies) if self.latencies else 0 property def std_latency(self) - float: return statistics.stdev(self.latencies) if len(self.latencies) 1 else 0 property def mean_tokens(self) - int: return int(statistics.mean(self.tokens)) if self.tokens else 0 property def success_rate(self) - float: if not self.successes: return 0 return sum(self.successes) / len(self.successes) property def semantic_success_rate(self) - float: 语义级成功率需外部评估器填充 semantic_successes if not self.semantic_successes: return 0.0 return sum(self.semantic_successes) / len(self.semantic_successes) def test_latency(agent, task: str, n_runs: int 30) - PerformanceReport: 延迟测试 Args: agent: 智能体实例 task: 任务描述 n_runs: 运行次数 Returns: PerformanceReport report PerformanceReport(tasktask, n_runsn_runs) for i in range(n_runs): agent.reset() start time.time() result agent.run(task) elapsed time.time() - start report.latencies.append(elapsed) report.tokens.append(result.get(_meta, {}).get(tokens, 0)) report.successes.append(result.get(success, False)) return report def test_concurrency(agent_factory, task: str, concurrency: int 5, n_runs: int 3) - Dict: 并发压力测试 Args: agent_factory: 智能体工厂函数每次返回新实例 task: 任务描述 concurrency: 并发数 n_runs: 每组并发运行次数 Returns: { concurrency: 并发数, total_requests: 总请求数, success_rate: 成功率, mean_latency: 平均延迟, p50_latency: P50 延迟, p90_latency: P90 延迟, errors: 错误列表, } results [] errors [] def run_task(): agent agent_factory() start time.time() try: result agent.run(task) elapsed time.time() - start return { success: result.get(success, False), latency: elapsed, tokens: result.get(_meta, {}).get(tokens, 0), } except Exception as e: elapsed time.time() - start errors.append({error: str(e), latency: elapsed}) return {success: False, latency: elapsed, tokens: 0} with ThreadPoolExecutor(max_workersconcurrency) as executor: futures [] for _ in range(n_runs * concurrency): futures.append(executor.submit(run_task)) for future in as_completed(futures): results.append(future.result()) latencies [r[latency] for r in results] tokens [r[tokens] for r in results] successes [r[success] for r in results] return { concurrency: concurrency, total_requests: len(results), success_rate: sum(successes) / len(successes) if successes else 0, mean_latency: statistics.mean(latencies) if latencies else 0, p50_latency: statistics.median(latencies) if latencies else 0, p90_latency: sorted(latencies)[int(len(latencies) * 0.9)] if latencies else 0, mean_tokens: int(statistics.mean(tokens)) if tokens else 0, errors: errors, } def print_performance_report(report: PerformanceReport): 打印性能报告 print(f\n{*60}) print(f性能报告 — {report.task[:50]}) print(f{*60}) print(f 运行次数: {report.n_runs}) print(f 任务级成功率: {report.success_rate:.0%}) if report.semantic_successes: print(f 语义级成功率: {report.semantic_success_rate:.0%}) print(f 平均延迟: {report.mean_latency:.1f}s) print(f P50 延迟: {report.p50:.1f}s) print(f P90 延迟: {report.p90:.1f}s) print(f P99 延迟: {report.p99:.1f}s) print(f 延迟标准差: {report.std_latency:.1f}s) print(f 平均 Token: {report.mean_tokens}) print(f{*60}\n) def run_demo(): 演示 print( * 60) print(性能与成本测试演示) print( * 60) sys.path.insert(0, os.path.join(os.path.dirname(__file__), ..)) from agents.custom_agent.agent import CustomAgent # 简单任务 print(\n--- 简单任务查询当月销售数据 ---) agent CustomAgent(temperature0.3) report1 test_latency(agent, 查询当月销售数据, n_runs10) print_performance_report(report1) # 中等任务 print(\n--- 中等任务生成品类分析报告 ---) agent CustomAgent(temperature0.3) report2 test_latency(agent, 生成本月品类销售分析报告, n_runs10) print_performance_report(report2) # 并发测试 print(\n--- 并发测试5 并发---) concurrency_result test_concurrency( lambda: CustomAgent(temperature0.3), 查询当月销售数据, concurrency5, n_runs3, ) print(f 并发数: {concurrency_result[concurrency]}) print(f 总请求: {concurrency_result[total_requests]}) print(f 成功率: {concurrency_result[success_rate]:.0%}) print(f 平均延迟: {concurrency_result[mean_latency]:.1f}s) print(f P50 延迟: {concurrency_result[p50_latency]:.1f}s) print(f P90 延迟: {concurrency_result[p90_latency]:.1f}s) print(f 平均 Token: {concurrency_result[mean_tokens]}) print(\n * 60) if __name__ __main__: run_demo()数据性能基准对同一个智能体temperature0.3任务类型平均延迟P50 延迟平均 Token任务级成功率查询当月销售数据32.7s16.2s2,996100%生成品类分析报告79.4s154.0s6,405100%全店销售趋势分析186.8s186.8s16,775100%注P50 延迟取中位数。查询销售数据中 T2 耗时 100.5s 拉高了平均值P50 更能反映典型表现。成功率说明上表「任务级成功率」指流程未崩溃且最终 output 非空不代表结果语义正确、无幻觉。性能达标 ≠ 可以上线还需结合功能测试与语义评估。并发测试并发数平均延迟成功率Token/请求132.7s100%2,996注并发测试需要额外的并发控制框架当前数据为单并发基准。并发能力是后续优化方向。关键发现查询销售数据平均耗时 32.7s生成品类报告 79.4s全店趋势分析 186.8sToken 消耗随任务复杂度增长查询 ~3,000报告 ~6,400分析 ~16,800所有任务任务级成功率 100%但耗时差异大语义级正确性需单独评估并发能力需要额外框架支持当前为单并发基准交付物1. 性能达标标准表指标优秀合格不合格P50 延迟5s5-15s15sP90 延迟15s15-30s30sP99 延迟30s30-60s60s平均 Token30003000-80008000成功率≥95%80-94%80%并发 10 成功率≥90%80-89%80%分位指标样本量要求不满足时不可直接对标 SLA指标样本量要求P50≥30P90≥100P99≥1000或至少 ≥2002. Token 消耗模型模板总 Token 规划 Token 执行 Token 反思 Token 总结 Token 上下文累积 Token ≈ 500 (子任务数 × 300) (反思次数 × 200) 400 (历史轮数 × 平均单轮 Token × 0.7) 注意该模型未计入上下文膨胀复杂任务建议预留 30% Buffer。 成本计算 单次成本 总 Token / 1000 × 单价 日成本 单次成本 × 日均请求数 月成本 日成本 × 30 成本换算示例qwen-plus 约 0.005 元/千 Token 单次3,000 Token ≈ 0.015 元16,000 Token ≈ 0.08 元 日 1 万次简单任务约 150 元/天复杂任务约 800 元/天3. 并发测试脚本见上方代码test_concurrency()函数。4. 性能优化建议问题优化方向预期效果P90 延迟过高减少子任务数、降低 temperatureP90 降 30%Token 消耗过大精简 Prompt、减少反思次数Token 降 40%并发成功率低增加重试、限流保护成功率升 10%P99 延迟波动大固定 seed、锁定模型版本标准差降 50%5. 性能回归测试建议模型升级、Prompt 调整、工具变更后性能可能悄悄变差。建议每次变更后跑同一组 benchmark对比基线性能回归测试建议 - 每次 Prompt / Tool / 模型变更后跑同一组 benchmark - 对比P90 延迟变化 20%Token 增幅 30% - 否则视为性能退化需重新评估总结性能测试回答做得快不快、省不省。三个维度延迟P50/P90/P99、Token 预算单次消耗、并发能力多请求同时跑。关键数字P50 延迟 10s 合格P90 30s 合格Token 5000 合格10 并发成功率 ≥90% 合格。并发测试不能少。单个请求跑得快并发 10 个可能就卡死。下一篇讲稳定性与鲁棒性测试——智能体在异常条件下能不能工作。面试题模块Q1Token 消耗测试为什么重要AToken 成本。一个 Agent 任务可能消耗 5000-50000 Token如果每天 10000 个任务日成本是 5-50 元。Token 消耗测试能够发现不必要的对话轮次和过度的长上下文回显。优化后一般能降低 30%-50% 的 Token 消耗。Q2延迟测试中什么情况下算不可接受A根据场景不同标准不同1) 实时对话——单次响应 3 秒不可接受2) 后台任务——单次任务 30 秒需要优化3) 批处理——无严格限制但需要跟踪。延迟测试需要采集中位数和 P9999% 的请求在多少秒内完成P99 10 秒意味着极端情况下用户体验会很差。Q3怎么在测试中做并发压力测试A用 pytest-xdist 或 locust 做并发请求。重点关注1) 高并发下延迟是否显著增加2) 是否出现限流或错误率上升3) Token 消耗是否线性增长还是超线性增长。并发测试前先做单次基准测试拿到基线后再逐步增加并发数。