[ blog · use-case ]11 min read

Ayinde v Haringey 이후, 인용에 근거한 영국 판례 검색

Sarah Choy2026년 5월 3일 게시11분 분량
Ayinde v Haringey 이후, 인용에 근거한 영국 판례 검색

Ayinde v Haringey는 하룻밤 사이에 영국 법률 AI의 계산을 바꿨다. 한 배리스터가 LLM이 생성한 가짜 판례 다섯 건을 인용했다가 Bar Standards Board에 회부됐다. 이제 환각 인용은 직무 행위상의 결과를 낳는다. 인용에 근거한 영국 판례 검색을 만드는 개발자 가이드 — TNA Find Case Law, legislation.gov.uk, 중립 인용(neutral citation) 파싱, 그리고 이를 동작하는 에이전트로 엮는 법.

한눈에

  • Ayinde v Haringey [2025] EWHC 1383 (Admin)는 환각 판례 인용을 단순 품질 문제가 아니라 직무 행위 문제로 만들었다.
  • BAILII의 약관은 대량 프로그램 접근을 제한한다. 잉글랜드 & 웨일스 판결에 대한 정당한 API는 National Archives의 Find Case Law 서비스다.
  • legislation.gov.uk는 시점 기준(point-in-time) 접근이 가능한 안정적 Developer API를 제공한다 — '2024년 6월 30일에 시행 중'이 실제 쿼리인 컴플라이언스 작업에 필수다.
  • 스탠퍼드 HAI의 'Hallucination-Free?' 연구는 Westlaw와 Lexis+ AI도 여전히 17~33% 확률로 환각함을 보였다 — 인용 근거화는 벤더 선택이 아니라 아키텍처적 해답이다.
  • API Pick UK Legal Search는 판례와 1차 입법에 대한 시맨틱 검색을 단일 POST로 감싼다 — 호출당 60 크레딧.

계산을 바꾼 사건

