# 香港判決書結構化抽取 — 統一 Prompt

> 用途：把以下 prompt 連同判決書全文一次性交給一個能力足夠強的 LLM，
> 讓它一次性輸出所有 8 個字段，避免分 5 次調用。
>
> 適用語言：中文 / 英文 / 中英混合判決書。
>
> 重要約束：
> - 整份判決書可能很長，建議**先按下方"預處理"規則生成規則字段**，
>   然後**按"上下文切片"規則**裁出 LLM 要看的上下文，
>   最後把規則字段結果 + 切片文本 + 本 prompt 一起交給 LLM。
> - 若 LLM 上下文窗口足夠（≥128K），也可直接給全文，但仍建議在 prompt 中
>   強調字段抽取優先位置以提高準確率。

---

## 一、預處理（規則層，不需要 LLM）

### 1. 語言檢測
- 統計前 3000 字符的中文字符比例
- 中文比例 > 30% → `lang = "zh"`，否則 → `lang = "en"`

### 2. 案號前綴 → 法院代碼映射（最高優先級）

| 前綴 | 法院代碼 | 中文名稱 | 英文名稱 |
|---|---|---|---|
| FACV / FACC / FAMV / FAMC | HKCFA | 香港特別行政區終審法院 | Court of Final Appeal of the Hong Kong SAR |
| CACV / CACC / CAAG | HKCA | 香港特別行政區高等法院上訴法庭 | Court of Appeal of the High Court of the Hong Kong SAR |
| HCA / HCAL / HCMP / HCCW / HCB | HKCFI | 香港特別行政區高等法院原訟法庭 | Court of First Instance of the High Court of the Hong Kong SAR |
| DCCJ / DCMP | HKDC | 香港特別行政區區域法院 | District Court of the Hong Kong SAR |
| WKCC | HKMagC | 香港特別行政區裁判法院 | Magistrates' Courts of the Hong Kong SAR |
| SCTC | HKSCT | 香港特別行政區小額錢債審裁處 | Small Claims Tribunal of the Hong Kong SAR |
| LBTC / LDPD | HKLAT | 香港特別行政區勞資審裁處 | Labour Tribunal of the Hong Kong SAR |
| LDBM | HKLDT | 香港特別行政區土地審裁處 | Lands Tribunal of the Hong Kong SAR |
| CCDI | HKCrC | 香港特別行政區死因裁判法庭 | Coroner's Court of the Hong Kong SAR |

正則：`(FACV|FACC|FAMV|FAMC|CACV|CACC|CAAG|HCA|HCAL|HCMP|HCCW|HCB|DCCJ|DCMP|SCTC|LBTC|LDPD|LDBM|CCDI|WKCC)\s*(?:NO\.?)?\s*\d+\s*(?:OF|/|\sof\s)\s*\d{4}`

### 3. 補充定位
- 若案號前綴未能確定法院，嘗試匹配 Neutral Citation：`[YYYY] HKXXX NNNN`
- 若仍失敗，在前 2000 字符中搜索法院全稱或簡稱

### 4. 案件地點
- 默認：`["香港特別行政區"]`（中文）/ `["Hong Kong Special Administrative Region"]`（英文）
- 過濾黑名單：法院、法庭、審裁處、公園、大廈、大樓、商場、街、道路、村、中心、醫院、酒店、車站
- 若清理後不含"香港特別行政區"，自動補上

---

## 二、上下文切片（給 LLM 用）

| 字段組 | 切片策略 | 建議長度 |
|---|---|---|
| 當事人 | 文本開頭（前 N 字符） | 5000 |
| 事由+標的 | 文本開頭（前 N 字符） | 5000 |
| 判決結果 | 開頭 + 尾部拼接 | 5000 + 5000 |
| 涉及實體 | 當事人段 + 引用關鍵詞召回拼接 | ≤6500 |
| 判決總結 | 用已抽取的字段 + 分析關鍵詞召回段（500 半徑窗口） | 分析段 ≤3500 |

若直接給全文，跳過切片即可。

---

## 三、統一抽取 Prompt

