news 2026/9/3 15:33:45

「ResearchBuddy」——测试报告

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
「ResearchBuddy」——测试报告

1 系统弹性与稳定性评估

系统弹性与稳定性评估为系统评估的核心对象,包括限流测试、熔断测试、故障恢复测试

1.1 限流测试

验证令牌桶限流器是否正确拒绝超过阈值的请求,保护系统不被流量洪峰冲垮。

测试配置

配置项说明
限流算法令牌桶 (Token Bucket)允许突发流量
令牌生成速率3 tokens/秒每秒补充 3 个令牌
桶容量5 tokens最多积累 5 个令牌
限流键全局共享所有请求共享同一个限流器

在1s内并发20个请求,测试结果如下

📊 限流测试结果 (20 个并发请求)

请求 1-5: ✅ 通过 (前5个请求消耗令牌)
请求 6-20: ⛔ 被限流 (令牌耗尽)

统计:
总请求: 20
允许: 5
拒绝: 15
拦截率: 75%
响应时间: <10ms (拒绝请求快速返回)
限流器状态: tokens_available=0

验证矩阵

验证项预期结果实际结果状态
前 5 个请求全部通过✅ 通过✅ 通过
第 6 个请求开始被限流⛔ 拒绝⛔ 拒绝
限流响应时间<50ms~5ms✅ ✅
限流器状态正确tokens_available=0tokens_available=0
1 秒后令牌恢复恢复 3 个令牌恢复 3 个令牌

1.2 熔断测试

验证熔断器在连续失败后自动打开,快速失败防止级联故障,并在服务恢复后自动闭合。

测试配置

配置项说明
熔断阈值3 次连续失败快速响应故障
失败率阈值50%超过 50% 失败率触发
恢复超时30 秒半开状态等待时间
半开最大请求2 次允许 2 个试探请求

将LLM配置修改为错误模型名,模拟一直请求失败的情形,测试结果如下

📊 熔断测试结果

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 1: 触发熔断
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第1次: ❌ 失败 (Model not exist)
第2次: ❌ 失败 (Model not exist)
第3次: ❌ 失败 (Model not exist)
🔌 熔断器触发 OPEN (failures: 3)
第4次: ⛔ 快速失败 (熔断打开) - 响应时间: 5ms

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 2: 等待恢复
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⏳ 等待 30s...
🔄 熔断器进入半开状态 (HALF-OPEN)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 3: 自动恢复
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第7次: ✅ 请求成功 (半开试探通过)
🔌 熔断器闭合 (CLOSED)

验证矩阵

验证项预期结果实际结果状态
3 次失败后熔断打开状态变为 OPEN状态变为 OPEN
熔断期间请求快速失败<50ms 返回~5ms 返回✅ ✅
熔断期间不调用 LLM无 LLM API 请求无 LLM API 请求
30s 后进入半开状态状态变为 HALF-OPEN状态变为 HALF-OPEN
半开成功恢复状态变为 CLOSED状态变为 CLOSED
半开失败重开状态变为 OPEN状态变为 OPEN

1.3 故障恢复测试

验证系统在 LLM API 恢复后能否自动恢复正常服务,无需人工干预。

阶段操作预期行为
阶段 1: 正常运行正常请求✅ 成功
阶段 2: 模拟故障设置错误模型名❌ 失败,熔断触发
阶段 3: 熔断保护连续请求⛔ 快速返回,不调用 LLM
阶段 4: 修复服务恢复正确模型名🔄 自动恢复
阶段 5: 恢复正常正常请求✅ 成功

熔断30s后自动恢复,结果如下

📊 故障恢复测试结果

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 1: 正常运行
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 请求成功 (熔断器: CLOSED)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 2-3: 触发熔断
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第1次: ❌ 失败
第2次: ❌ 失败
第3次: ❌ 失败
🔌 熔断器触发 OPEN

第4次: ⛔ 快速失败 (5ms)
第5次: ⛔ 快速失败 (4ms)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 4: 修复服务 + 等待恢复
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔧 修复模型名: invalid_model → qwen-plus
⏳ 等待 30s...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 5: 自动恢复
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 半开状态 (HALF-OPEN)
✅ 请求成功 (熔断器恢复: CLOSED)
📊 服务完全恢复

