법률 전문가를 고용할 여력이 없는 사람을 위해 만들려고 할 때 무슨 일이 벌어질까?
요약
파키스탄의 법률 접근성 문제를 해결하기 위해 RAG(검색 증강 생성) 기술을 활용한 AI 서비스 'HAQ' 개발 사례를 소개합니다. LLM의 환각 현상을 방지하기 위해 실제 법령 데이터를 기반으로 답변하도록 설계된 엔지니어링 접근법을 다룹니다.
핵심 포인트
- 법률 분야에서 LLM의 환각은 사용자에게 실질적 위험을 초래함
- RAG를 통해 모델이 검색된 법령 구절 내에서만 답변하도록 제한
- 출처를 직접 연결하여 답변의 신뢰성과 투명성 확보
- 파키스탄 법률 데이터의 품질 및 접근성 문제 해결이 핵심 과제
나를 떠나지 않던 문제점
파키스탄은 2억 2천만 명의 인구를 가지고 있습니다. 기능하는 법률 시스템이 존재합니다. 수백 개의 법령(Acts), 조례(ordinances), 그리고 헌법적 규정들이 기술적으로 모든 시민을 보호하고 있습니다.
하지만 아무도 그것들을 사용할 수 없습니다.
카라치에서 중위 변호사 상담 비용은 많은 가정이 일주일 동안 버는 돈보다 많습니다. 법률 지원은 인력이 부족하고 주요 도시에 지리적으로 집중되어 있습니다. 그리고 그 법들 자체는요? 영어로 작성되어 있는데, 이는 대다수 인구가 기능적으로 읽을 수 있는 언어일 뿐이며 집에서 사용하는 언어는 아닙니다.
그래서 집주인이 누군가를 불법적으로 퇴거시킬 때. 공장 노동자가 퇴직금 없이 해고될 때. 여성이 자신의 상속권을 알고 싶을 때. 세입자가 '임대료 제한 조례 제16조(Section 16 of the Rent Restriction Ordinance)'가 자신들의 특정 상황에 실제로 무엇을 의미하는지 이해해야 할 때 — 그들은 자신이 감당할 수 없는 변호사를 찾거나, 제대로 알지 못하는 사람에게 물어보거나, 아니면 조용히 포기합니다.
이것은 지식의 문제가 아닙니다. 접근성의 문제입니다.
저는 신드 지역 내륙에 있는 Sukkur IBA University의 CS 학생입니다. 카라치도 아니고 이슬라마바드도 아닌 곳이죠. 법이 무엇이라고 말하는 것과 사람들이 실제로 그것을 알고 있다는 것 사이의 격차를 매일 느끼는 종류의 도시입니다. 그 간극에서 HAQ가 시작되었습니다.
HAQ는 아랍어와 우르두어로 '권리(right)'를 의미합니다. 즉, 당신에게 마땅히 속한 것을 뜻하죠.
이 이름은 중요하게 느껴졌습니다.
핵심 아이디어: 법에 물어보고, 법을 얻다
AI와 법률 질문 사이에는 제가 내린 모든 디자인 결정의 원동력이 된 특정한 실패 모드가 있습니다. 그리고 이것을 명확히 언급할 가치가 있습니다.
표준 LLM(Standard LLMs) — 어떤 것이든 — 은 법률 질문에 자신 있게 답할 것입니다. 그들은
접근성 도구(accessibility tool)의 관점에서 볼 때, 자신감 있게 내놓는 틀린 답변은 중립적이지 않습니다. 그것은 적극적으로 위험합니다. 누군가는 AI가 의구심을 품지 않게 만드는 어조로 답변했다는 이유만으로, 집주인에게 이의를 제기하지 않거나, 잘못된 청원서를 제출하거나, 중요한 마감 기한을 놓칠 수도 있습니다.
HAQ의 이면에 담긴 통찰은 다음과 같습니다: 모델이 당신이 직접 검색(retrieved)한 문서로 뒷받침할 수 없는 법적 주장(legal claims)을 하지 못하게 하라.
기술적인 명칭은 RAG — 검색 증강 생성 (Retrieval-Augmented Generation) — 입니다. 핵심 아이디어는 이렇습니다: 모델이 말을 하기 전에, 실제 파키스탄 법령에서 관련 구절을 찾아냅니다. 그 구절들을 모델에게 제공합니다. 그리고 모델에게 주어진 정보만을 사용하여 답변할 수 있다고 지시합니다. 출처를 직접 연결합니다.
관련 구절을 찾을 수 없다면? 그렇다고 말하십시오. 환각 (hallucinate)을 일으키지 마십시오.
이것이 시스템의 전부입니다. 그 외의 모든 것은 이를 대규모로, 우르두어(Urdu)로, 특히 파키스탄 법률에 맞춰 작동하게 만들기 위한 엔지니어링입니다.
1단계: 아무도 말하지 않는 데이터 문제
파키스탄 법률을 기반으로 AI를 구축하려면, 우선 파키스탄 법률 데이터가 있어야 합니다.
당연한 소리처럼 들리겠지만, 결코 간단하지 않았습니다.
파키스탄의 법률 문서들은 품질이 제각각인 정부 포털들에 흩어져 있습니다. 때로는 스캔된 PDF 형태로, 때로는 인코딩이 깨진 HTML 표 형태로, 때로는 기계 판독 가능한(machine-readable) 형태로 공개조차 되어 있지 않은 경우도 있습니다. 연방 입법 목록(Federal Legislative List), 주 법령(provincial Acts), 조례(ordinances) 등은 각각 서로 다른 소스에서 오며, 서로 다른 서식 규약과 디지털화 수준을 가지고 있습니다.
결국 저는 100개 이상의 법령(Acts)을 확보했습니다. 파이프라인은 다음과 같았습니다: 다운로드, 텍스트 추출, 정제, 그리고 임베딩 모델(embedding model)이 의미 있게 인덱싱할 수 있는 조각으로 청킹(chunking)하기.
청킹 전략은 생각보다 훨씬 중요합니다. 너무 거칠게 나누면 하나의 청크에 법령 전체가 포함되어 검색(retrieval)이 복권 추첨처럼 운에 맡겨지게 됩니다. 너무 잘게 나누면 조항이 문맥에서 떨어져 나가 모델이 의미 없는 단어들만 검색하게 됩니다. 저는 섹션 단위 청킹(section-level chunking)으로 결정했습니다: 각 청크는 하나의 법령 내의 한 섹션이며, 여기에 메타데이터(법령 이름, 섹션 번호, 관할권, 출처 URL)를 추가합니다.
4,000개 이상의 청크 (chunks). 모든 청크마다 원본 법령 문서로 돌아가는 소스 링크를 포함합니다.
임베딩의 악몽: 10시간에서 8분으로
처음 전체 임베딩 파이프라인 (embedding pipeline)을 실행했을 때, 10시간 23분이 걸렸습니다.
이것은 머신러닝 (ML) 프로젝트에서 아무도 트위터에 올리지 않는 부분입니다. 코드를 작성하고, 올바르게 보이면, 실행시킨 뒤 잠자리에 듭니다. 깨어날 때까지 여전히 실행 중일 것이기 때문입니다.
문제는 순차적인 API 호출 (sequential API calls)이었습니다. 각 청크에 대해 파이프라인은 다음과 같이 동작했습니다:
- 청크 텍스트를 Cohere의 임베딩 (embedding) API로 전송
- 응답을 기다림
- Pinecone에 벡터 (vector)를 저장
- 다음 청크로 이동
각 왕복 (round trip)에는 약 200ms가 소요됩니다. 4,000개의 청크 × 200ms = 네트워크 변동성, 속도 제한 (rate limiting), Pinecone 쓰기 지연 시간 (write latency)을 고려하기 전에도 순수 API 대기 시간만 약 800초입니다. 실제로는 10시간 이상이 걸렸습니다.
지나고 보니 해결책은 부끄러울 정도로 명백했습니다:
# 이전: 순차적, 한 번에 하나의 청크씩
for chunk in chunks:
embedding = cohere.embed(chunk.text)
...
새로운 실행 시간: 7분 43초.
동일한 4,000개 이상의 청크. 동일한 벡터. 동일한 출력. 처음부터 존재했던 배치 (batch) 인터페이스를 준수하는 것만으로 87배 빨라졌습니다.
만약 임베딩 파이프라인을 사용하여 무언가를 구축하고 있다면, 첫날부터 배치를 사용하세요. 순차적 처리 (sequential processing)는 단 5개의 청크로 구성된 데모에서만 허용될 수 있습니다.
특히, 환각 (Hallucination) 문제
RAG (검색 증강 생성)는 환각을 줄여줍니다. 하지만 제거하지는 못합니다.
언어 모델 (Language models)은 도움이 되도록 훈련됩니다. 이는
당신은 파키스탄의 법률 보조 AI인 HAQ입니다.
당신이 어길 수 없는 규칙:
...
규칙 2번을 완성하는 것이 가장 어려웠습니다. 모델들은 자신이 모른다는 사실을 인정하기를 거부합니다. 따라서 거절하는 행위가 오작동처럼 느껴지는 것이 아니라, 정당하고 잘 구성된 응답처럼 느껴지도록 만들어야 합니다. _"사용 가능한 법령에서 명확한 답변을 찾을 수 없습니다(I couldn't find a clear answer in the available legislation)"_라는 문구는 모델이 우회하려 하지 않으면서도 제가 원하는 동작을 일관되게 생성할 때까지 아마 30가지 이상의 변형을 거쳐 테스트되었습니다.
인용 레이어(citation layer)가 루프를 완성합니다. 검색된 모든 청크(chunk)에는 소스 URL이 포함됩니다. HAQ가 [Rent Restriction Ordinance 2001, Section 8]을 인용하면, UI는 이를 실제 정부 문서로 연결되는 라이브 링크로 렌더링합니다. 사용자는 이를 검증할 수 있습니다. 모델은 모호한 권위에 숨을 수 없습니다.
Temperature(온도): 0.1. 신중하게 설정했습니다. 법률 답변은 창의적이기보다 지루할 정도로 정확해야 합니다.
폴백 체인 (The Fallback Chain): 네 개의 모델, 하나의 쿼리
HAQ는 추론(inference) 속도 때문에 특히 Groq에서 추론을 실행합니다. 퇴거 통지나 부당 해고로 인해 진정으로 고통받고 있는 사람에게 AI의 응답을 15초 동안 기다리게 하는 것은 사용자 경험(UX)의 실패입니다.
하지만 Groq의 무료 티어에는 속도 제한(rate limits)이 있습니다. 모델에는 컨텍스트 창(context window) 제한이 있습니다. 때로는 특정 모델을 사용할 수 없을 때도 있습니다. 그래서 저는 폴백 체인(fallback chain)을 구축했습니다:
MODELS = [
"llama-3.3-70b-versatile", # 기본 모델: 최상의 추론 품질
"llama-3.1-70b-versatile", # 폴백 1
...
네 개의 모델. 하나의 쿼리. 사용자는 속도 제한 오류를 절대 보지 못하며, 그저 답변을 받게 됩니다.
이중 언어 문제는 생각보다 더 어렵습니다
우르두어-영어 코드 스위칭(code-switching)은 교육받은 파키스탄인들의 자연스러운 언어 양식입니다. 법률적인 맥락에서 순수 우르두어만 사용하는 사람은 아무도 없습니다. 아무도 실제로 사용하지 않는 순수 우르두어 표현을 쓰기보다는, "میرے landlord نے mujhe غیر قانونی طور پر lock out کر دیا" (내 집주인이 나를 불법적으로 쫓아냈다/lock out 시켰다)라고 말할 것입니다.
LLM(대규모 언어 모델)은 영어보다 우르두어(Urdu)를 더 못 다룹니다. 로마자 표기 우르두어(Latin 문자로 음차된 우르두어)는 훨씬 더 일관성 없게 처리합니다. 또한, 사용하는 모델이 무엇인지, 혹은 달의 위상이 적절한지에 따라 예측 불가능한 품질 수준으로 우르두어-영어 코드 스위칭(Code-switched, 언어 교차 사용)을 처리합니다.
저의 해결책은 이 문제와 싸우는 것을 멈추는 것이었습니다. HAQ는 어떤 언어와 문자의 혼합 형태라도 입력을 수용합니다. 쿼리 전처리(Query preprocessing) 단계에서 지배적인 언어와 문자를 감지합니다. 검색(Retrieval)은 항상 영어로 작성된 법률을 대상으로 실행됩니다(파키스탄 법률이 그렇게 작성되어 있기 때문입니다). 응답은 사용자가 작성한 언어 그대로 생성됩니다.
UI는 우르두어 문자를 위해 RTL(Right-to-Left, 우측에서 좌측 방향) 텍스트를 렌더링합니다. 누군가가 절반은 우르두어 문자로, 절반은 영어로 쓸 때처럼 한 단락 내에서 RTL과 LTR(Left-to-Right, 좌측에서 우측 방향)을 혼합하는 문제는 제가 이틀 동안 매달린 CSS 문제입니다. 유니코드 양방향 알고리즘(Unicode bidirectional algorithm), dir="auto"를 거쳐, 결국 문서 수준이 아닌 단락 수준에서 방향성을 설정하는 단락별 언어 감지 함수를 구현하게 되었습니다.
여전히 완벽하지는 않습니다. 우르두어 중간에 영어 고유 명사가 포함된 코드 스위칭 문장이 가장 까다로운 사례입니다. 하지만 사용자가 유심히 살펴보지 않는 한 눈치채지 못할 정도로 충분히 괜찮은 수준입니다.
위치, 위치, 관할권
파키스탄에는 4개의 주, 연방 관리 영토, 그리고 수도 영토가 있으며, 각 영역마다 서로 다른 법적 관할권(Jurisdiction)을 가집니다. 임대차법(Tenancy law)은 주(Provincial) 단위입니다. 노동법(Labor law)은 일부는 연방, 일부는 주 단위입니다(제18차 개헌 이후). 가족법(Family law)은 완전히 자체적인 법원 시스템을 가지고 있습니다.
라호르(Lahore)의 임대료 분쟁에 대한 답변이 카라치(Karachi)에서는 완전히 틀릴 수 있습니다. 그리고 여기서 틀린 답변은 답변이 없는 것보다 더 나쁩니다.
HAQ는 첫 실행 시 도시를 묻고 이를 관할권에 매핑합니다. Pinecone 쿼리는 의미론적 유사성(Semantic similarity)에 따라 순위를 매기기 전에 관할권 메타데이터로 필터링을 수행합니다:
def build_filter(jurisdiction: str) -> dict:
return {
"$or": [
...
연방법과 사용자의 주(provincial) 법률. 의미론적으로 순위가 매겨진 5개의 결과. 이것이 모델이 작업할 수 있는 데이터입니다.
이것은 작은 기능처럼 들릴 수 있습니다. 하지만 이슬라마바드 이외의 지역에 있는 누구에게나 정확도를 극적으로 변화시킵니다.
음성, OCR, 그리고 법률 서신
제가 실제로 구축하고 있는 사용자들에게는 위의 어떤 머신러닝 (ML) 결정보다 더 중요하지만, AI 기능처럼 들리지 않는 세 가지 기능이 있습니다.
음성 입력 + TTS (Text-to-Speech): 만약 당신의 법률 질문이 "میرا کرایہ ختم ہو رہا ہے اور مالک مکان کیا کر سکتا ہے" (내 임대 계약이 끝나가는데 집주인이 무엇을 할 수 있나요?)이고, 휴대폰으로 타이핑하는 것이 불편하거나 — 또는 문해력이 완전히 갖춰지지 않았다면 — 당신은 그것을 말할 수 있어야 합니다. Whisper가 전사 (transcription)를 처리하고, pyttsx3가 응답 재생을 처리합니다. 전체 파이프라인은 음성 입력(voice-in), 음성 출력(voice-out) 방식으로 작동합니다.
문서 OCR (Optical Character Recognition): 누군가가 법적 통지서를 받았습니다. 그것은 물리적인 종이 조각이거나 휴대폰에 있는 사진입니다. HAQ는 이미지를 수락하고, 우르두어 언어 팩과 함께 Tesseract OCR을 실행하여 텍스트를 추출한 뒤, 이를 쿼리 컨텍스트 (query context)에 추가합니다. 그 시점에서 "이것이 무엇을 의미하나요? 제 권리는 무엇인가요?"는 완전한 HAQ 쿼리가 됩니다.
법률 서신 생성: 만약 답변이 "네, 당신은 이것에 이의를 제기할 근거가 있습니다"라면 — 사용자가 다음에 필요로 하는 것은 공식 서신입니다. HAQ는 관련 조항을 인용하여 적절한 파키스탄 법률 형식에 맞춘 서신을 다운로드 가능한 PDF 또는 DOCX 형식으로 생성합니다. 변호사가 이를 검토하는 것을 대체할 수는 없습니다. 하지만 올바른 형식과 올바른 인용을 갖추고 시작할 수 있는 구체적인 무언가가 됩니다.
이 중 기술적으로 정교한 것은 하나도 없습니다. 하지만 이 모든 것들이 데모와 누군가가 실제로 사용하는 도구 사이의 차이를 만듭니다.
HAQ의 실제 정체
이것이 무엇을 하고 무엇을 하지 않는지에 대해 정확히 말씀드리겠습니다.
HAQ가 하는 것: 누군가가 자신의 상황에 대해 파키스탄 법률이 무엇이라고 말하는지, 검증 가능한 인용과 함께, 우르두어 또는 영어로, 자신의 휴대폰에서, 무료로 이해할 수 있도록 돕는 것입니다.
HAQ는 변호사를 대체하지 않습니다. 법을 해석하는 것이 아니라, 법을 검색(retrieve)하는 것입니다. 전략에 대해 조언하지 않으며, 법원의 판결 결과를 예측하지도 않습니다. 모든 응답에는 복잡한 사안에 대해 자격을 갖춘 법률 전문가(legal counsel)를 찾도록 안내하는 명확한 면책 조항(disclaimer)이 포함되어 있습니다.
목표는 결코 법률 시스템을 대체하는 것이 아니었습니다. 그것은 사람들과, 이미 그들을 위해 존재하고 있는 시스템 사이의 정보 격차(information gap)를 줄이는 것이었습니다.
수쿠르(Sukkur)에 있는 누군가가 자신의 퇴거 통지서에 대해 임대 제한 조례(Rent Restriction Ordinance) 제8조가 실제로 무엇이라고 말하는지 읽을 수 있게 될 때 — 즉, 누군가가 다른 사람에게 들었다는 법의 내용에 의존하는 대신 — 그것은 결코 작은 일이 아닙니다. 그것은 자신의 권리를 아는 것과 모르는 것 사이의 차이입니다.
여전히 해결되지 않은 문제들
HAQ는 운영 중입니다. HAQ는 불완전합니다. 솔직한 목록은 다음과 같습니다:
| 격차 (Gap) | 상태 (Status) |
|---|---|
| 범위 (Coverage) | 100개 이상의 법률(Acts)은 상당한 수준이지만, 완전하지는 않습니다. 남은 주(provincial) 법률들을 위한 크롤러(crawler)가 진행 중입니다. |
| ... |
만약 기여하고 싶다면 — 특히 파키스탄 법률, 우르두어 자연어 처리(NLP), 또는 리걸 테크(legal tech) 분야에서 일하고 있다면 — 저장소(repository)는 공개되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기