mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-03 15:53:56 +00:00
test(stress): 补更新前后全面对比脚本(cmp.py),修 blast 的计数错误
## cmp.py:更新前后对比的四个维度
★ 每轮都记录**处理数**(响应里有多少个工具结果标记)与**是否出现 error 帧**,
任一不符即记失败。理由:工具调用这一路的失败模式几乎都是**静默**的 ——
工具没跑、参数混拼、只处理了第一个 tool_call,都不报错只是结果不对。
"跑完没崩"完全不能说明它 work。
1. **批内工具调用**:!slowbatchN 在两版上各跑几轮,比中位耗时与处理数
2. **并发 vs 强制串行**(新版内部对照):!slowbatchN vs !serialbatchN
3. **调度器并发轰炸**:多连接并发排队,算通过率
4. **连续稳定性**:20 轮无错误率
## 修掉 mock 的 !serialbatch 缺失
之前只在 /tmp 的临时副本里加过,没进仓库,导致 cmp.py 测「强制串行」时
那个 marker 根本不存在 —— 测出来的"串行"其实是并发,**加速比是假的**
(0.34x / 0.31x,看起来并发比串行慢)。已加回并说明它的用途:跨版本做不了
并发/串行对照(旧版适配器缺 stream_index,工具一个都没真跑),只能在
同一套内核上做。
## 修掉 blast 的计数错误
第一版按 `conns * inputs` 起线程、每个线程又跑 `inputs` 轮 ⇒ 总输入数是
conns×inputs²,分子分母量纲不一致,算出过 **"128/32 = 400%"** 这种荒谬数字。
现在:恰好 conns 个 worker、每个跑 inputs 轮;且分母用**实际发出的**输入数
(含连接失败的),否则连接失败时通过率会虚高。
## 踩过的两个坑(都写进注释)
- 内核 `task.go:353` 有输入去重(`isDuplicateInput`,为 webui 断线重连重放
而设),相同文本被丢弃并回空响应 ⇒ 每轮输入必须带唯一后缀
- cli 的 auth 帧本身就是 `{"type":"response"}` ⇒ 必须先吃掉它再开始收集,
否则第一轮的"终止帧"是 auth,测出来耗时恒为 0
This commit is contained in:
@ -53,6 +53,12 @@ _RE_MIXED = re.compile(r"!mixed(\d+)")
|
||||
# cmd_run 已声明 ParallelSafe(执行体只依赖入参,共享的 p.history 由
|
||||
# recordCmd 加锁保护),且 sleep 是纯计算、不碰磁盘 —— 延迟可精确预期。
|
||||
_RE_SLOW = re.compile(r"!slowbatch(\d+)")
|
||||
# ★ 强制串行对照:混入一个未声明 ParallelSafe 的工具(knowledge_create)
|
||||
# ⇒ 内核 batchRunnable 必须整批退回串行("一个不安全就整批降级")。
|
||||
# 有了它才能在**同一套内核**上量出并发 vs 串行的差异 —— 跨版本做不到,
|
||||
# 因为旧版的适配器缺 stream_index,多个分片并到槽 0、参数混拼,
|
||||
# 工具一个都没真跑(耗时更短但没干活)。
|
||||
_RE_SERIALBATCH = re.compile(r"!serialbatch(\d+)")
|
||||
|
||||
# 批内并发的工具集。全部是**只读且已核实无共享写**的内置工具,
|
||||
# 且都不触发 ONNX(TF-IDF 关键词路)。
|
||||
@ -182,6 +188,16 @@ class H(BaseHTTPRequestHandler):
|
||||
|
||||
# ---- 批内并发:!batchN / !mixedN ----
|
||||
if not has_tool_msg:
|
||||
msb = _RE_SERIALBATCH.search(text)
|
||||
if msb:
|
||||
cnt = max(2, min(int(msb.group(1)), 32))
|
||||
sm = int(os.environ.get("MOCK_TOOL_SLEEP_MS", "200"))
|
||||
tcs = slow_tool_calls(cnt, sm)
|
||||
# 插在中间:确保降级判据不能靠"最后一个工具"侥幸通过
|
||||
tcs.insert(cnt // 2, mk_tool_call(900, SERIAL_TOOL,
|
||||
{"name": "对照/强制串行", "content": "x"}))
|
||||
return self._respond(body, content=None, tool_calls=tcs)
|
||||
|
||||
ms = _RE_SLOW.search(text)
|
||||
if ms:
|
||||
cnt = max(2, min(int(ms.group(1)), 32))
|
||||
|
||||
Reference in New Issue
Block a user