2025년 6월 6일, 왕좌부(King's Bench Division)의 합의부(Divisional Court)는 단일 판결로 두 건을 선고했다 — Ayinde v The London Borough of HaringeyAl-Haroun v Qatar National Bank QPSC, 중립 인용 [2025] EWHC 1383 (Admin). 두 건 모두에서 변호인이 존재하지 않는 권위를 인용한 자료를 제출했고, Ayinde에서는 날조된 판례가 다섯 건이었다. 법원은 직무상 의무 위반을 인정하고 그 실무가들을 각각 BSB와 SRA에 회부했다.

48시간 안에, 모든 영국 리걸테크 로드맵의 맨 위에 새 항목이 붙었다: 인용 근거화(citation grounding). 품질상의 미덕이 아니라 규제상의 필요로서. 스탠퍼드 HAI의 'Hallucination-Free?' 연구(Magesh et al., 2024년 5월)는 이미 선도 벤더 도구들 — Lexis+ AI, Westlaw AI — 이 벤치마크 쿼리에서 17~33% 확률로 인용을 환각함을 보였다. Ayinde는 그 학술적 발견을 컴플라이언스 문제로 바꿔놓았다.

영국 법률 제품에 AI 기능을 넣는 개발자에게 아키텍처적 교훈은 분명하다: 검색은 권위 있는 출처에서 와야 하고, 인용은 출처까지 검증 가능해야 하며, 시스템은 응답을 근거화할 수 없을 때 답변을 거부해야 한다. 그 외 모든 것은 규제기관에 회부될 일을 예약해 두는 것이다.

이것을 제대로 하는 개발자 가이드를 정리했다: 어떤 API를 쓸지, 그 함정은 무엇인지, 그리고 그것들을 동작하는 에이전트로 어떻게 엮을지.

권위 있는 출처들

1. National Archives Find Case Law

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 Developer API

TNA가 운영한다. 영국 1차 입법(의회 제정법), 위임입법, 그리고 북아일랜드 / 스코틀랜드 / 웨일스 등가물을 다룬다. 결정적으로 시점 기준 쿼리를 지원한다: '이 조항이 2018년 4월 1일에 어떻게 생겼었나'.

강점: 안정적, 문서화 우수, 시점 기준 접근, OGL 라이선스. 약점: 스키마(CLML)가 독자 규격, 모든 개정이 과거까지 일관되게 추적되지는 않음, 시행일(in-force-date) 모델에 의외로 놀랄 수 있음.

3. BAILII (사람 웹을 통한 읽기 전용)

오래된 법률 정보 애그리게이터. Find Case Law가 다루지 않는 관할권과 문서 유형(더 오래된 판결, 스코틀랜드 / NI 자료, 일부 심판소 결정)에 결정적이다. 대량 스크레이핑은 BAILII 약관으로 제한된다. API가 아니라 사람이 읽는 백업으로 취급하라.

영국 판례와 1차 입법에 대한 시맨틱 검색을 단일 POST 엔드포인트로 제공한다. JSON in / JSON out, 호출당 60 크레딧, 성공시에만 과금. 시맨틱 관련도로 랭킹된 제목, 중립 인용, 출처 URL, 스니펫을 반환한다. AI 에이전트 도구 호출용으로 설계됐다.

나란히 비교

작성 시점 기준 출처들. 상업적 배포 전에 TNA와 라이선스 약관을 확인하라.
Find Case Lawlegislation.gov.ukAPI Pick UK Legal Search
커버리지2003년 이후 E&W 판례영국 제정법 + SI, 시점 기준판례 + 입법, 시맨틱
형식Akoma Ntoso XMLCLML XML + JSON / AtomJSON, 스니펫 사전 정형
검색키워드키워드 + 구조적시맨틱
인증공개는 없음; 벌크 피드는 게이트없음x-api-key
라이선스Open Government LicenceOpen Government LicenceAPI Pick TOS
적합컴플라이언스급 단일 진실 출처제정법 조회, 시점 기준 쿼리AI 에이전트 검색, 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 크레딧 (~$0.06)
  • 권위 2~4건을 포괄하는 extract 호출 1회 — 4~8 크레딧 (~$0.004~$0.008)
  • 입력 ~6,000 + 출력 1,500 Claude 토큰 — ~$0.05

대략: 인용이 달린 검색 답변당 ~$0.12. 소규모 사내 법무팀이 하루 100개 질문이면 $12/일 — 어떤 상용 리걸테크 구독료보다도 훨씬 낮고, 감사 추적은 당신이 통제한다.

이것이 일반화되는 지점

'인용 근거화' 아키텍처 패턴은 영국 판례에만 적용되는 것이 아니다 — 투자 실사를 위한 SEC 공시 RAG를 신뢰할 만하게 만들고, 과학 문헌 에이전트가 환각 논문 참조를 피하게 하는 바로 그 패턴이다. 세 규칙이 이들을 하나로 묶는다:

  • 먼저 검색하고, 그다음 생성하라. 검색된 컨텍스트에 없던 인용을 모델이 절대 만들어내게 하지 말라.
  • 결정론적으로 검증하라. 추출된 텍스트에 대한 정규식은 값싸고 대부분의 날조를 잡아낸다.
  • 우아하게 거부하라. 모델이 도움이 되도록 훈련하기 전에 "신뢰할 만하게 답할 수 없다"고 말하도록 시스템 프롬프트를 훈련하라.

Ayinde는 이 규칙들이 '엔지니어링 모범 사례'에서 '사용자를 BSB 앞에 세우지 않고 영국 법률 AI를 출시할 유일한 방법'으로 바뀐 순간이었다. API Pick UK Legal Search는 검색 레이어의 빌딩 블록이고, 나머지는 당신이 엮을 몫이다.

자주 묻는 질문

Ayinde v Haringey에서 실제로 무슨 일이 있었나?

2025년 6월, 고등법원(Ritchie J)은 변호인이 LLM이 생성한 존재하지 않는 판례 다섯 건을 인용한 골자 변론서(skeleton argument)를 제출했고, 별개의 실무가가 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는 1차·2차 입법을 다룬다: 의회 제정법, 위임입법(statutory instruments), 그리고 (컴플라이언스 작업에 결정적으로) 시점 기준 과거 버전. 완전한 영국 법률 RAG 스택에는 둘 다 필요하다.

시점 기준 입법이 왜 AI 에이전트에 중요한가?

대부분의 법률 질문은 특정 날짜에 법이 어땠는가에 관한 것이다 — 위반이 주장된 날, 계약이 서명된 날, 기관이 결정을 내린 시점. 입법의 현재 버전을 반환하면 모든 과거 질문에 틀린 답을 준다. legislation.gov.uk의 /data.feed?type=ukpga&prospective=true 형식 엔드포인트가 이를 해결한다. 날짜를 환각하는 대부분의 AI 법률 도구는 이걸 엮어 넣지 않아서 진다.

이 산출물이 법률 자문에 해당하나?

아니다. 모든 검색 API(우리 것 포함)의 산출물은 정보성 검색이지 법률 자문이 아니다. 잉글랜드 & 웨일스에서 활동하는 솔리시터와 배리스터는 여전히 SRA / BSB 행위 규칙에 구속된다. 이 글이 설명하는 아키텍처는 자격 있는 법률 검토를 대체하는 것이 아니라 — 뒷받침하도록 설계됐다. Ayinde 선례가 그 구분을 타협 불가로 만든다.

이 글에서 사용한 API

Sarah Choy
작성
Sarah Choy
CEO, API Pick

Sarah Choy는 API Pick의 CEO입니다. AI 에이전트와 LLM 워크플로를 위한 프로덕션 등급 API에 대해 씁니다.