flowchart LR
CHUNK["document_chunk<br/>chunk_id"] --> ANCHOR["evidence_anchor<br/>evidence_anchor_id"]
ANCHOR --> DOC["doc_id / source_uri"]
ANCHOR --> VER["doc_version<br/>source_fingerprint"]
ANCHOR --> LOC["page_no / bbox<br/>section_path"]
ANCHOR --> POL["license_tag<br/>pii_flag / quality_flags"]
Week 7|课时4|Evidence Anchor:让每个 chunk 可以回指原文位置
Citation 的事实来源必须在数据阶段生成
这一讲把 Week7 的证据链收紧:
每个 chunk 至少要有一个 evidence anchor,告诉 Week8 它来自哪个文件、哪个版本、哪一页、哪个 section、哪个 bbox。
这节课解决什么问题
很多系统把 citation 放到生成阶段,让 LLM 根据上下文“拼一个来源”。这会留下两个根本问题:
- 引用可能不是检索结果真实来源
- 出问题时无法回到原始文档定位
Week7 的做法是:
citation 只能消费 evidence anchor;LLM 不允许发明证据。
参考学习时间
45–55 分钟
学完这一讲,你应该能做到什么
- 区分 chunk、section 和 evidence anchor。
- 设计 evidence anchor 的最小字段。
- 解释为什么 anchor 需要
source_fingerprint和doc_version。 - 判断 page/bbox 缺失时应该 fail、warn 还是 not applicable。
本课产出
docs/blueprints/week07/evidence-anchor-contract.mdcontracts/data/evidence_anchor.schema.json
evidence anchor 映射图
1. Anchor 不是装饰字段
Evidence anchor 至少要支撑四类动作:
| 动作 | Anchor 提供什么 |
|---|---|
| citation | 文件、页码、section、bbox |
| bad case replay | 原始对象、版本、指纹、策略版本 |
| quality review | bbox 缺失原因、质量 flags |
| policy filter | license、visibility、PII 状态 |
没有 anchor,Week8 检索出来的 chunk 就只是“像证据的文本”。
2. Anchor contract 最小字段
{
"evidence_anchor_id": "stable_sha256_prefix",
"chunk_id": "document_chunk_id",
"anchor_type": "text",
"doc_id": "workspace_help_center_v1",
"source_uri": "s3://omni-raw-documents/workspace-help/source.pdf",
"raw_object_uri": "s3://omni-raw-documents/workspace-help/source.pdf",
"parsed_object_uri": "s3://omni-parsed/week07/parsed_doc.json",
"doc_version": "v1",
"source_fingerprint": "sha256...",
"page_no": 4,
"bbox": {"x0": 0.13, "y0": 0.22, "x1": 0.84, "y1": 0.31},
"bbox_missing_reason": null,
"section_path": ["Setup", "SSO"],
"license_tag": "internal_training",
"quality_flags": []
}3. 稳定 anchor ID
推荐公式:
evidence_anchor_id = sha256(
chunk_id
+ anchor_type
+ source_fingerprint
+ doc_version
+ page_no
+ bbox
+ section_path
)[:32]
这样能保证:
- 同一 chunk 重跑后 anchor ID 不漂移
- bbox 或 section_path 变化时,anchor ID 能反映事实变化
- Week8 citation 可以稳定引用同一证据对象
4. page / bbox 缺失怎么处理
| 文档类型 | page_no | bbox | Week7 gate |
|---|---|---|---|
| 必须有 | 缺失 warning,并要求 bbox_missing_reason |
page 缺失 hard fail | |
| HTML / Markdown | 可为空 | 可为空 | 需要 section_path 和 source_uri |
| DOCX | 视 parser capability | 视 parser capability | hierarchy 优先,bbox 作为 warning |
| scanned PDF | 取决于 OCR | 取决于 OCR | Student Core 不强制 OCR,报告中标明限制 |
本课最重要判断
Evidence anchor 是 Week8 citation、Week11 eval、Week12 tracing 和 Week14 governance 的根。它必须在数据阶段生成。
自检清单
- 我能说明 citation 为什么不能由 LLM 临时发明。
- 我知道 evidence anchor 最少要保留哪些字段。
- 我知道 PDF、HTML、DOCX 的 page/bbox gate 不一样。
- 我能解释
source_fingerprint对 bad case replay 的作用。
最小行动命令
python -m pipelines.parse_normalize.evidence \
--sections artifacts/week07/sections.json \
--chunks artifacts/week07/chunks.json \
--out artifacts/week07/evidence_anchors.json