验证矩阵

验证项预期结果实际结果状态
故障后自动熔断状态变为 OPEN状态变为 OPEN
恢复后自动闭合状态变为 CLOSED状态变为 CLOSED
用户无感知恢复无需重启服务无需重启服务✅ ✅
半开状态正确只允许 2 个试探请求正确限制
恢复过程日志记录状态变化有完整日志

1.4 综合测试结果

测试类型测试用例数通过失败通过率
限流测试20200100%
熔断测试10100100%
故障恢复测试880100%
综合稳定性38380100%

2性能基准与压力测试

2.1 RAG质量评估

建立了三层评估体系:

1)离线评估(自动化):

  • Recall@K:前 K 个结果中包含相关论文的比例
  • MRR:第一个相关论文的排名倒数的平均值
  • NDCG:考虑排序位置的归一化折损累计增益

2)在线评估(人工):

  • 构建了 10 个主题的测试集,每个主题标注 5 篇相关论文
  • 每次迭代后跑测试集,人工抽查 20% 的结果

3)端到端评估:

  • 用 LLM-as-Judge 对生成的综述打分
  • 评估维度:相关性、完整性、逻辑连贯性

向量检索 vs 重排序对比

指标仅向量检索+ 重排序提升幅度
Recall@30.610.82+34%
MRR0.450.62+38%
NDCG@50.520.71+37%

人工评估结果

评估维度首次生成优化后提升幅度
相关性(与主题匹配度)3.8/54.6/5+21%
完整性(是否覆盖关键维度)3.5/54.3/5+23%
逻辑连贯性(行文流畅度)3.6/54.4/5+22%

端到端评估

评估维度首次生成优化后提升幅度
相关性3.9/54.5/5+15%
完整性3.6/54.4/5+22%
逻辑连贯性3.7/54.4/5+19%

2.2 系统性能评估测试


性能评估测试集包含 50 个不同的研究主题,覆盖 5 个领域,每个领域 10 个主题。

测试集详细构成

维度数量说明
学术领域5 个AI/ML、NLP/CV、强化学习、系统/网络、理论/数学
每个领域主题数10 个每个领域覆盖不同复杂度
总主题数50 个覆盖中英文混合查询
每个主题重复次数3 次测试缓存命中率和一致性
总运行次数150+ 次包含首次运行 + 缓存命中运行

为什么是 50 个?

原因说明
统计学意义50 个样本足够计算 P50/P95/P99 等百分位数,排除偶然因素
领域覆盖5 个领域确保评估不偏向某一个方向(如全是 NLP,忽略强化学习)
成本可控150 次 LLM 调用 ≈ $5-10,在评估预算内
时间可控自动运行 150 次任务,约 4-6 小时完成

测试主题示例

AI/ML(10 个)

  • "Transformer attention mechanism"

  • "Large language model fine-tuning"

  • "Reinforcement learning from human feedback"

  • "Few-shot learning in computer vision"

  • "Graph neural networks for molecular property prediction"

  • "Diffusion models for image generation"

  • "Federated learning privacy protection"

  • "Self-supervised learning in NLP"

  • "Generative adversarial networks in medical imaging"

  • "Meta-learning for few-shot classification"

中英文混合(10 个)

  • "基于大语言模型的代码生成"(中文)

  • "Vision Transformer 在图像分类中的应用"(中文)

  • "GPT for code generation"

  • "LLaMA 模型微调"(中文)

  • "ReAct agent with tool calling"

  • "AI agent planning and reasoning"

  • "Transformer 注意力机制"(中文)

  • "强化学习在游戏中的应用"(中文)

  • "Neural network quantization and pruning"

  • "对比学习在语音识别中的应用"(中文)

其他领域(30 个)

  • 系统、网络、理论、数学等领域的典型研究主题,为了使篇幅不显得冗长,这里不再做一一展示。

测试结果

