已开启
[RFC] knowledge-query-asc-enhance:为 Ascend C API 补齐版本/架构适用面与声明级证据 #67
flyingXLB创建于 6 天前
6 天前 关联了pull request:feat(knowledge): 新增 knowledge-query-asc-enhance(asc-devkit 声明与样例增强消费)
Junyi
1 天前 评论:
1 天前 评论:
已核对关联 !166 当前 3088404,固定提交、缓存/索引锁及A/B执行失败关闭已有实现。PR现有31项离线回归在补齐本地PyYAML依赖后全部通过;这些是本地fixture测试,不是重跑RFC的真实A/B结果。
仍有一处与本RFC默认来源边界直接相关的输出缺口:query_asc.py L338-L355 只返回候选数,未传出当前索引的文档覆盖量;空索引也只显示 count=0 / no matches,没有覆盖不足提示。RFC承诺的“报告doc_count与上游未标注事实”尚未体现在这条输出中。
我用隔离本地Git仓、asc-search替身和PR原版ensure/query入口做了两组对照:① 当前实例 meta.doc_count=0;② 索引有1篇文档,但关键词未命中。两者均退出0、count=0、stderr为空,输出均没有覆盖量或告警字段。这里验证的是消费协议,未执行真实上游asc-search,也不据此测量召回率或速度。
建议把当前surface/arch/version实例的覆盖量及覆盖不足提示带到JSON和文本输出,并与“非空索引中的普通零命中”分别回归。零覆盖的原因应依据索引范围/构建记录说明,不直接推断为API不支持;真实零命中的既有退出码语义可保留。这样默认未标注源、过滤后无覆盖和已有覆盖却没搜到,不会在消费端变成同一种否定结论。