```text
你是香港法律文書結構化信息抽取助手。請從以下判決書中抽取所有 8 個字段，
**嚴格按 JSON Schema 輸出**，不添加任何解釋。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字段抽取規則
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【字段 1】plaintiff（原告/申索人/上訴人/申請人）
- 從判決書開頭的 BETWEEN ... AND ... 結構或「申請人/答辯人」結構中抽取
- 包含所有原告/共同原告；保留中英文對照（如「陳大文 (CHAN TAI MAN)」）
- 輸出：JSON 字符串數組；無則空數組

【字段 2】defendant（被告/答辯人/被上訴人/回應人）
- 同上但屬於被動方
- 輸出：JSON 字符串數組；無則空數組

【字段 3】case_reason（事由）
- 嚴格 ≤100 字（中文）/ ≤200 字符（英文），單句
- 結構：[原告身份] + [針對什麼事件/行為] + [向誰] + [提出什麼請求]
- 覆核/上訴案件須註明對哪個裁決提出覆核（含日期/案號）
- 嚴禁包含：判決結果詞彙（駁回/拒絕/勝訴/敗訴/維持/撤銷/發還/判給/獲判/判處/部分勝訴）
- 只描述訴訟的起因和請求，不涉及法庭的判斷

【字段 4】case_object（訴訟標的）
- 訴訟請求指向的實體權利或利益
- 例：汽車、黃金、珠寶、不動產產權、撫養權、人身傷害賠償、合同履行、房產所有權、精神困擾賠償、居留權
- 涉及金錢標的時**必須**提取並標明幣種與具體金額
  （如「拖欠貨款 HK$850,000」「索償 HK$1,000,000」）；
  金額未定者註明「金額待評定」
- 合併本質相同的標的
- 嚴禁：證據材料、程序性訴求（如"要求法庭裁決"）、法律條文名稱

【字段 5】judgment_result（判決結果，數組，每項含 charge + result）
- 從判決書尾部 ORDER / JUDGMENT / 裁定 / 命令 部分抽取
- 多項請求 → 分條
- "責任判定" 與 "損失/金額計算" 兩個層面 → 必須分條
- **每條 charge 必須以 "(責任問題)" 或 "(損失範圍)" 結尾**（英文為 "(liability issue)" / "(quantum issue)"）
- result 必須包含：
  a) 明確結果（勝訴/敗訴/部分勝訴/維持/撤銷/駁回/發還等）
  b) 2-3 個關鍵法庭理由
  c) 具體金額、利率或命令內容；凡有判給/命令支付的金錢數額，
     **必須原文照錄幣種與金額**（如 HK$28,500），不得省略或約化

【字段 6】judgment_summary（判決總結，單段）
- **使用與判決書相同的主要語言**（中文判決用中文，英文判決用英文）
- 中文 ≤300 字，英文 ≤500 字符
- 四要素結構（必須全部涵蓋，連貫成單段）：
  (1) 案件背景：1-2 句交代起因與當事人關係
  (2) 核心爭議焦點
  (3) 法庭法律分析與推理（核心重點）：
      - 如何評估證據？
      - 接受 / 拒絕主張的邏輯？
      - 引用了哪些關鍵法律或判例？
  (4) 最終裁決結果及命令
- 涉及金錢的判給或標的，須保留具體金額（含幣種）
- 一律使用規範的法律專業用語（避免口語化）

【字段 7】involved_entities（涉及實體，數組，每項含 entity_name + reason）
- 必須包含：
  * 主審法官/審裁官/裁判官（通常在判決書開頭或結尾署名）
  * 雙方代表律師、大律師（通常在判決書結尾的 Representation 部分）
  * 判決中引用的先例所提及的法官
    → reason 須寫明：在 XX 案[案號]中擔任 XX 職位，闡述 XX 法律原則
  * 涉案的政府部門、公司、機構（如：入境事務處處長、律政司司長）
- 嚴禁包含：
  * 法案/條例名（如《侵權條例》、Cap.xxx、《基本法》）
  * 純案例名稱（如 Donoghue v Stevenson）— 注意：含 " v " / " v. " / " 訴 " 的視為案例名
  * 文獻、期刊名
- reason 一律使用規範的法律專業用語

【字段 8】保留作記錄的源字段（由規則層處理，不由 LLM 抽取）：
  jurisdiction_code、jurisdiction_name、case_location、case_number
  → 直接由預處理規則給出，作為 LLM 輸出 JSON 的頂層字段保留

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
語言規則
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

根據判決書主要語言：
- 中文判決：所有用戶撰寫的字段文本（case_reason、judgment_summary、reason）使用中文
- 英文判決：所有用戶撰寫的字段文本使用英文
- 中英混合：保留原文中的雙語對照（如「陳大文 (CHAN TAI MAN)」）

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
輸出 JSON Schema
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

{
  "plaintiff": ["string"],
  "defendant": ["string"],
  "case_reason": "string",          // 中文 ≤100 字 / 英文 ≤200 字符
  "case_object": ["string"],         // 標的物數組，含金錢時必含金額
  "judgment_result": [
    {
      "charge": "string",            // 必須以 "(責任問題)" 或 "(損失範圍)" 結尾
      "result": "string"             // 含明確結果 + 理由 + 具體金額
    }
  ],
  "judgment_summary": "string",      // 中文 ≤300 字 / 英文 ≤500 字符
  "involved_entities": [
    {
      "entity_name": "string",       // 不可為條例/案例名
      "reason": "string"             // 用規範法律術語
    }
  ]
}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Few-shot 示例（中文判決）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

輸入判決書要點：
- 案號：HCPI 1234/2022
- 開頭：BETWEEN 張三 (CHEUNG SAN) 申索人 AND 李四 答辯人
- 案情：申索人為保安員，聲稱2023年7月被被告毆打致傷
- 標的：人身傷害、醫療費 HK$12,000
- 尾部：判給醫療費 HK$8,500 及一般損害賠償 HK$20,000，連同利息

正確輸出：
{
  "plaintiff": ["張三 (CHEUNG SAN)"],
  "defendant": ["李四"],
  "case_reason": "申索人為商場保安員，就被告於2023年7月在商場毆打申索人造成的人身傷害，向被告提出損害賠償申索。",
  "case_object": ["人身傷害賠償", "醫療費用 HK$12,000", "精神困擾賠償"],
  "judgment_result": [
    {
      "charge": "申索人就毆打事件的人身傷害索償 (責任問題)",
      "result": "勝訴。法庭接納申索人證供可信，閉路電視顯示被告先動手，被告亦承認部分情節。"
    },
    {
      "charge": "醫療費及精神困擾賠償金額 (損失範圍)",
      "result": "部分勝訴。判給醫療費 HK$8,500 及一般損害賠償 HK$20,000，合共 HK$28,500，連同利息及訟費。"
    }
  ],
  "judgment_summary": "張三擔任商場保安，2023年7月在工作期間被李四毆打致傷，訴請人身傷害賠償。爭議焦點在於毆打事實及賠償金額。法庭審閱閉路電視及雙方證供後，接納申索人證供並認定被告須承擔責任。醫療費部分判給 HK$8,500，一般損害賠償 HK$20,000，合共 HK$28,500，連同利息及訟費。",
  "involved_entities": [
    {
      "entity_name": "王大明法官",
      "reason": "本案主審法官，負責認定事實及裁決。"
    },
    {
      "entity_name": "陳志偉大律師",
      "reason": "代表申索人出庭。"
    }
  ]
}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Few-shot 示例（英文判決）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Input key points:
- Case no: HCA 567/2023
- Header: BETWEEN Dr Paul KI Ping-ki (1st Plaintiff) AND Next Magazine Publishing Ltd (1st Defendant)
- Facts: Plaintiff alleges defamation by article published 15 March 2023
- Quantum: damages of HK$3,000,000 claimed
- Disposition: Assessment of damages ordered

Correct output:
{
  "plaintiff": ["Dr Paul KI Ping-ki"],
  "defendant": ["Next Magazine Publishing Ltd"],
  "case_reason": "Plaintiff claims against defendant for damages for defamation arising from an article published on 15 March 2023.",
  "case_object": ["damages for defamation HK$3,000,000", "injunctive relief"],
  "judgment_result": [
    {
      "charge": "Plaintiff's defamation claim (liability issue)",
      "result": "Allowed. Court found the article was defamatory, identified the plaintiff, and was not justified."
    },
    {
      "charge": "Damages quantum (quantum issue)",
      "result": "Remitted. Liability established; quantum to be assessed."
    }
  ],
  "judgment_summary": "Dr Paul KI, sued Next Magazine Publishing Ltd for defamation over a 15 March 2023 article. The court considered whether the article was defamatory and identified the plaintiff. Applying the defence tests, the court found for the plaintiff on liability. Quantum of damages was remitted for assessment. Costs were reserved.",
  "involved_entities": [
    {
      "entity_name": "Hon Leong JA",
      "reason": "Presiding judge in this case, responsible for fact-finding and adjudication."
    },
    {
      "entity_name": "Chief Justice Li",
      "reason": "Served as lead judge in Tang Kwok Wah v HKSAR [2019] HKCFA 23, articulated burden of proof principles, cited in paragraph 34 of this judgment."
    }
  ]
}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
自校驗（輸出前請自檢）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

□ case_reason 字數未超限
□ case_object 非空，且若原文出現金錢數額則至少一項含金額
□ judgment_result 每條 charge 都以 "(責任問題)" / "(損失範圍)" 結尾
□ judgment_summary 語言與判決書主要語言一致，且 80 ≤ 長度 ≤ 上限
□ involved_entities 非空（至少含主審法官）；不含條例名、案例名、文獻名

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
判決書文本（開始）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

{在這裡粘貼判決書全文或上下文切片}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
判決書文本（結束）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

請只輸出符合 Schema 的 JSON，不要任何解釋。
```