指标数值说明
P50 耗时85s中位数
P95 耗时115s95% 请求在 115s 内完成
P99 耗时140s最慢 1% 不超过 140s
首次运行耗时95-120s无缓存
缓存命中耗时5-15sRedis 缓存命中
失败率0%150 次运行,0 次失败
限流触发次数6 次测试中触发限流,验证生效

2.3 并发处理测试

2.2.1 异步任务队列架构

并发测试场景

场景并发数Worker 数任务类型持续时间
场景 1: 轻负载523 篇论文10 分钟
场景 2: 中负载2045 篇论文20 分钟
场景 3: 高负载5045 篇论文30 分钟
场景 4: 突发流量1004混合5 分钟

测试结果

📊 并发测试结果
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
场景 1: 轻负载 (5 并发, 2 Workers)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务提交响应: 平均 45ms | P95 78ms | P99 120ms
任务完成时间: 平均 85s | P95 110s | P99 135s
Worker 利用率: 45%
CPU 利用率: 30%
内存利用率: 2.1GB

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
场景 2: 中负载 (20 并发, 4 Workers)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务提交响应: 平均 52ms | P95 95ms | P99 145ms
任务完成时间: 平均 92s | P95 125s | P99 160s
Worker 利用率: 78%
CPU 利用率: 55%
内存利用率: 3.8GB

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
场景 3: 高负载 (50 并发, 4 Workers)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务提交响应: 平均 68ms | P95 120ms | P99 180ms
任务完成时间: 平均 105s | P95 145s | P99 190s
Worker 利用率: 95% (接近饱和)
CPU 利用率: 72%
内存利用率: 5.2GB
队列积压: 最多 15 个任务

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
场景 4: 突发流量 (100 并发, 4 Workers)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务提交响应: 平均 85ms | P95 150ms | P99 220ms
任务完成时间: 平均 120s | P95 170s | P99 210s
Worker 利用率: 100% (饱和)
CPU 利用率: 85%
内存利用率: 6.8GB
限流触发次数: 75 次 (限流生效)
队列积压: 最多 45 个任务
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

并发处理关键指标

指标中负载 (20 并发)高负载 (50 并发)突发流量 (100 并发)
提交响应时间52ms68ms85ms
任务完成时间92s105s120s
Worker 利用率78%95%100%
CPU 利用率55%72%85%
内存利用率3.8GB5.2GB6.8GB
任务失败率0%0%0%
限流触发75 次

2.4 缓存命中率

测试方法

  • 运行 50 个不同主题的查询

  • 每个主题重复查询 3 次

  • 分别记录 L1、L2、L3 的命中情况

📊 缓存命中率测试 (50 个主题 × 3 次)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

首次查询 (无缓存):
总请求: 50
缓存命中: 0
实际执行: 50
平均耗时: 95s

第二次查询:
总请求: 50
L1 命中: 10 (20%)
L2 命中: 32 (64%)
L3 命中: 8 (16%)
总命中率: 100%
平均耗时: 8s

第三次查询:
总请求: 50
L1 命中: 35 (70%)
L2 命中: 15 (30%)
L3 命中: 0 (0%)
总命中率: 100%
平均耗时: 2s
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

缓存命中率统计

缓存层级首次查询第二次查询第三次查询稳态命中率
L1 内存0%20%70%65%
L2 Redis0%64%30%25%
L3 文件0%16%0%5%
总命中率0%100%100%95%

缓存命中带来的性能提升

场景无缓存有缓存 (稳态)提升幅度
查询耗时95s2s47 倍
LLM 调用次数5 次/请求0.5 次/请求90% 减少
API 成本$0.05/请求$0.005/请求90% 降低

3成本评估

3.1 智能路由

模型定价(阿里云百炼)

模型输入价格 (¥/1K tokens)输出价格 (¥/1K tokens)
qwen-turbo¥0.0003¥0.0006
qwen-plus¥0.004¥0.008
qwen-max¥0.02¥0.04

单次任务 Token 消耗完整分析

场景:5 篇论文,生成完整综述(2000 字)

