Skip to content

kbsooo/law_rag

Repository files navigation

형법 RAG + LLM 평가 시스템 [강병수]

이 프로젝트는 형법 관련 지식을 Neo4j 그래프 데이터베이스에 저장하고, RAG(Retrieval-Augmented Generation) 기법을 활용하여 KMMLU 형법 벤치마크 문제를 해결하는 시스템입니다.

기능 개요

  • 형법 조문과 판례 데이터 로딩 및 정제
  • Neo4j 그래프 데이터베이스를 활용한 지식 그래프 구축
  • OpenAI 임베딩 모델을 활용한 벡터 검색
  • KMMLU 형법 문제에 대한 RAG 기반 답변 생성
  • OpenAI Batch API를 활용한 대규모 평가
  • 정확도 평가 및 결과 분석

디렉토리 구조

.
├── DockerFile              # Python 애플리케이션 도커 이미지 설정
├── docker-compose.yml      # 전체 시스템 도커 컴포즈 설정
├── main.py                 # 메인 실행 스크립트
├── pyproject.toml          # Python 의존성 및 프로젝트 설정
├── README.md               # 이 파일
├── dataset/                # 데이터셋 디렉토리
│   ├── criminal-law.pdf     # 형법 조문 PDF
│   ├── precedent_label/     # 판례 데이터 디렉토리
│   └── Criminal-Law-test.csv # 평가용 테스트 데이터
└── results/                # 결과 저장 디렉토리 (자동 생성)

설치 및 실행 방법

1. 환경 변수 설정

OpenAI API 키를 환경 변수로 설정합니다:

.env 파일을 프로젝트 루트에 생성하고 다음 내용을 추가합니다:

OPENAI_API_KEY=your-openai-api-key

2. 데이터셋 준비

필요한 데이터셋을 dataset 디렉토리에 다음과 같이 배치합니다:

  • criminal-law.pdf: 형법 조문이 담긴 PDF 파일
  • precedent_label/: 판례 JSON 파일들이 포함된 디렉토리
  • Criminal-Law-test.csv: KMMLU 형법 벤치마크 문제

3. Docker Compose로 시스템 실행

다음 명령어로 전체 시스템을 구축하고 실행합니다:

docker-compose up

처음 실행 시 도커 이미지 빌드와 Neo4j 설정이 진행되며, 이후 자동으로 다음 과정이 순차적으로 실행됩니다:

  1. Neo4j 데이터베이스 초기화 및 실행
  2. 형법 PDF 및 판례 데이터 로딩 및 정제
  3. Neo4j에 그래프 데이터베이스 구축
  4. KMMLU 문제에 대한 RAG 검색
  5. OpenAI Batch API를 통한 답변 생성
  6. 결과 평가 및 분석

4. 결과 확인

실행이 완료되면 results 디렉토리에 다음 파일들이 생성됩니다:

  • criminal_law_batch_input_{timestamp}.jsonl: Batch API 요청 파일
  • criminal_law_batch_output_{timestamp}.jsonl: Batch API 응답 파일
  • criminal_law_evaluation_results_{timestamp}.csv: 평가 결과 상세 데이터
  • criminal_law_batch_errors_{timestamp}.jsonl: (오류 발생 시) 오류 정보

개발 환경 설정

로컬 개발 환경을 설정하려면:

# Poetry 설치 (필요한 경우)
pip install poetry

# 의존성 설치
poetry install

# 쉘 스크립트로 실행 (권장)
chmod +x ./run.sh
./run.sh

# 또는 직접 실행
poetry run python main.py

테스트 실행

프로젝트의 테스트는 pytest로 동작합니다:

pytest

기술 스택

  • 언어 및 프레임워크: Python 3.13
  • 의존성 관리: Poetry
  • 데이터베이스: Neo4j 5.14
  • AI 모델: OpenAI GPT-4o-mini, text-embedding-3-small
  • 컨테이너화: Docker, Docker Compose
  • 데이터 처리: Pandas, NumPy, Langchain
  • 평가: OpenAI Batch API

벤치마크 결과

모델: gpt-4o-mini 날짜: 2025-04-13

  • 총 문제 수: 200
  • 정확한 답변 수: 74
  • 부정확한 답변 수: 126
  • 예측 오류/실패: 0
  • 정확도(오류 제외): 37.00%
  • 전체 정확도(오류 포함): 37.00%

검색 방법론 비교

시스템 구현 과정에서 다양한 검색 방법을 비교 분석했습니다:

1. 벡터 임베딩 검색 (기본)