[RFC] knowledge-query-asc-enhance:为 Ascend C API 补齐版本/架构适用面与声明级证据
当前问题与修改必要性
knowledge-query的知识检索(含ascendc-api-knowledge-query专用消费流程)。当问题把 CANN 版本或 NPU 架构钉死时(例如"CANN 9.2.0、3510 架构下这个 API 怎么用"),现有检索只能给到知识卡,而卡片不携带可核对的版本适用面:本仓knowledge/ops/ascendc/apis/**的卡片中,cann_versions声明率为 0 / 16(实测,见下)。同时,知识库只镜像 asc-devkit 的 文档,不含include/声明与examples/样例,因此"这个 API 的签名、参数地址空间、dtype、配套样例是什么"也无法从知识库回答。governance/specs/skills.md已明载「Query 当前不按 CANN 版本执行结构化过滤」;checks/sources.py侧只保留source_headers指针(卡片 419 行的asc_mmad卡仅给出 2 个头文件路径,没有结构化声明)。asc-devkit 仓内已有现成的asc-search引擎,能把「文档 slim 头 + include Doxygen + examples marker」三类头派生为按版本/架构筛选的索引,但知识库侧没有消费它的入口。knowledge-query无版本维度过滤,无法回答"这个 API 在 9.2.0/3510 是否适用";②ascendc-api-knowledge-query复用同一索引,同样只有卡片;③ 卡片正文即使提到版本,也只是散文,无法按--version/--product/--dtype/--param/--enum过滤或反查;④ 首次 POC 已证伪"镜像存在覆盖缺口"的假设——镜像完整(A Hit@5 = 1.000),所以这不是一个"补召回"的需求,而是"补适用面与证据"的需求。目标与方案
knowledge-query之外提供一条只读补充通道knowledge-query-asc-enhance:按需准备 asc-devkit 精简单检出(.agent/docs/include/examples),用其asc-search建立按 surface × 架构 × CANN 版本 分实例的索引,返回带版本区间、逐产品支持、include 声明、样例关联的候选。不替代 Query 的知识卡检索,也不产生任何卡片。SKILL.md+ 3 篇 references + 2 个脚本)、安装/文档/治理接入、evals/用例与离线回归。不包含:知识卡内容变更、asc-devkit 侧标注工作、除c_api之外 surface 的落地。kind(doc/include/example) /path/api/title/version/product_support/headers/examples/why)+ 机器可读 JSON。写入边界:只在缓存目录($CANNBOT_ASC_DEVKIT_SLIM或$HOME/.cache/cannbot/asc-devkit-slim)写克隆与索引,不写知识仓、不改 asc-devkit 正文、不产卡、不写 Query receipt。<cache>.new后原子替换并删除旧版本;--offline只用缓存;--from-local支持用本地仓(便于验证未合并的标注分支)。实测:联网稀疏克隆 3.8s、幂等重入 0.19s。<index-root>/<surface>/<arch>/<cann-version>/,与 asc-search 的index/<surface>单实例布局解耦;廉价新鲜度判据 = 索引meta.source_commit== 缓存 commit 且 surface/arch/cann-version 一致(O(1)),需要字节级复验时用--verify(约 3.5s)。build_index.py必需--scope/--arch/--cann-version/--out/--check,query.py必需--index-dir/--json;surface 从--help解析而不硬编码;任一不满足 → exit 2 并给出可操作原因。asc-search,不复制其推导逻辑;本仓只新增一个消费型 Skill、一个evals用例集与离线回归。surface 可拓展性:当前仅c_api(上游SCOPES只有这一项);新增 surface 时上游加一条SCOPES并补齐该层级标注即可,本 Skill 无需改代码(--surface透传、索引按 surface 分目录、精简单检出一次到位覆盖四目录)。knowledge-query里加版本过滤——被否:Query 的索引建立在知识卡上,卡片本身没有版本结构化字段,等于要改卡片 Schema(更大且与镜像同步器冲突);② 扩展现有ascendc-api-knowledge-query——被否:该 Skill 的契约是"复用 Query 索引",塞入跨仓外部索引会破坏其单一索引与审计契约;③ 等 asc-devkit 把标注合入后再做——被否:标注进度不在本仓控制内,且本能力已可用 fork 上公开 ref 复现验证。knowledge-query、ascendc-api-knowledge-query、镜像同步、check.sh既有门禁均不变;本 Skill 为新增可选能力,安装模式新增随consumer/contributor一起安装。--offline/--from-local规避);查询 p95 0.32s;不新增任何写入权限。A/B 实验计划与结果
假设与验收标准(跑前固定):B(+asc-enhance)相对 A(仅 Query)应满足——①
cann_versions可核对率 ≥ 90%(A 基线 0%);② 命中候选带 include 声明证据 = 100%;③ 期望样例的用例中样例可得率 ≥ 50%;④ Hit@5 不劣化(B ≥ A,门槛 0;原计划的 +0.15 门槛已由 POC 证伪并修订,见下);⑤ p95 ≤ 3s(不含首次建索引)。A 与 B:A =
knowledge-query search(--match literal,platform 950);B = A 的同一问题 +query_asc.py。数据集:evals/asc_enhance_cases.yaml(16 条,来自asc-search索引的客观期望值:期望文档、版本区间、头文件、样例),驱动evals/run_asc_enhance_ab.py;数据源为公开可复现的flyingXLB/asc-devkit@okf-knowledge-user(b0f4a7e91)。POC 阶段的关键修订(先失败后修订,记录在案):初版预注册门槛是"Hit@5 绝对提升 ≥ +0.15"。POC 实测 A 0.875 → B 1.000(+0.125)未达标,进一步核查发现:知识库对 asc-devkit 文档的镜像没有内容缺口(16/16 期望卡的镜像卡都存在),且初版 A 的命中判定口径有误(漏去 Concept ID 的
.md后缀)。修正口径后 A = B = 1.000——说明召回不是本能力的价值点,价值在适用面与证据。据此把指标修订为上面 5 条并重新预注册。实测结果(16 条用例,
b0f4a7e91):cann_versions可核对率source_headers指针)控制变量:同一问题文本、同一目标平台、同一机器;A/B 都按 API 名精确检索(A 用
--match literal,B 用--kw,避免用家族展开语义造成假阴性);B 的索引固定为 3510 × 9.2.0 单实例。完整结果与复现:
artifacts/asc_enhance_ab.json(忽略产物)+ 用例文件在evals/;一条命令可复跑:python3 evals/run_asc_enhance_ab.py --from-local <asc-devkit 仓> --ref okf-knowledge-user。结论:5 项门槛全部达成;召回归因不成立、适用面与证据归因成立。风险与退化见下节。
回归约束:不触碰
knowledge/与索引产物,knowledge_lint、sync-indexes --check、evals/run_retrieval.py --quality-gate与既有单测保持原状;新增离线回归evals/test_asc_enhance.py(10 项,fixture 驱动,无需网络)。风险与边界
cann/asc-devkit@master目前只有 1 篇带 slim 头的文档,默认形态下索引为空——这是跨仓依赖,不是本 Skill 缺陷;Skill 会明确报告doc_count与"上游未标注"的事实,并可用--source/--ref/--from-local指向已标注来源。