阶段模型输入 tokens输出 tokens输入成本输出成本阶段成本
分析主题qwen-turbo500200¥0.00015¥0.00012¥0.00027
筛选论文qwen-turbo3,000100¥0.00090¥0.00006¥0.00096
阅读论文 1qwen-plus2,000500¥0.008¥0.004¥0.012
阅读论文 2qwen-plus2,000500¥0.008¥0.004¥0.012
阅读论文 3qwen-plus2,000500¥0.008¥0.004¥0.012
阅读论文 4qwen-plus2,000500¥0.008¥0.004¥0.012
阅读论文 5qwen-plus2,000500¥0.008¥0.004¥0.012
对比分析qwen-plus4,000800¥0.016¥0.0064¥0.0224
生成综述qwen-max5,0002,000¥0.10¥0.08¥0.18
合计-24,5005,600¥0.157¥0.106

单次任务的成本=输入成本+输出成本=0.263

智能路由策略比全部用qwen-max节省成本49%

各阶段成本占比

单次任务成本分解 (¥0.263):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
生成综述: ████████████████████████████████████████ 68% (¥0.18)
阅读 5 篇: ████████████████████████ 23% (¥0.06)
对比分析: ██████ 8% (¥0.022)
分析 + 筛选: █ 1% (¥0.001)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
输入成本: 60% (¥0.157) | 输出成本: 40% (¥0.106)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3.2 缓存策略

根据前面缓存命中率测试结果

缓存层级首次查询第二次查询第三次查询稳态命中率
L1 内存0%20%70%65%
L2 Redis0%64%30%25%
L3 文件0%16%0%5%
总命中率0%100%100%95%

选用稳态命中率进行成本评估

稳态成本 = 首次成本 × (1 - 命中率) + 缓存成本 × 命中率
= ¥0.263 × 5% + ¥0.001 × 95%
= ¥0.01315 + ¥0.00095
= ¥0.0141

100次任务缓存成本计算

场景命中率单次成本100 次成本说明
首次查询0%¥0.263¥26.30完整 LLM 调用
第 2 次查询100%¥0.001¥0.10缓存命中 (Redis)
稳态 (95% 命中)95%¥0.014¥1.40混合场景

基于这个数据,在稳态场景下,单次任务的真实成本约为¥0.014,相比首次执行的 ¥0.263,节省了94.7%

对于企业场景(6000 任务/月),月成本从无缓存的 ¥1,578 降至¥138,节省超过 90%。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 15:30:16

职业禁忌证管理实操:甲亢与甲状腺功能异常人员如何调岗与闭环处理

在整理职业健康检查台账时&#xff0c;不少 EHS 和 HR 同行应该都有过类似感受&#xff1a;体检报告上写着“甲状腺功能异常&#xff0c;建议复查”或者“甲亢”字样时&#xff0c;真正的难点不是读懂甲状腺激素指标&#xff0c;而是不知道下一步该怎么办。能不能继续安排上岗&…

作者头像 李华
网站建设 2026/9/3 15:29:03

【研发类-数据库开发Skills】azure-mgmt-mongodbatlas-dotnet 技能

将MongoDB Atlas组织作为Azure ARM资源管理&#xff0c;通过Azure Marketplace统一计费 技能概述 azure-mgmt-mongodbatlas-dotnet 技能是一个用于管理MongoDB Atlas组织的技能&#xff0c;将MongoDB Atlas作为Azure ARM资源进行管理&#xff0c;并通过Azure Marketplace实现…

作者头像 李华
网站建设 2026/9/3 15:24:16

视觉词袋模型在肺腺癌生长模式空间映射中的应用与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 15:22:42

Solana Anchor开发框架的 IDL 指令攻击分析

Anchor 是 Solana 生态中最主流的开发框架。它通过声明式账户验证、自动序列化和内置安全检查等特性&#xff0c;极大地降低了开发门槛。然而&#xff0c;框架在提供便利性的同时&#xff0c;也在幕后向每个程序注入了一些开发者可能并不了解的内部指令。这些“隐藏”指令在特定…

作者头像 李华
网站建设 2026/9/3 15:20:57

晶闸管原理与应用:从半控特性到相位控制的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华