단순 코사인 유사도 기반의 벡터 검색으로, 검색 속도는 약 3.24초였으나 관련성이 낮은 결과가 포함되는 한계가 있었습니다.

2. 하이브리드 검색

벡터 검색과 키워드 기반 검색을 결합한 방식으로, 검색 속도는 약 3.40초였으며 기본 벡터 검색보다 정확도가 향상되었습니다.

3. 다단계 검색

여러 단계의 검색을 순차적으로 수행하는 방식으로, 검색 속도는 약 3.40초였습니다.

4. GraphRAG (최종 채택)

그래프 데이터베이스의 관계성을 활용한 검색 방식으로, 검색 속도는 약 3.51초였으나 법률 조항과 판례 간의 상관관계를 가장 효과적으로 검색할 수 있어 최종적으로 채택했습니다.

주의 사항

  • Neo4j 데이터베이스 연결을 위해 .env 파일에 적절한 접속 정보를 설정해야 합니다:
    NEO4J_URI=neo4j+s://your-neo4j-uri
    NEO4J_USERNAME=your-username
    NEO4J_PASSWORD=your-password
    OPENAI_API_KEY=your-openai-api-key
    
  • 첫 실행 시 데이터 로딩 및 임베딩 생성에 시간이 소요될 수 있습니다 (약 30분 내외).
  • OpenAI API 키가 유효하지 않으면 시스템이 제대로 작동하지 않습니다.
  • 실행 시간은 하드웨어 사양과 OpenAI API 응답 시간에 따라 달라질 수 있습니다.

문제 해결

  • Neo4j 연결 오류: 컨테이너가 완전히 시작되었는지 확인하세요. docker-compose logs neo4j로 로그를 확인할 수 있습니다.
  • OpenAI API 오류: API 키 설정과 할당량을 확인하세요.
  • 메모리 부족: Docker에 할당된 메모리를 증가시키세요.

결과 criminal-law-rag | ===== Benchmark Result Summary ===== criminal-law-rag | Model Used: gpt-4o-mini criminal-law-rag | Total Questions: 200 criminal-law-rag | Correct Answers: 74 criminal-law-rag | Incorrect Answers: 126 criminal-law-rag | Prediction Errors/Failures: 0 criminal-law-rag | Accuracy (excluding errors): 0.3700 criminal-law-rag | Overall Accuracy (including errors as incorrect): 0.3700 (37.00%)

벡터 임베딩 방식 (기존)

Query completed in 3.24 seconds.

--- Top Results ---

  1. Type: Precedent, ID: 92도2540, Score: 0.7387 Name: 살인 Keywords: ['타인의 법익', '상당한 이유'] Referenced Articles: ['제10조(심신장애자)', '제21조(정당방위)', '제308조(사자의 명예훼손)', '제308조', '제10조 (폐지되는 법률등)'] Text Preview: 정당방위의 성립요건으로서의 방어행위에는 순수한 수비적 방어뿐 아니라 적극적 반격을 포함하는 반격방어의 형태도 포함됨은 소론과 같다고 하겠으나, 그 방어행위는 자기 또는 타인의 법익침해를 방위하기 위한 행위로서 상당한 이유가 있어야 하는 것인데, 피고인들의 판시 행위가 위에서 본 바와 같이 그 상당성을 결여한 것인 이상 정당방위행위로 평가될 수는 없는 것이므로, 원심이 피고인들의 이 사건 범행이 현재의 부당한 침해를 방위할 의사로 행해졌다기보다는 공격의 의사로 행하여졌다고 인정한 것이 적절하지 못하다고 하더라도, 정당방위행위가 되지 ...

  1. Type: Precedent, ID: 2009도2114, Score: 0.6939 Name: 특수공무집행방해[변경된죄명:폭력행위등처벌에관한법률위반(공동폭행)] Keywords: ['사회상규에 위배', '소극적인 방어행위'] Referenced Articles: ['제6조(대한민국과 대한민국 국민에 대한 국외범)', '제20조(정당행위)', '제21조(정당방위)', '제136조(공무집행방해)', '제136조', '제260조(폭행, 존속폭행)', '제260조', '제6조 (경합범에 대한 신법의 적용례)', '제6조'] Text Preview: 비록 경찰관들의 위법한 상경 제지 행위에 대항하기 위하여 한 것이라 하더라도, 피고인들이 다른 시위참가자들과 공동하여 위와 같이 경찰관들을 때리고 진압방패와 채증장비를 빼앗는 등의 폭행행위를 한 것은 소극적인 방어행위를 넘어서 공격의 의사를 포함하여 이루어진 것으로서 그 수단과 방법에 있어서 상당성이 인정된다고 보기 어려우며 긴급하고 불가피한 수단이었다고 볼 수도 없으므로, 이를 사회상규에 위배되지 아니하는 정당행위나 현재의 부당한 침해를 방어하기 위한 정당방위에 해당한다고 볼 수 없다. 그럼에도 불구하고, 원심은 그 판시와 같은 ...

  1. Type: Precedent, ID: 83누383, Score: 0.6789 Name: 영업정지처분무효확인 Keywords: ['법령 위반행위'] Referenced Articles: ['제1조(범죄의 성립과 처벌)', '제34조(간접정범, 특수한 교사, 방조에 대한 형의 가중)', '제37조(경합범)', '제38조(경합범과 처벌례)', '제34조', '제1조 (구형법 기타 법령과 형의 경중)', '제1조 (시행일)'] Text Preview: 정당한 절차에 의하지 않고 구두에 의한 하도급계약을 체결하여 공사를 시작한 때에건설업법 제34조 제3항의 위반행위를 범한 것이 되니 그 위반행위를 이유로 한 행정상의 제재처분(행위당시에는 필요적 취소사유)을 하려면 그 위반행위 이후 법령의 변경에 의하여 처분의 종류를 달리(영업정지 사유로) 규정하였다 하더라도 그 법률적용에 관한특별한 규정이 없다면 위반행위 당시에 시행되던 법령을 근거로 처분을 하여야 마땅하다....

