Ayinde v Haringey 之後:以引用為依據的英國判例法檢索

Ayinde v Haringey 一夜之間改變了英國法律 AI 的算計。一位大律師援引了五件由 LLM 生成的假判例,結果被轉介至律師標準委員會(Bar Standards Board)。幻覺出來的引用如今帶有職業操守上的後果。本文是打造「以引用為依據的英國判例法檢索」的開發者指南 —— TNA Find Case Law、legislation.gov.uk、中性引註解析,以及如何把它接進一個可用的 Agent。
一句話總結
- •Ayinde v Haringey [2025] EWHC 1383 (Admin) 讓幻覺出來的判例引用從單純的品質問題,變成了一個職業操守問題。
- •BAILII 的條款限制大量程式化存取;國家檔案館(National Archives)的 Find Case Law 服務才是英格蘭與威爾斯判決的合法 API。
- •legislation.gov.uk 提供穩定的 Developer API,支援時間點存取(point-in-time)—— 對於「2024 年 6 月 30 日當時有效的法條」這類真實查詢屬於合規工作所必需。
- •史丹佛 HAI 的「Hallucination-Free?」研究顯示,Westlaw 與 Lexis+ AI 仍有 17–33% 的時候會產生幻覺 —— 引用接地(citation grounding)是架構上的解法,而非廠商選擇。
- •API Pick UK Legal Search 用一次 POST 就把對判例法與主要立法的語意檢索包了起來 —— 每次呼叫 60 credits。
改變了算計的那件案子
2025 年 6 月 6 日,王座分庭的分庭法院(Divisional Court)在一份裁定中一併作成兩項判決 —— Ayinde v The London Borough of Haringey 與 Al-Haroun v Qatar National Bank QPSC,中性引註為 [2025] EWHC 1383 (Admin)。在兩案中,代理律師都提交了援引根本不存在之權威來源的資料;在 Ayinde 案中,是五件捏造的判例。法院認定其違反職業義務,並將兩位執業者分別轉介至 BSB 與 SRA。
48 小時內,每一份英國法律科技的路線圖頂端都多了一個新條目:引用接地(citation grounding)。不是當成品質上的小確幸,而是當成法規上的必要條件。史丹佛 HAI 的「Hallucination-Free?」研究(Magesh 等人,2024 年 5 月)早已顯示,領先的廠商工具 —— Lexis+ AI、Westlaw AI —— 在基準查詢上有 17–33% 的時候會把引用弄成幻覺。Ayinde 把那項學術發現變成了一個合規問題。
對於要把 AI 功能做進英國法律產品的開發者而言,架構上的教訓很清楚:檢索必須來自具權威性的來源、引用必須能回溯驗證到來源、而系統在無法為回應提供依據時必須拒絕回答。其他做法都是一張等著被轉介監管機構的單子。
以下是把這件事做對的開發者實作指南:要用哪些 API、它們各自的陷阱在哪,以及如何把它們接進一個可用的 Agent。
具權威性的來源
1. 國家檔案館 Find Case Law
由國家檔案館(The National Archives, TNA)營運。涵蓋自 2003 年 4 月起,由高等法院、上訴法院、英國最高法院、樞密院及數個裁判所作成的判決。文件採用 Akoma Ntoso(LegalDocML)XML 標準。公開 API 位於 caselaw.nationalarchives.gov.uk;大量資料 feed 則需透過申請、以「計算分析」為目的取得。
優點:英格蘭與威爾斯判例法的權威來源、結構化 XML 保留了判決結構(段落編號、引用、標題)、開放政府授權(Open Government Licence)條款允許在標註出處的前提下再利用。缺點:2003 年之前的覆蓋有限、大量 feed 需要申請、若你從未碰過法律 XML,LegalDocML 解析起來很吃力。
2. legislation.gov.uk Developer API
由 TNA 營運。涵蓋英國主要立法(國會法案)、法定文書,以及北愛爾蘭/蘇格蘭/威爾斯的對應立法。關鍵在於它支援時間點查詢:「2018 年 4 月 1 日當時這項條文長什麼樣」。
優點:穩定、文件完善、支援時間點存取、採 OGL 授權。缺點:其結構描述(CLML)自成一格;並非所有修正都在歷史中被一致追蹤;其「生效日期」模型可能會讓你意外。
3. BAILII(透過人類網頁唯讀)
歷史悠久的法律資訊彙整站。對於 Find Case Law 未涵蓋的司法管轄區與文件類型(較早的判決、蘇格蘭/北愛資料、部分裁判所決定)至關重要。大量爬取受 BAILII 條款限制。 把它當成人類可讀的備援,而非 API。
4. API Pick UK Legal Search
在一個 POST 端點裡,對英國判例法與主要立法做語意搜尋。JSON 進/JSON 出,每次呼叫 60 credits,只對成功扣費。回傳依語意相關性排序的標題、中性引註、來源 URL 與 snippet。專為 AI Agent 的工具呼叫而設計。
並排比較
| Find Case Law | legislation.gov.uk | API Pick UK Legal Search | |
|---|---|---|---|
| 覆蓋範圍 | 2003 年起的英格蘭與威爾斯判例法 | 英國法規 + SI,時間點 | 判例法 + 立法,語意 |
| 格式 | Akoma Ntoso XML | CLML XML + JSON / Atom | JSON,snippet 已預先整理 |
| 搜尋 | 關鍵字 | 關鍵字 + 結構 | 語意 |
| 驗證 | 公開部分免驗證;大量 feed 需申請 | 無 | x-api-key |
| 授權 | 開放政府授權 | 開放政府授權 | API Pick 服務條款 |
| 適用場景 | 合規等級的真實來源 | 法規查詢、時間點查詢 | AI Agent 檢索、RAG 層 |
撐得過 Ayinde 的架構
最小可行的、以引用為依據的架構:
Question → [LLM agent]
↓ tool_use(uk_legal_search)
[API Pick UK Legal Search] → ranked authorities
↓ tool_use(extract_urls)
[API Pick URL Extract] → full judgment / statute body
↓ Agent reads, drafts answer
↓ Citation-required prompt rule
Answer with [Neutral Citation, Section/Paragraph]
↓ Final verification pass
Refuse if citation can't be matched in extracted text驗證環節(verification pass)正是多數團隊失手的地方。光是叫模型「列出你的來源」並不夠 —— 你必須用程式去驗證每一項被引用的權威來源確實出現在擷取到的文字裡。如果沒有,就拒絕回答,或把它浮現出來交由人工審閱。
可用程式碼
import re, requests
from anthropic import Anthropic
KEY = "pk_yourkey"
client = Anthropic()
def fetch_tool(path: str) -> dict:
return requests.get(f"https://www.apipick.com{path}/tool-schema").json()["claude"]
TOOLS = [
fetch_tool("/api/search/uk-legal"),
fetch_tool("/api/extract"),
]
SYSTEM = """You are a UK legal research assistant. You answer questions about
England & Wales case law and UK primary legislation using the tools available.
Rules — non-negotiable:
1. Use uk_legal_search to find authorities relevant to the question.
2. For authorities you intend to cite, use extract_urls to retrieve the
full text. Do not cite anything you have not extracted.
3. Cite every legal proposition with a neutral citation in standard form:
[YYYY] EWHC|EWCA|UKSC NNN (Court), §[paragraph] — for cases.
Section N(M) of the [Act Name] YYYY — for statutes, with point-in-time
noted if relevant.
4. If the search returned no relevant authority, or the relevant text was
not extracted, say so explicitly: "I could not retrieve a sufficient
authority for this question. Please escalate to qualified counsel."
Do not infer from training-data knowledge.
5. Distinguish ratio from obiter where it matters. Note when an authority
is first instance, appellate, or Supreme Court.
6. For legislation, default to the in-force version. State the date you used.
7. This output is informational retrieval, not legal advice."""
def call_tool(b):
paths = {"uk_legal_search": "/api/search/uk-legal", "extract_urls": "/api/extract"}
r = requests.post(
f"https://www.apipick.com{paths[b.name]}",
json=b.input,
headers={"x-api-key": KEY},
timeout=60,
)
return {"type": "tool_result", "tool_use_id": b.id,
"content": r.text, "is_error": r.status_code != 200}
NEUTRAL_CITATION = re.compile(r"\[(\d{4})\]\s+(EWHC|EWCA|UKSC)\s+\d+")
def verify_citations(answer: str, extracted_text: str) -> list[str]:
"""Return list of citations in the answer that don't appear in extracted text."""
cites = NEUTRAL_CITATION.findall(answer)
return [
f"[{year}] {court}" for year, court in cites
if f"[{year}] {court}" not in extracted_text
]
def legal_research(question: str) -> str:
msgs = [{"role": "user", "content": question}]
extracted_buffer = ""
while True:
r = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
system=SYSTEM,
tools=TOOLS,
messages=msgs,
)
msgs.append({"role": "assistant", "content": r.content})
if r.stop_reason == "end_turn":
answer = "\n".join(b.text for b in r.content if b.type == "text")
unverified = verify_citations(answer, extracted_buffer)
if unverified:
return (
"REFUSED: the answer cited authorities that were not retrieved. "
f"Unverified: {unverified}. Escalate to qualified counsel."
)
return answer
if r.stop_reason == "tool_use":
results = []
for b in r.content:
if b.type != "tool_use":
continue
tr = call_tool(b)
if b.name == "extract_urls":
extracted_buffer += tr["content"]
results.append(tr)
msgs.append({"role": "user", "content": results})
print(legal_research(
"What is the test for breach of duty by a public authority "
"post Roberts v Soldiers, Sailors, Airmen and Families Association?"
))這段程式碼做了三件懶散的實作不會做的事:(1) 它在依賴任何被引用的權威來源之前,先透過 extract 抓取其全文;(2) 它會拒絕那些中性引註字串並未實際出現在任何檢索文字中的答案;(3) 它把「我無法檢索到足夠的權威來源」這項拒答內建進系統提示詞,讓模型在檢索失敗時有一個優雅的退場。
成本上限
一次典型的法律研究呼叫:
- 1 次搜尋呼叫 —— 60 credits(約 $0.06)
- 1 次擷取呼叫,涵蓋 2 至 4 項權威來源 —— 4 至 8 credits(約 $0.004 至 $0.008)
- 約 6,000 個輸入 + 1,500 個輸出的 Claude token —— 約 $0.05
取整來說:一個帶引用的研究型答案約 $0.12。對一個小型內部法務團隊而言,每天 100 個問題就是 $12/天 —— 遠低於任何商業法律科技訂閱的費用,而且稽核軌跡掌握在你手上。
這套做法可以推廣到哪裡
「引用接地」這個架構模式不只適用於英國判例法 —— 它正是讓 SEC 申報文件 RAG 在投資盡職調查中可靠、也讓 科學文獻 Agent 避免幻覺出論文引用的同一個模式。三條規則把它們統一起來:
- 先檢索,後生成。 絕不讓模型產出一個不在檢索上下文中的引用。
- 用確定性方式驗證。 對擷取文字跑一個正規表示式既便宜又能抓出大部分的捏造。
- 優雅地拒答。 先訓練系統提示詞說出「我無法可靠地回答」,再去訓練模型樂於助人。
Ayinde 正是這些規則從「工程最佳實務」變成「唯一一種能讓你出貨英國法律 AI、又不會把使用者送到 BSB 面前」做法的那一刻。API Pick UK Legal Search 是搜尋層的構件;其餘的部分,就交給你來串接了。
常見問題
Ayinde v Haringey 一案實際上發生了什麼?
2025 年 6 月,高等法院(Ritchie 法官)認定,代理律師提交了一份骨架論點(skeleton argument),其中援引了五件由 LLM 生成、根本不存在的判例;另在 Al-Haroun v Qatar National Bank 一案中,另一位執業者也捏造了一項權威來源。兩案的判決一併以 Ayinde v Haringey & Al-Haroun v Qatar National Bank [2025] EWHC 1383 (Admin) 作成。法院將兩位執業者分別轉介至律師標準委員會(Bar Standards Board)與律師監管局(Solicitors Regulation Authority)。如今,凡在英國談到『法律實務中的 AI 幻覺』,都會援引這項判決作為標準權威。
我可以爬取 BAILII 嗎?
不行。BAILII 的條款限制大量程式化存取,營運方對此也已明講 —— 參見 Transparency Project 對 BAILII 立場的記載。合法路徑是國家檔案館的 Find Case Law 服務,用於英格蘭與威爾斯的判決,它有公開 API,以及一個需申請才能取得的獨立大量資料 feed。
Find Case Law 與 legislation.gov.uk 有什麼差別?
Find Case Law(caselaw.nationalarchives.gov.uk)涵蓋法院判決 —— EWHC、EWCA、UKSC 與裁判所決定。legislation.gov.uk 涵蓋主要與次要立法:國會法案、法定文書,以及(對合規工作至關重要的)特定時間點的歷史版本。一套完整的英國法律 RAG 架構兩者都需要。
時間點立法(point-in-time)為什麼對 AI Agent 重要?
大多數法律問題問的是某個特定日期當時的法律是什麼 —— 被指控違約的當天、合約簽署的日期、機關作出決定的時間。回傳立法的現行版本,對任何歷史性的問題都會給出錯誤答案。legislation.gov.uk 的 /data.feed?type=ukpga&prospective=true 之類端點解決了這件事。多數會把日期弄錯的 AI 法律工具,敗就敗在沒把這串接進去。
這個產出算不算法律建議?
不算。任何檢索 API(包括我們的)的產出都是資訊性檢索,並非法律建議。在英格蘭與威爾斯執業的事務律師與大律師,仍受 SRA/BSB 的操守規則約束。本文所描述的架構,目的是支援 —— 而非取代 —— 具備資格的法律審閱。Ayinde 這項先例讓這項區分變得不容妥協。
本文使用的 API
Sarah Choy 是 API Pick 的 CEO,專注於為 AI Agent 與 LLM 工作流打造可用於正式環境的 API。