# 轻量版拓展分析自然语言触发 — 第二轮测试报告 - 时间:2026-08-27 - 被测提交:db610031c + afdb1614a(修复第一轮 7 项反馈 + PM 裁断修正,均未 push) - 测试环境:/home/xzq/miniconda3/envs/plantai-bff/bin/python(Python 3.11.15 / pytest 9.1.1 / pytest-cov 7.1.0) ## 测试文件清单 | 文件 | 状态 | 用例数 | 结果 | |---|---|---|---| | tests/unit/test_extension_stage_lightweight_nl_intent.py | 更新+新增 | 79(上轮 58) | 全绿 | | tests/unit/test_extension_stage_lightweight_nl_backend.py | 更新+新增 | 23(上轮 18) | 全绿 | | tests/unit/test_extension_stage_lightweight_frontend_contract.py | 不变(与新实现一致,未删断言) | 20 | 全绿 | ## 通过/失败数 | 组 | 结果 | |---|---| | A 组(nl_intent 单元) | 79 passed,覆盖率 100%(223 stmts / 0 miss) | | B 组(main.py 后端集成) | 23 passed | | C 组(前端契约) | 20 passed | | 相关四文件回归(A+B+C+deepseek_semantics) | 131 passed | | Phase A 三件套(agent/input_binding/golden_runner_semantic) | 6 passed | | test_agent_chat_actions | 36 passed | | 全套 test_extension_stage_lightweight*.py | 337 passed + 6 既有失败(与第一轮相同 6 个,父提交复现,不拦路)+ 1 skip | ## 覆盖率 `nl_intent.py`:**223 stmts / 0 miss / 100%**。第一轮后新增代码(union 粗筛、_extension_id_tokens、_parameter_flag_tokens、_record_keyword_sources、compact_extension_name、catalog 24000、truncated reason、resolve 排序)全部覆盖。补测过程中 99%→100% 的一次补齐为 `_parameter_flag_tokens` 非 Mapping 元素跳过分支。 ## 失败用例+关键报错 本轮无功能缺陷导致的失败;5 个上轮用例因行为有意变更而更新(工具词不再全量、extension_name 改紧凑形式、blast/hmmer 用例 fixture 隔离)。 ## 第二轮修复验证结论(对应 main 要求的 5 项) ### 1. union 粗筛策略(afdb1614a)— 通过 - 带工具词+强触发词 → 关键词子集(不因强触发词全量):test_rough_candidates_union_strategy_with_strong_trigger_and_keyword ✅ - 纯强触发词无关键词命中 → 全量兜底:test_rough_candidates_pure_strong_trigger_falls_back_to_all ✅ - 纯工具词无强触发词 → 子集:参数化用例 "用 hmmsearch 搜索结构域" → ["ext_hmm"] ✅ - 无任何命中 → []:test_rough_candidates_no_match_returns_empty ✅ - 命中数降序(同分按 id):test_rough_candidates_sorted_by_hits_desc ✅ - 缺失 extension_id 过滤不产出 None:test_rough_candidates_skips_missing_extension_id ✅ - resolve 按候选分排序目录:test_resolve_orders_records_by_candidate_score ✅ ### 2. compact_extension_name — 通过 参数化 6 例:去尾缀时间戳(`03___hmm_1787130993548`→`03___hmm`)、超长截 30、空串、无时间戳原样 ✅ ### 3. catalog 24000 上限与 truncated reason — 通过 - MAX_CATALOG_CHARS == 24000 断言 ✅ - 60 条长 summary 记录截断、总长 ≤ 上限、截断点后首条追加超限 ✅ - 去重 seen_ids ✅ - 截断时 reason="ok; 候选过多已截断,请补充工具名" ✅ ### 4. _extension_id_tokens / _parameter_flag_tokens — 通过 - id token:`03___hmm_1787130993548` → 含 hmm、剔 len<3 ✅ - flag token:`--samples` 保留、单字母剔除、停用词剔除、无 contract 返回 []、非 Mapping 元素跳过 ✅ - _record_keyword_sources 三源合并(summary + id token + flag)✅ ### 5. B 组 message 中文模板 — 通过 - extension_id 为主、summary 首句截 60 字括号补充:"已识别为轻量拓展分析:ext_hmm(This tool searches sequences with hmmsearch)。请按引导上传或选择输入文件并核对参数后执行。" ✅ - 无 summary 时无括号补充 ✅ - params 新增 function_summary 字段 ✅ ### 6. import-paths 第二轮修复 — 通过 - 目录同名冲突 _1 后缀(原目录不被覆盖)✅ - 多路径先整体校验后复制:合法+非法混合 → 400 且合法文件未复制 ✅ - 不存在路径混入 → 400 且未复制 ✅ - 多合法路径全部复制 ✅ ### 7. PM 实测对齐(真实 store 固化)— 通过 test_real_store_pm_alignment_counts:HMM→9、DIAMOND→8、OrthoFinder→3、KaKs→2、ManifestQC→5、纯拓展分析→61,与 PM 实测完全一致;且 HMM 子集(9 条)构建 catalog 不截断(truncated=False),P0 截断问题在带工具词场景已解决。 ### 8. C 组一致性 — 通过 index.html 两提交间零改动,现有 20 个契约测试(含上轮追加 5 个)全部保持绿色,无需调整。 ## 遗留问题清单 | 编号 | 位置 | 现象 | 建议修复 | |---|---|---|---| | 1(P2) | nl_intent.py `_rough_candidates` / `_summary_keywords` | 纯中文功能词(如「样本表校验」)仍 0 候选不调 LLM——manifestqc 等中文场景只能靠「拓展分析」强触发词全量兜底(61 候选 + 24000 截断后 13 条进 catalog,排序靠目录名,manifestqc 18_ 系列仍在截断线外)。实测「用 ManifestQC 拓展分析」走 id token 命中可解,但用户不知工具英文名的场景仍受限 | 产品层面确认是否需要中文功能词→工具映射表;或截断时按 18 案例优先级排序 | | 2(P3) | nl_intent.py `_extension_id_tokens` | extension_id 的通用英文 token(如 "ext"、数字时间戳)也进关键词源,实测 "ext" 已在 _ENGLISH_STOPWORDS 之外(是 "extension" 的子串场景会误命中);上轮实测 blast 消息误命中 "against" 属 summary 普通词干扰,union 策略下仍可能存在这类弱命中把无关记录顶进子集 | 低风险;可考虑给关键词源加权重(id token > summary > flag),弱命中不参与排序竞争 | | 3(P3) | 全套 lightweight 回归 | 6 个既有失败(与第一轮相同清单),父提交 90f51ed60 复现,与本改动无关 | 不拦路;建议另开任务 | ## 测试环境备注 - 环境同第一轮(plantai-bff + 已补装的 pyyaml/openai/pandas/requests/openpyxl)。 - 工作区改动仅测试文件:tests/unit/test_extension_stage_lightweight_nl_intent.py(更新+新增)、tests/unit/test_extension_stage_lightweight_nl_backend.py(更新+新增)。开发代码未触碰,未 push。