하이브리드 검색

-- 하이브리드 검색 실행: '정당방위의 요건은 무엇인가?' --- 검색 완료: 3.40초 소요

--- 검색 결과 ---

  1. 유형: Precedent, ID: 92도2540, 스코어: 0.7910 이름: 살인 키워드: ['타인의 법익', '상당한 이유'] 참조 법조항: ['제10조(심신장애자)', '제21조(정당방위)', '제308조(사자의 명예훼손)', '제308조', '제10조 (폐지되는 법률등)'] 미리보기: 정당방위의 성립요건으로서의 방어행위에는 순수한 수비적 방어뿐 아니라 적극적 반격을 포함하는 반격방어의 형태도 포함됨은 소론과 같다고 하겠으나, 그 방어행위는 자기 또는 타인의 법익침해를 방위하기 위한 행위로서 상당한 이유가 있어야 하는 것인데, 피고인들의 판시 행위가 위에서 본 바와 같이 그 상당성을 결여한 것인 이상 정당방위행위로 평가될 수는 없는 것이므로, 원심이 피고인들의 이 사건 범행이 현재의 부당한 침해를 방위할 의사로 행해졌다기보다는 공격의 의사로 행하여졌다고 인정한 것이 적절하지 못하다고 하더라도, 정당방위행위가 되지 ...

  1. 유형: Precedent, ID: 2003도4934, 스코어: 0.7295 이름: 명예훼손(일부 인정된 죄명 : 모욕)·폭행 키워드: ['사회상규에 위배되지 아니하는 행위', '행위의 수단이나 방법의 상당성'] 참조 법조항: ['제20조(정당행위)', '제21조(정당방위)', '제232조(자격모용에 의한 사문서의 작성)', '제232조의2(사전자기록위작ㆍ변작)', '제260조(폭행, 존속폭행)', '제260조', '제307조(명예훼손)', '제307조', '제311조(모욕)', '제312조(고소와 피해자의 의사)', '제311조', '제314조(업무방해)', '제316조(비밀침해)'] 미리보기: 형법 제20조 소정의 ‘사회상규에 위배되지 아니하는 행위’라 함은 법질서 전체의 정신이나 그 배후에 놓여 있는 사회윤리 내지 사회통념에 비추어 용인될 수 있는 행위를 말하고, 어떠한 행위가 사회상규에 위배되지 아니하는 정당한 행위로서 위법성이 조각되는 것인지는 구체적인 사정 아래서 합목적적, 합리적으로 고찰하여 개별적으로 판단되어야 하므로, 이와 같은 정당행위가 인정되려면, 첫째 그 행위의 동기나 목적의 정당성, 둘째 행위의 수단이나 방법의 상당성, 셋째 보호이익과 침해이익의 법익 균형성, 넷째 긴급성, 다섯째 그 행위 이외의 다른...

  1. 유형: Precedent, ID: 83도3124, 스코어: 0.7163 이름: 출판물에의한명예훼손 키워드: ['불특정 다수인'] 참조 법조항: ['제20조(정당행위)', '제307조(명예훼손)', '제309조(출판물 등에 의한 명예훼손)', '제307조', '제310조(위법성의 조각)', '제309조'] 미리보기: 명예훼손죄의 요건인 공연성은 불특정 또는 다수인이 인식할 수 있는 상태를 말하므로, 원심확정과 같이 피고인들이 이 사건 출판물 15부를 피고인들이 소속된 교회의 교인 15인에게 배부한 이상 공연성의 요건은 충족된 것이라고 보겠으며 배부받은 사람중 일부가 소론과 같이 위 출판물작성에 가담한 사람들이라고 하여도 결론에 아무런 소장이 없으니, 명예훼손죄의 성립을 인정한 원심조치에 소론과 같이 공연성에 관한 법리를 오해한 위법이 없다. 또 위 출판물에 게재된 내용이 허위사실인 이상 당연히 위법성이 인정되는 것이고 사회통념상 위법성이 인정되...

