7.6 KiB
7.6 KiB
TEST_REPORT_PRIV_R2 —— 私有资料问答轮次测试 R2(缺陷复测 + 全量回归)
docs/team/TEST_REPORT_PRIV_R2.md | T1 执行 2026-09-07 | 用例表 docs/team/TEST_CASES_PRIVATE.md(v1.2) 基线:feature/bioflow-conversation-orchestration @ 04c08e8(R1 三缺陷修复,BFF 已重启 0.0.0.0:8090) L4 浏览器冒烟本轮仍跳过(TL 终验执行)。
1. 执行摘要
- R1 三缺陷复测:2 关闭、1 关闭但有连带观察(BUG-01 关闭 / BUG-02 关闭 / BUG-03 关闭+真命中误伤观察)。
- 发现 R2 新缺陷 1 个:BUG-PRIV-R2-01(ask_private 的 LLM 调用未传 question——user 消息只有检索上下文,见 §6)。
- 全量回归全绿:vstore 101/101;sdk 225 passed + 38 errors(预存基线,无新增);前端 373 + 23 = 396。
- 红线 diff 复核:QA 8091 / 前端 / vstore / sdk 红线 / 新模块 yield——diff 全部为空。
2. 缺陷复测结论
BUG-PRIV-R1-01(信封缺 ok 键)——【关闭】
| 场景 | 实际响应 | 判定 |
|---|---|---|
| 命中(question="DOCGEN_R1_E2E_SENTINEL_K7Q2 是什么") | keys: [answer, elapsed_ms, hit, items, mode, ok],ok:true,hit:true,items:8 | 关闭 |
| 未命中(min_score=0.95) | keys 同上,ok:true,hit:false,mode:"empty" | 关闭 |
BUG-PRIV-R1-02(空 question 未 422)——【关闭】
| 场景 | 实际响应 | 判定 |
|---|---|---|
| body={"question":""} | HTTP 422 {ok:false,error:{code:"VALIDATION",message:"请求参数不合法",degraded:false}} |
关闭 |
| body={} | HTTP 422 同上 | 关闭(基线即正确,复验通过) |
BUG-PRIV-R1-03(无关查询零痕迹)——【关闭(方案 c:自谦答语确定性改判)】
| 场景 | 实际响应 | 判定 |
|---|---|---|
| question="zqxwcrvtnmkjhgfdsp 完全无关的问题xyz"(R1 复现用例) | {ok:true, hit:false, mode:"empty", answer:"", items:[]} |
关闭(零痕迹) |
| question="DOCGEN_R1_E2E_SENTINEL_K7Q2 是什么"(真命中验证) | ok:true, hit:true, items:8, answer 含 [资料1][资料2] 引用与具体内容(1.58s,elapsed_ms:1579) | 真命中路径可用 |
修复实现核对(git show 04c08e8):SELF_DEPRECATING_ANSWERS 7 条短语 + _is_self_deprecating(含空答案视同未命中);命中/未命中包 ok 键;PrivateQARequest.question 加 min_length=1。commit 文件范围 3 个(private_docs.py / schemas.py / privateqa.py),全部在清单内。
3. 真命中误伤观察(与 BUG-03 修复连带,定位后升格为新缺陷)
TL 指定的真命中验证问题「批量导入压测样例 序号 38」实测 hit:false(两次重试均如此)。排查链:
- vstore 检索正常:search-chunks q="批量导入压测样例 序号 38" → mode:"vector",sample_038 两条各 score 0.766(远高于 0.30)。
- 响应耗时 1.31s(对照组 hit:true 1.58s)→ 走了 LLM 路径,属「LLM 自谦答语被改判」,非检索短路。
- 代码定位:
ask_private调complete_text(SYSTEM_PROMPT, context)——user 消息是检索上下文([资料n]《name》snippet 列表),question 从头到尾没进 LLM。LLM 只看到 8 条彼此相似(序号 37/38/48/58…)的压测材料、不知用户问的是「序号 38」,于是诚实自谦 → 被改判 hit:false。 - 该问题自 A1 原实现(e783a26)即存在(git show 对照确认),非
04c08e8修复引入;04c08e8 的改判机制把「诚实自谦」放大成了「零痕迹」,暴露了它。 - 与基线(e783a26)行为对比:修复前同样问题会返回 hit:true + 自谦答语 + items(R1 报告「测试文档8」即此形态);修复后一律 hit:false。修复没有引入新错误,但真命中命中率下降。
4. 全量回归统计
| 套件 | 命令 | 结果 | 对比 R1 |
|---|---|---|---|
| vstore pytest | 仓库根 venv/bin/python -m pytest vstore/tests/ -q |
101 passed,2 warnings(fastapi on_event DeprecationWarning 预存) | 一致 |
| sdk pytest | cd sdk && venv/bin/python -m pytest -q |
225 passed / 0 failed / 38 errors(errors 全部为预存基线 test_docgen_api.py collection ERROR,§R1 报告 §5 已有 dea4640 对照证据) |
一致,无新增失败 |
| 前端 vitest 全量 | cd ui && npx vitest run |
27 files / 373 passed | 一致 |
| 前端 private_docs | npx vitest run --config tests/private_docs/vitest.config.js |
4 files / 23 passed | 一致 |
| 合计 | 396 + 101 + 225 | 无回归 |
5. 红线 diff 复核(dea4640..HEAD)
| 项 | 命令 | 结果 |
|---|---|---|
| QA 金标树 8091 | git diff dea4640 HEAD --stat -- agent/qa |
空 |
| 前端红线(modes/labels/bench/api/qa/sse/parser/PipelineCard) | git diff dea4640 HEAD --stat -- … |
空 |
| vstore 红线(retrieval/parsing/backend/crypto) | 同上 | 空 |
| sdk 红线(qa.py/sse_relay.py/compile_sdk.sh) | 同上 | 空 |
| 新模块无 yield | grep -c yield privateqa.py private_docs.py | 0 / 0 |
HEAD=04c08e8,修复 commit 仅 3 文件全部在清单内。
6. R2 缺陷清单
BUG-PRIV-R2-01(一般/严重待裁)|ask_private 的 LLM 调用未传 question,真命中问题易被自谦改判成 hit:false
- 对应 TC:TC-PRIV-L2-10、TC-PRIV-L4-02(ask 模式命中出卡)。
- 复现步骤:
curl -X POST /api/qa/private -d '{"question":"批量导入压测样例 序号 38"}'(vstore 检索确认 sample_038 score 0.766 命中)。 - 预期:hit:true + answer 引 [资料1] 回答序号 38 的样例内容。
- 实际:hit:false、items:[](两次重试一致,响应 1.31s 表明 LLM 已调用)。
- 根因:
sdk/app/services/privateqa.pyask_private中complete_text(SYSTEM_PROMPT, context)——user 消息只有检索上下文,question 未传入(system prompt 也无占位注入)。LLM 无法回答用户问题只能自谦,被 R1-03 改判机制转 hit:false。 - 影响:所有「上下文不含答案线索、需理解问题指向」的命中提问会被误杀为零痕迹;R1 报告中的「测试文档8」(当时 hit:true)现同样 hit:false。客户真实资料(正文含实质内容)下该问题会显著降低命中率——建议升为严重级。
- 修复建议(交 A1):user 消息改为
f"用户问题:{question}\n\n参考资料:\n{context}"(或 system 末尾追加「用户问题:{question}」);SYSTEM_PROMPT 保留约束。改后回归 L1-22(命中链路参数断言)需同步断言 user 含 question。 - 说明:此缺陷在
e783a26即存在(git show 对照),R1 因当时答语形态为「hit:true+自谦」未暴露为零痕迹问题;04c08e8 改判机制放大暴露。修复面小、价值高,建议 R3 修复后重开该验证用例。
7. 用例表回写(TEST_CASES_PRIVATE.md v1.2)
- TC-PRIV-L2-10:信封含 ok:true;注明 BUG-PRIV-R2-01 现状(LLM 上下文不含 question,自谦答语确定性改判 hit:false)。
- TC-PRIV-L2-11:信封含 ok:true;自谦答语改判 hit:false。
- TC-PRIV-L2-12:确认空 question 与缺 question 均 422(min_length=1)。
- TC-PRIV-L3-01 / L4-03:注明「无关查询 → hit:false(自谦答语改判)」。
- 追溯矩阵复核:defined 92 = used 92,无孤儿无缺漏。
8. 结论
R1 三缺陷全部关闭(BUG-03 关闭方案 c 与 TL 裁决一致),全量回归无新增失败,红线零 diff。新缺陷 BUG-PRIV-R2-01(LLM 未收到 question)为 A1 原实现预存问题、被 R1-03 修复放大暴露,修复面小(user 消息拼 question 一行级改动),建议交 A1 修复后开 R3 复测(重点:TL 指定真命中问题「批量导入压测样例 序号 38」应 hit:true)。