6.5 KiB
真实提供商与 MCP 联调压测报告
日期:2026-09-06。代码基线:
cec8daa,分支feat/chat-retrieval-markdown。环境:Windows、本地 AI Core HTTP 服务、现有 DeepSeekdeepseek-v4-flash、已注册的 MiniMax Coding Plan MCP。未使用 Mock 替代下面的模型或 MCP 调用。
1. 结论
普通流式对话、按需检索、聊天创建智能体、内置与 Plugin 工具、MCP 网页搜索、任务读取和经过权限确认的任务修改均完成。任务 API 在独立进程中以 20 并发完成 1,000 个任务的创建、分页、更新和删除,最终无残留,健康检查无错误。
真实模型部分为小规模并发联调,最高两路并发,不代表厂商吞吐极限。未进行图片理解、上传解析、浏览器渲染、断网重连或长期稳定性压力测试。本报告的历史回读与 Trace 验证通过 HTTP 完成,不等同于浏览器逐项点击验证。
2. 真实对话与工具结果
| 场景 | 耗时(秒) | 验证结果 |
|---|---|---|
| 普通对话,两路并发 | 5.281 / 5.297 | 均收到 ThinkingDelta、TextDelta、Usage、Done,无 Error;每个会话保存 2 条消息 |
| 按需知识库检索 | 44.250 | 实际调用 3 次 rag.search;返回 15 条来源;正文包含数字引用 |
| 对话创建智能体 | 14.203 | 实际调用 agent.create,返回真实 run_id;对话流结束后继续等待智能体终态 |
| 被委托的智能体 | 10.443 | 调用 markdown.catalog 成功,终态 completed;耗时来自 Trace,与对话耗时存在重叠 |
| MCP 网页搜索,16,000 Token 预算 | 8.344 | mcp.9ca7ee21603a.web_search 成功,智能体 completed |
| 内置与 Plugin 工具,16,000 Token 预算 | 10.391 | chat-policy.plan、math.add、markdown.catalog 均成功,智能体 completed |
| 任务只读工具 | 4.312 | tasks.list 成功,智能体 completed |
| 任务写入与权限确认 | 5.187 | tasks.update 触发一次确认,allow_once 后指定测试任务变为 done,智能体 completed |
普通对话首个流事件分别在 4.906 和 4.812 秒到达;此指标不是首个正文字符时间。检索场景首事件为 4.687 秒。
检索回答保存的来源具有 citation_id、note_id、block_id、file_path、偏移和 number;正文的数字标记与来源记录一起持久化。保存的是候选来源集合,前端仍应按正文引用筛选展示。
2.1 Token 边界结果
首次将直接创建的两个智能体预算设为 6,000 Token:MCP 搜索与三项内置/Plugin 工具都执行成功,但智能体分别在累计 6,960、6,487 Token 后以 TOKEN_BUDGET_EXCEEDED 结束,无最终正文。不能把这两次运行算作完整成功。
随后以 16,000 Token 重跑,两者均完成,分别使用 6,941、3,477 Token。两次模型规划和输出不同,因此第二次 Token 更少不代表缓存或性能优化。现有预算是累计调用的终止约束,并非能够精准阻止当次请求超出余额;如需要严格费用上限,应继续评估每轮输出额度与输入估算。
2.2 持久化和回放
回读四个成功运行的 Trace,事件分别为 11、11、15、11 条,序号连续,summary.errors 为 0,终态均为 completed。未重启服务验证中断恢复。
可在本地 AI 对话页面找到四个以 [真实压测] 开头的会话。智能体运行记录保留用于复核;真实任务写入测试仅修改本次创建的唯一任务 ID,结束后该测试任务已删除,未修改原有任务。
3. 任务 HTTP 压力测试
命令(仓库根目录):
backend/.venv/Scripts/python.exe backend/scripts/task-http-stress.py --count 1000 --concurrency 20 --output .local-plans/task-http-live-report.json
脚本在独立临时目录中启动 Uvicorn,通过真实回环 HTTP 操作任务,使用真实 SQLite 持久化;不复用用户数据库,也不调用外部模型。
| 操作 | 次数 | P95(ms) | 最大值(ms) |
|---|---|---|---|
| 创建 | 1000 | 145.84 | 189.59 |
| 更新 | 1000 | 157.51 | 287.81 |
| 删除 | 1000 | 153.48 | 178.98 |
| 分页与收尾查询 | 11 | 26.59 | 26.59 |
| 健康检查 | 310 | 31.50 | 123.49 |
总耗时 19,569.35 ms。分页获取的 ID 集合与创建集合一致;更新结果均为 done;最终任务数为 0;健康检查错误数为 0。该耗时不含服务启动。
首次运行已完成全部任务操作,但在取消健康检查协程的收尾阶段未退出、未写出报告。临时库与操作日志证明业务操作已完成;本次将脚本改为 Event 通知退出,并设置有界等待,重跑成功。未将首次未收尾运行纳入性能统计。
4. 复核方法
- 从
GET /api/providers选择现有真实提供商及默认模型,不输出或复制凭据;通过GET /api/tools和/api/mcp/servers检查工具注册与服务状态。 - 使用
POST /api/chat/conversations创建带压测前缀的会话,再以POST /api/chat读取 SSE,统计事件、首事件延迟、错误和工具调用。普通对话关闭 use_rag;检索场景开启 use_rag;委托场景开启 allow_agent。 - 检索提示词为“实际检索 Markdown 警告框,简要说明并用数字引用来源”;委托提示词要求创建只读智能体,调用 markdown.catalog。回读会话消息检查正文和来源字段,检查 agent.create 返回的真实运行终态。
- 使用
POST /api/agent/runs设置明确 allowed_tools、max_steps 和 token_budget。MCP 场景仅允许网页搜索,查询Python official documentation一次,allow_network 为 true;其他场景不允许网络。 - 任务写入场景先通过 API 创建唯一测试任务,仅允许智能体使用 tasks.update 修改该 ID 的 status 为 done。只对完全匹配此调用的权限票据提交 allow_once;回读任务状态后删除该测试任务。
GET /api/agent/runs/{run_id}/trace验证事件序号、工具结果、模型调用计数和终态。任务批量正确性使用上面的独立脚本验证。
本机原始结果保存在 .local-plans/live-chat-report.json、live-agent-retest.json、live-trace-report.json、live-task-agent-report.json 和 task-http-live-report.json;该目录不提交。附件与委托的定向后端回归另执行 10 项测试,全部通过。
5. 提交与推送状态
功能改动提交为 cec8daa,报告与压测脚本修正提交为 266608b。首次推送时 Gitea 返回 Failed to authenticate user;完成压测后重试成功,以上提交已推送至 gitea/feat/chat-retrieval-markdown。本地 Vault 的既有未提交改动保持原样。