다단계 검색

-- 다단계 검색 실행: '정당방위의 요건은 무엇인가?' --- 검색 완료: 3.40초 소요

--- 검색 결과 ---

  1. 유형: Precedent, ID: 92도2540, 스코어: 0.7386 이름: 살인 키워드: ['타인의 법익', '상당한 이유'] 참조 법조항: ['제10조(심신장애자)', '제21조(정당방위)', '제308조(사자의 명예훼손)', '제308조', '제10조 (폐지되는 법률등)'] 미리보기: 정당방위의 성립요건으로서의 방어행위에는 순수한 수비적 방어뿐 아니라 적극적 반격을 포함하는 반격방어의 형태도 포함됨은 소론과 같다고 하겠으나, 그 방어행위는 자기 또는 타인의 법익침해를 방위하기 위한 행위로서 상당한 이유가 있어야 하는 것인데, 피고인들의 판시 행위가 위에서 본 바와 같이 그 상당성을 결여한 것인 이상 정당방위행위로 평가될 수는 없는 것이므로, 원심이 피고인들의 이 사건 범행이 현재의 부당한 침해를 방위할 의사로 행해졌다기보다는 공격의 의사로 행하여졌다고 인정한 것이 적절하지 못하다고 하더라도, 정당방위행위가 되지 ...

  1. 유형: Precedent, ID: 2009도2114, 스코어: 0.6940 이름: 특수공무집행방해[변경된죄명:폭력행위등처벌에관한법률위반(공동폭행)] 키워드: ['사회상규에 위배', '소극적인 방어행위'] 참조 법조항: ['제6조(대한민국과 대한민국 국민에 대한 국외범)', '제20조(정당행위)', '제21조(정당방위)', '제136조(공무집행방해)', '제136조', '제260조(폭행, 존속폭행)', '제260조', '제6조 (경합범에 대한 신법의 적용례)', '제6조'] 미리보기: 비록 경찰관들의 위법한 상경 제지 행위에 대항하기 위하여 한 것이라 하더라도, 피고인들이 다른 시위참가자들과 공동하여 위와 같이 경찰관들을 때리고 진압방패와 채증장비를 빼앗는 등의 폭행행위를 한 것은 소극적인 방어행위를 넘어서 공격의 의사를 포함하여 이루어진 것으로서 그 수단과 방법에 있어서 상당성이 인정된다고 보기 어려우며 긴급하고 불가피한 수단이었다고 볼 수도 없으므로, 이를 사회상규에 위배되지 아니하는 정당행위나 현재의 부당한 침해를 방어하기 위한 정당방위에 해당한다고 볼 수 없다. 그럼에도 불구하고, 원심은 그 판시와 같은 ...

  1. 유형: Precedent, ID: 83누383, 스코어: 0.6791 이름: 영업정지처분무효확인 키워드: ['법령 위반행위'] 참조 법조항: ['제1조(범죄의 성립과 처벌)', '제34조(간접정범, 특수한 교사, 방조에 대한 형의 가중)', '제37조(경합범)', '제38조(경합범과 처벌례)', '제34조', '제1조 (구형법 기타 법령과 형의 경중)', '제1조 (시행일)'] 미리보기: 정당한 절차에 의하지 않고 구두에 의한 하도급계약을 체결하여 공사를 시작한 때에건설업법 제34조 제3항의 위반행위를 범한 것이 되니 그 위반행위를 이유로 한 행정상의 제재처분(행위당시에는 필요적 취소사유)을 하려면 그 위반행위 이후 법령의 변경에 의하여 처분의 종류를 달리(영업정지 사유로) 규정하였다 하더라도 그 법률적용에 관한특별한 규정이 없다면 위반행위 당시에 시행되던 법령을 근거로 처분을 하여야 마땅하다.