---

## 四、給程序員的合併策略

如果目標 LLM 能力足夠強（GPT-4 / Claude-3.5+ / Qwen2.5-32B+），可以直接：

```python
import json
from openai import OpenAI

client = OpenAI()

# 1. 規則層（無 LLM）
meta = {
    "jurisdiction_code": "...",     # 由案號前綴確定
    "jurisdiction_name": "...",     # 查表
    "case_location": ["香港特別行政區"],
    "case_number": "HCPI 1234/2022",
}

# 2. 上下文切片（按上面的策略）
context = text[:5000] + "\n\n[…]\n\n" + text[-5000:]  # 簡化版

# 3. 一次 LLM 調用
response = client.chat.completions.create(
    model="gpt-4o",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "你是香港法律文書結構化信息抽取助手。請嚴格按 JSON Schema 輸出。"},
        {"role": "user", "content": PROMPT_TEMPLATE.format(context=context)}
    ]
)
llm_result = json.loads(response.choices[0].message.content)

# 4. 合併
final = {**meta, **llm_result}
```

與原 5 次調用相比：
- ✅ Token 開銷更低（沒有重複 system prompt）
- ✅ 字段間一致性好（同一模型同一次推理）
- ❌ 對小模型（7B）效果可能下降，建議仍用 5 次分調
