법률 문서 RAG에서 단순 벡터 검색을 중단하고 권위 가중치 검색으로 전환한 이유
Why I stopped using pure vector search for legal documents and switched to authority-weighted retrieval
핵심 요약
법률 문서 RAG 구축 시 단순 벡터 유사도 검색의 위험성을 지적하고, 문서의 권위와 카테고리를 고려한 검색 전략을 제안함.
- 벡터 검색의 한계 — 법률 문서의 권위와 상관없이 의미적 유사도만 따져 잘못된 정보를 제공할 위험이 있음.
- 카테고리 우선순위 — 법원 판결, 규제 가이드라인 등 문서 권위에 따라 우선순위를 부여하여 답변의 정확도를 높임.
- 계층적 카테고리 검색 — 카테고리별로 별도의 벡터 검색을 수행하여 특정 문서군이 검색 결과를 독점하는 것을 방지함.
- 프롬프트 엔지니어링 — LLM이 잘못된 출처를 인용하거나 권위를 혼동하지 않도록 엄격한 부정적 지시사항을 추가함.
저는 약 1년 동안 RAG 시스템을 구축해 왔으며, 최근 독일의 한 법률 사무소를 위해 시스템을 배포하면서 일찍 알았더라면 좋았을 점을 배웠습니다. 표준 벡터 유사도 랭킹은 법률 분야의 사용 사례에서 매우 위험할 수 있습니다.
무슨 뜻인지 설명하겠습니다. 기본적인 RAG 설정에서는 쿼리를 임베딩하고, 의미적으로 가장 유사한 청크를 찾은 다음, 이를 컨텍스트에 채워 넣고 LLM에게 답변을 생성하도록 요청합니다. 이는 모든 소스의 신뢰도가 대략 비슷한 일반적인 지식 베이스에서는 아주 잘 작동합니다.
법률 분야에서는 소스의 신뢰도가 절대 같지 않습니다. 대법원 판결은 지방 법원 의견보다 더 큰 무게를 가집니다. 규제 당국의 공식 가이드라인은 법률 평론 기사보다 더 권위가 있습니다. 선임 파트너의 내부 전문가 주석은 사무소의 목적을 위해 이 모든 것보다 우선해야 합니다.
문제는 코사인 유사도가 이런 사실을 전혀 모른다는 점입니다. GDPR에 관한 잘 작성된 블로그 게시물은 실제 법원 판결보다 쿼리와의 유사도 점수가 더 높을 수 있는데, 이는 판결문이 밀도 높은 법률 용어를 사용하는 반면 블로그는 더 자연스러운 언어를 사용하기 때문입니다.
테스트 중에 이런 일이 일어나는 것을 목격했습니다. 시스템에 데이터 침해 통지 요건에 대해 물었을 때, 가장 상위에 검색된 청크들은 매우 명확하고 쿼리 친화적인 언어를 사용한 전문 문헌 소스였습니다. 결정적인 해석을 확립한 실제 구속력 있는 법원 판결은 법률 독일어가 밀도 높고 격식 있다는 이유로 4위에 머물렀습니다.
만약 시스템이 전문 문헌을 바탕으로 답변을 주로 구성하고 법원 판결은 짧게만 언급한다면, 그 답변을 읽는 변호사는 법적 상황에 대해 미묘하게 잘못된 인식을 갖게 됩니다.
그래서 저는 세 가지 검색 전략을 구축했습니다.
Flat은 기본 설정입니다. 표준 RAG 방식이며 모든 소스를 동일하게 취급합니다. 비교 기준점으로 사용했으며 권위가 중요하지 않은 단순 사실 조회에는 여전히 유용합니다.
Category Priority는 검색된 청크를 문서 카테고리(상급 법원, 하급 법원, 당국 의견, 가이드라인, 문헌 등)별로 그룹화하며, 프롬프트 템플릿은 LLM에게 가장 높은 권위부터 시작하여 하향식으로 합성하도록 명시적으로 지시합니다. 소스가 충돌할 경우 더 높은 권위가 우선합니다. 하급 법원이 상급 법원보다 더 광범위한 입장을 취할 경우, 두 입장을 모두 별도로 제시해야 합니다. 이것이 품질 향상에 가장 큰 기여를 했습니다.
Layered Category는 카테고리별로 별도의 벡터 검색을 실행합니다. 이는 특정 카테고리가 유사도 점수를 독점하더라도 모든 권위 수준이 최종 컨텍스트에 포함되도록 보장합니다. 이 방식이 없다면 전문 문헌이 많은 코퍼스(잘 작성되고 의미적으로 풍부한 경향이 있음)가 더 희소하지만 더 권위 있는 법원 판결을 밀어낼 수 있습니다.
카테고리 메타데이터는 문서 자체에서 나옵니다. 문서를 업로드할 때 클라이언트는 카테고리, 관할권, 날짜, 프레임워크를 태그합니다. 이 메타데이터는 검색 중에 강화되어 LLM이 실제 콘텐츠를 보기 전에 "[Chunk from: EuGH C-300/21 | category: High court decision | region: EU | date: 2023-12-14]"와 같은 정보를 보게 됩니다.
프롬프트 엔지니어링은 나머지 절반의 싸움이었습니다. 저는 LLM이 다음과 같은 행동을 하지 못하도록 명시적인 부정적 지시사항을 설정했습니다:
- 특정 문서를 명시하지 않고 "전문 문헌에 따르면"이라고 인용하는 것
- 실제 법원 이름 대신 "(Kategorie: High court decision)"을 인라인 인용으로 작성하는 것
- 상급 법원의 내용을 하급 법원이 말한 것처럼 잘못 귀속시키는 것
- 서로 다른 입장을 거짓된 합의로 뭉뚱그리는 것
이러한 부정적 지시사항은 테스트 중에 LLM이 정확히 그런 행동을 하는 것을 발견했기 때문에 추가되었습니다.
도메인 특화 RAG를 구축하는 모든 분들을 위한 교훈은, 소스에 내재된 신뢰도 계층이 있는지 신중하게 생각하라는 것입니다. 만약 그렇다면, 표준 벡터 유사도 랭킹은 도메인 전문 지식 없이는 감지하기 어려운 방식으로 사용자를 오도할 것입니다.