그래프 기반 검색

-- 그래프 기반 검색 실행: '정당방위의 요건은 무엇인가?' --- 검색 완료: 3.51초 소요

--- 검색 결과 ---

  1. 유형: Article, ID: 제21조(정당방위), 스코어: 0.7724 관련 판례 수: 7 관련 키워드: ['공소시효', '정지', '연장', '배제', '특례조항', '소급적용', '경과규정'] 미리보기: 제21조(정당방위) ①자기 또는 타인의 법익에 대한 현재의 부당한 침해를 방위하기 위한 행위는 상당한 이유가 있는 때에는 벌하지 아니한다. ②방위행위가 그 정도를 초과한 때에는 정황에 의하여 그 형을 감경 또는 면제할 수 있다. ③전항의 경우에 그 행위가 야간 기타 불안스러운 상태하에서 공포, 경악, 흥분 또는 당황으로 인한 때에는 벌하지 아니한다.

  1. 유형: Article, ID: 제21조(정당방위), 스코어: 0.7624 관련 판례 수: 6 관련 키워드: ['성범죄', '선고형', '경합범', '성폭력처벌법', '개정', '신상정보 등록기간'] 미리보기: 제21조(정당방위) ①자기 또는 타인의 법익에 대한 현재의 부당한 침해를 방위하기 위한 행위는 상당한 이유가 있는 때에는 벌하지 아니한다. ②방위행위가 그 정도를 초과한 때에는 정황에 의하여 그 형을 감경 또는 면제할 수 있다. ③전항의 경우에 그 행위가 야간 기타 불안스러운 상태하에서 공포, 경악, 흥분 또는 당황으로 인한 때에는 벌하지 아니한다.

  1. 유형: Precedent, ID: 92도2540, 스코어: 0.7387 이름: 살인 키워드: ['타인의 법익', '상당한 이유'] 참조 법조항: ['제10조(심신장애자)', '제21조(정당방위)', '제308조(사자의 명예훼손)', '제308조', '제10조 (폐지되는 법률등)'] 미리보기: 정당방위의 성립요건으로서의 방어행위에는 순수한 수비적 방어뿐 아니라 적극적 반격을 포함하는 반격방어의 형태도 포함됨은 소론과 같다고 하겠으나, 그 방어행위는 자기 또는 타인의 법익침해를 방위하기 위한 행위로서 상당한 이유가 있어야 하는 것인데, 피고인들의 판시 행위가 위에서 본 바와 같이 그 상당성을 결여한 것인 이상 정당방위행위로 평가될 수는 없는 것이므로, 원심이 피고인들의 이 사건 범행이 현재의 부당한 침해를 방위할 의사로 행해졌다기보다는 공격의 의사로 행하여졌다고 인정한 것이 적절하지 못하다고 하더라도, 정당방위행위가 되지 ...

데이터 출처:

아쉬운점ㅠㅠ:

  • GraphRAG를 활용하면서 노드 간 연관성의 강도나 의미적 중요도를 효과적으로 반영하는 구조가 부족했습니다. 법률 조항과 판례 간의 연결은 잘 형성되었지만, 그 관계의 중요도나 방향성을 세밀하게 조정할 수 없어 검색 결과에 한계가 있었습니다.
  • 법률 도메인에 대한 사전 지식이 부족해 데이터 이해와 활용 방식에 많은 시간을 소요했습니다. 판례 데이터는 자체를 처음 보았고, 이를 어떻게 구조화하고 검색에 활용할 수 있을지 탐색하는 과정이 필요했습니다
  • 법 관련 시험 문제집의 해설 데이터 등 보다 구조화된 학습 데이터를 활용하지 못한 점이 아쉬움으로 남았습니다. 사전에 관련 자료를 충분히 조사했다면 성능 향상에 도움이 되었을 것이라 생각됩니다.
  • RAG 결과의 정답률이 낮은 편(37%)으로, 검색 방식이나 데이터 구성의 한계가 분명히 존재했습니다. 다양한 검색 전략을 실험하긴 했지만, 여전히 모델의 정확도에는 개선 여지가 많았습니다.
  • RAG 모델 구축 자체가 처음이었기 때문에 구현과 실험 과정에서 낯설고 어색함이 많았고, 결과 분석이나 튜닝 과정에서도 경험 부족이 영향을 주었던 것 같습니다.

About

KMMLU criminal RAG

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages