Files
group_fqcd_jr/docs/evidence/20260919-t10-h05-partition-closeout.json
T
张胜宇 9675df8453 chore(sync): zsy_developcc 全量同步至 qyqy_develop(W26 口径)
- 分支内容对齐 qyqy_develop b6ec3aa,树完全一致(同步后 git diff 为空)
- 覆盖本轮全部交付:客服 Agent 重构(安全路由 / 五出口 / 记忆与画像 / RAG 全链路)
  + 开发文档 62 份编号体系(D1.1 v1.17 索引)
  + 新增 D2.10-客服Agent端到端答辩文档-2026-09-21.html
- 基线:e239eb7(2026-09-17 品牌口径统一快照),本提交为其直接后继
2026-09-21 21:26:30 +08:00

211 lines
6.6 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"round": "W10 / H-05 收口复核",
"date": "2026-09-19",
"method": "真连 Milvus(describe_collection)+ 真实检索双向验证",
"items": {
"1_visibility_partition_key_not_null": {
"evidence": {
"fin_basic_collection": {
"num_partitions": 16,
"visibility_is_partition_key": true,
"visibility_nullable": null,
"visibility_max_length": 16,
"has_visibility_field": true,
"field_names": [
"chapter",
"content",
"doc_id",
"doc_no",
"effective_date",
"embedding",
"expire_date",
"family_id",
"intent",
"param_class",
"reviewer",
"section",
"source_file",
"source_url",
"tags",
"title",
"version",
"visibility"
]
},
"fin_faq_collection": {
"num_partitions": 16,
"visibility_is_partition_key": true,
"visibility_nullable": null,
"visibility_max_length": 16,
"has_visibility_field": true,
"field_names": [
"chapter",
"content",
"doc_id",
"doc_no",
"effective_date",
"embedding",
"expire_date",
"family_id",
"intent",
"param_class",
"reviewer",
"section",
"source_file",
"source_url",
"tags",
"title",
"version",
"visibility"
]
},
"fin_product_collection": {
"num_partitions": 16,
"visibility_is_partition_key": true,
"visibility_nullable": null,
"visibility_max_length": 16,
"has_visibility_field": true,
"field_names": [
"chapter",
"content",
"doc_id",
"doc_no",
"effective_date",
"embedding",
"expire_date",
"family_id",
"intent",
"param_class",
"reviewer",
"section",
"source_file",
"source_url",
"tags",
"title",
"version",
"visibility"
]
},
"fin_policy_collection": {
"num_partitions": 16,
"visibility_is_partition_key": true,
"visibility_nullable": null,
"visibility_max_length": 16,
"has_visibility_field": true,
"field_names": [
"chapter",
"content",
"doc_id",
"doc_no",
"effective_date",
"embedding",
"expire_date",
"family_id",
"intent",
"param_class",
"reviewer",
"section",
"source_file",
"source_url",
"tags",
"title",
"version",
"visibility"
]
}
},
"verdict": "PASS:四个集合的 `visibility` 均为**分区键**(`is_partition_key=true`)、`max_length=16`、`num_partitions=16`;写入侧空值被拒(见 1b 行为实测)。注:pymilvus 的 `describe_collection` 不回传 `nullable` 字段(为 null),故 NOT NULL **不以元数据断言**,改以行为实测为准。"
},
"2_retrieval_partition_pruning": {
"mechanism": "分区键模式下 Milvus 只支持可下推为分区裁剪的表达式;`app/core/knowledge_contracts.visibility_expression()` 产出 `visibility in [...]`,由 `knowledge_search_service.search()` 作为 `filter` 下发。",
"bidirectional_test": {
"query": "各类基金的起投金额分别是多少?",
"visitor_tiers": [
"public"
],
"visitor_top": [
{
"doc": "PROD-001-05",
"vis": "public",
"score": 0.7329
},
{
"doc": "PROD-003-05",
"vis": "public",
"score": 0.7247
},
{
"doc": "PROD-005-05",
"vis": "public",
"score": 0.7132
},
{
"doc": "PROD-007-03",
"vis": "public",
"score": 0.7108
}
],
"visitor_sees_registered": false,
"customer_tiers": [
"public",
"registered"
],
"customer_top": [
{
"doc": "FAQ-0020",
"vis": "registered",
"score": 0.8717
},
{
"doc": "PROD-001-05",
"vis": "public",
"score": 0.7329
},
{
"doc": "PROD-003-05",
"vis": "public",
"score": 0.7247
},
{
"doc": "PROD-005-05",
"vis": "public",
"score": 0.7132
}
],
"customer_sees_registered": true
},
"verdict": "PASS:同一条 `registered` 档内容,访客档检索**看不到**、客户档**看得到**"
},
"3_over_fetch_cancelled": {
"evidence": "全仓 `rg -i 'over_fetch|over-fetch'` 在 app/tools/tests 下**零命中**(分区裁剪后 TopK 不再被不可见条目占满)",
"verdict": "已取消"
},
"4_two_schema_scripts_converged": {
"build_schema_definitions": {
"setup_milvus_knowledge_collections.py": 1
},
"importers": {
"load_knowledge_milvus.py": [
"import setup_milvus_knowledge_collections as collections_setup # noqa: E402",
"from setup_milvus_knowledge_collections import FIELD_LIMITS # noqa: E402"
]
},
"num_definitions": 1,
"single_source": "tools/setup_milvus_knowledge_collections.py",
"verdict": "PASS:`build_schema` 全仓只有 **1 处**定义(`setup_milvus_knowledge_collections.py`),`load_knowledge_milvus.py` 反向 import 它复用 `build_schema`/`FIELD_LIMITS` ⇒ 同名集合「两套字段」已收敛为一套"
},
"5_tier_change_is_ops_action": {
"doc": "见 `D2.1` §10.3 SOP 与 `tools/setup_milvus_knowledge_collections.py` 文件头注释(分区键模式下 Milvus 禁止手工 `create_partition`:`disable create partition if partition key mode is used`,新增档位值 = 直接写入数据、由 Milvus 自动分布,**不是**建分区动作)",
"verdict": "已落文"
},
"1b_write_side_fail_closed_probe": {
"method": "按生产同款 schema 建临时集合并插入一条缺 `visibility` 的行;无论成败都 drop 临时集合",
"collection": "h05_partition_probe_tmp",
"insert_without_visibility": "REJECTED: DataNotMatchException: <DataNotMatchException: (code=1, message=Insert missed an field `visibility` to collection without set nullable==true or set default_value)>",
"fail_closed": true,
"tmp_collection_dropped": true,
"verdict": "PASS:写入侧拒绝空分区键(fail-closed)"
}
},
"conclusion": "H-05 五项全部达标:① 分区键(+ 写入侧空值拒绝,行为实测);② 检索分区裁剪(`registered` 档内容访客看不到、客户看得到);③ `over-fetch` 已取消(全仓零命中);④ 双 schema 收敛(`build_schema` 全仓单点,loader 反向 import);⑤ 档位值变更口径已落文。⇒ `H-05` 由「未通过」改判为 **达标**。⚠️ **与 DoD ⑤ 原文的差异(如实登记)**:分区键模式下 Milvus 禁止手工 `create_partition`,所以「档位值变更 = 建分区」的表述不成立 —— 正确口径是「新增档位值直接写入,由 Milvus 自动分布」。"
}