# 练习 02：JSON Schema 信息抽取

目标：理解“请输出 JSON”和“结构化输出契约”的区别。

## 任务

从合同或通知文本中抽取字段：

- 文档编号。
- 甲方。
- 乙方。
- 付款期限。
- 金额。
- 生效日期。
- 缺失字段。

## 输入样例

```text
合同编号：A-2026-01。甲方为星河科技有限公司，乙方为云川数据服务中心。
乙方应在每月 5 日前提交发票，甲方在收到合法有效发票后 15 个工作日内付款。
本合同自 2026 年 7 月 1 日起生效。
```

## 输出 schema 草案

```json
{
  "type": "object",
  "additionalProperties": false,
  "required": ["document_id", "party_a", "party_b", "payment_deadline", "amount", "effective_date", "missing_fields"],
  "properties": {
    "document_id": {"type": ["string", "null"]},
    "party_a": {"type": ["string", "null"]},
    "party_b": {"type": ["string", "null"]},
    "payment_deadline": {"type": ["string", "null"]},
    "amount": {"type": ["string", "null"]},
    "effective_date": {"type": ["string", "null"]},
    "missing_fields": {
      "type": "array",
      "items": {"type": "string"}
    }
  }
}
```

## Prompt 要求

```text
请只基于输入文本抽取字段。
原文没有的信息填 null，并把字段名加入 missing_fields。
不要解释，不要添加 schema 之外的字段。
```

## 测试点

- 金额缺失时是否填 null。
- 日期是否按原文抽取。
- 付款期限是否完整。
- 是否新增 schema 外字段。
- JSON 是否可解析。

## 复盘

如果失败，先判断该改哪里：

- 字段语义不清：改 schema 字段名或说明。
- 输出格式错误：加强结构化输出或解析校验。
- 抽错信息：补充 prompt 中的抽取规则。
- 缺失不处理：明确 null 和 missing_fields。
