Ayinde v Haringey 之后:以引用为根基的英国判例检索

Ayinde v Haringey 一夜之间改变了英国法律 AI 的算盘。一名出庭律师援引了五个由 LLM 编造的虚假案例,结果被转交至律师标准局(Bar Standards Board)。编造引用如今会带来职业操守层面的后果。本文是构建以引用为根基的英国判例检索的开发者指南——TNA Find Case Law、legislation.gov.uk、中立引注(neutral citation)解析,以及如何把它们接入一个可用的 Agent。
一句话总结
- •Ayinde v Haringey [2025] EWHC 1383 (Admin) 让编造的案例引用从单纯的质量问题,变成了职业操守问题。
- •BAILII 的条款限制批量程序化访问;National Archives 的 Find Case Law 服务才是英格兰与威尔士判决的合法 API。
- •legislation.gov.uk 提供稳定的开发者 API,支持时间点(point-in-time)访问——对于「2024 年 6 月 30 日时有效的法律是什么」这类真实查询而言,这是合规工作的必备能力。
- •斯坦福 HAI 的「Hallucination-Free?」研究表明,Westlaw 与 Lexis+ AI 仍有 17–33% 的概率产生幻觉——以引用为根基是架构层面的答案,而非选哪家厂商的问题。
- •API Pick UK Legal Search 用一次 POST 把对判例法与主要立法的语义检索封装起来——每次调用 60 credits。
改变了算盘的那起案件
2025 年 6 月 6 日,王座法庭分庭(Divisional Court of the King's Bench Division)在一项裁决中一并作出了两份判决——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. National Archives Find Case Law
由英国国家档案馆(The National Archives,TNA)运营。涵盖自 2003 年 4 月以来由高等法院、上诉法院、英国最高法院、枢密院及若干法庭作出的判决。文档采用 Akoma Ntoso(LegalDocML)XML 标准。公共 API 位于 caselaw.nationalarchives.gov.uk;批量数据源则需为「计算分析」目的提交申请获批。
优点:英格兰与威尔士判例法的权威来源,结构化 XML 保留了判决结构(段落编号、引用、标题),开放政府许可(Open Government Licence)条款允许在署名前提下复用。缺点:2003 年以前的覆盖有限,批量源需申请,而如果你从未接触过法律 XML,LegalDocML 解析起来颇为吃力。
2. legislation.gov.uk 开发者 API
由 TNA 运营。涵盖英国主要立法(议会法案)、法定文书,以及北爱尔兰 / 苏格兰 / 威尔士的对应法规。关键在于,它支持时间点查询:「这一条款在 2018 年 4 月 1 日时长什么样」。
优点:稳定、文档完善、支持时间点访问、采用 OGL 许可。缺点:其 schema(CLML)自成一套;并非所有修订都在历史中被统一追踪;其「生效日期」模型可能会让你意外。
3. BAILII(仅供人工网页只读访问)
历史悠久的法律信息聚合站。对于 Find Case Law 不覆盖的司法辖区和文档类型(较早的判决、苏格兰 / 北爱材料、部分法庭裁决)至关重要。BAILII 的条款限制批量爬取。请把它当作人工可读的备份,而非 API。
4. API Pick UK Legal Search
用一个 POST 端点对英国判例法与主要立法做语义检索。JSON 入 / JSON 出,每次调用 60 credits,只对成功计费。返回标题、中立引注、来源 URL,以及按语义相关度排序的片段。专为 AI Agent 的工具调用设计。
逐项对比
| Find Case Law | legislation.gov.uk | API Pick UK Legal Search | |
|---|---|---|---|
| 覆盖范围 | 2003 年起的英格兰与威尔士判例法 | 英国成文法 + 法定文书,支持时间点 | 判例法 + 立法,语义检索 |
| 格式 | Akoma Ntoso XML | CLML XML + JSON / Atom | JSON,片段已预整理 |
| 检索方式 | 关键词 | 关键词 + 结构化 | 语义 |
| 鉴权 | 公共访问无需;批量源需审批 | 无需 | 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校验环节正是大多数团队失手的地方。光让模型「引用你的来源」是不够的——你必须以程序化方式核验:每一个被引用的判例依据,都确实出现在抽取出的文本中。如果没有,就拒绝作答,或将其呈交人工审查。
可用代码
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 项判例依据的 extract 调用——4–8 credits(约 $0.004–$0.008)
- 给 Claude 约 6,000 input + 1,500 output token——约 $0.05
取个整数:一次带引用的研究型答案约 $0.12。对一个小型内部法务团队而言,每天 100 个问题就是 $12/天——远低于任何商业法律科技订阅的成本,而且审计轨迹由你掌控。
这套方法可以推广到哪里
「以引用为根基」这一架构模式并不只适用于英国判例法——正是这同一个模式,让SEC 申报文件 RAG 在投资尽职调查中变得可靠,也让科研文献 Agent 避免编造论文引用。三条规则把它们统一起来:
- 先检索,后生成。绝不让模型产出一个不在检索上下文中的引用。
- 以确定性方式校验。对抽取文本跑一个正则既便宜又能抓住大多数编造。
- 得体地拒绝。先训练系统提示词去说「我无法可靠作答」,再去训练模型乐于助人。
Ayinde 正是这些规则从「工程最佳实践」变成「在不把你的用户推到 BSB 面前的前提下,发布英国法律 AI 的唯一方式」的那个时刻。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 立场的记录。合法途径是 National Archives 的 Find Case Law 服务(用于英格兰与威尔士判决),它提供一个公共 API,以及一个需经申请审批的独立批量数据源。
Find Case Law 与 legislation.gov.uk 有什么区别?
Find Case Law(caselaw.nationalarchives.gov.uk)涵盖法院判决——EWHC、EWCA、UKSC 以及法庭(tribunal)裁决。legislation.gov.uk 涵盖主要与次要立法:议会法案、法定文书(statutory instruments),以及(对合规工作至关重要的)时间点历史版本。一套完整的英国法律 RAG 技术栈两者都需要。
时间点立法对 AI Agent 为何重要?
大多数法律问题问的都是某一具体日期上的法律是什么——涉嫌违规发生之日、合同签署之日、机构作出决定之时。返回立法的当前版本,对任何历史性问题都会给出错误答案。legislation.gov.uk 形如 /data.feed?type=ukpga&prospective=true 的端点解决了这个问题。大多数会把日期搞错的 AI 法律工具,败就败在没把这一点接进来。
这种输出算不算法律意见?
不算。任何检索 API(包括我们的)的输出都属于信息检索,而非法律意见。在英格兰与威尔士执业的事务律师(solicitors)与出庭律师(barristers)仍受 SRA / BSB 行为规范约束。本文所述架构旨在支持而非替代合格的法律审查。Ayinde 这一先例使这一区分不容妥协。
本文涉及的 API
Sarah Choy 是 API Pick 的 CEO,专注于为 AI Agent 与 LLM 工作流构建可用于生产的 API。