Files
NotesAgentic/docs/development/真实提供商与MCP联调压测报告.md

6.5 KiB
Raw Permalink Blame History

真实提供商与 MCP 联调压测报告

日期:2026-09-06。代码基线:cec8daa,分支 feat/chat-retrieval-markdown。环境:Windows、本地 AI Core HTTP 服务、现有 DeepSeek deepseek-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 TokenMCP 搜索与三项内置/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 持久化;不复用用户数据库,也不调用外部模型。

操作 次数 P95ms 最大值(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. 复核方法

  1. GET /api/providers 选择现有真实提供商及默认模型,不输出或复制凭据;通过 GET /api/tools/api/mcp/servers 检查工具注册与服务状态。
  2. 使用 POST /api/chat/conversations 创建带压测前缀的会话,再以 POST /api/chat 读取 SSE,统计事件、首事件延迟、错误和工具调用。普通对话关闭 use_rag;检索场景开启 use_rag;委托场景开启 allow_agent。
  3. 检索提示词为“实际检索 Markdown 警告框,简要说明并用数字引用来源”;委托提示词要求创建只读智能体,调用 markdown.catalog。回读会话消息检查正文和来源字段,检查 agent.create 返回的真实运行终态。
  4. 使用 POST /api/agent/runs 设置明确 allowed_tools、max_steps 和 token_budget。MCP 场景仅允许网页搜索,查询 Python official documentation 一次,allow_network 为 true;其他场景不允许网络。
  5. 任务写入场景先通过 API 创建唯一测试任务,仅允许智能体使用 tasks.update 修改该 ID 的 status 为 done。只对完全匹配此调用的权限票据提交 allow_once;回读任务状态后删除该测试任务。
  6. GET /api/agent/runs/{run_id}/trace 验证事件序号、工具结果、模型调用计数和终态。任务批量正确性使用上面的独立脚本验证。

本机原始结果保存在 .local-plans/live-chat-report.jsonlive-agent-retest.jsonlive-trace-report.jsonlive-task-agent-report.jsontask-http-live-report.json;该目录不提交。附件与委托的定向后端回归另执行 10 项测试,全部通过。

5. 提交与推送状态

功能改动提交为 cec8daa,报告与压测脚本修正提交为 266608b。首次推送时 Gitea 返回 Failed to authenticate user;完成压测后重试成功,以上提交已推送至 gitea/feat/chat-retrieval-markdown。本地 Vault 的既有未提交改动保持原样。