"교통사고가 났는데 상대방이 신호위반을 했어요. 과실비율이 어떻게 되나요?"
이런 복잡한 법률 상황을 설명했을 때, 관련된 법령이나 판례를 정확하게 찾아주는 시스템이 있다면 어떨까요? 단순한 키워드 검색이 아닌, 상황의 의미를 이해하고 가장 적합한 법률 문서를 찾아주는 똑똑한 검색 시스템을 만들어보겠습니다.
왜 벡터 데이터베이스인가?

기존 검색의 한계
전통적인 키워드 검색은 정확히 일치하는 단어만 찾아줍니다. "신호위반"이라는 키워드가 문서에 없으면 검색되지 않죠.
벡터 검색의 장점
벡터 검색은 의미적 유사성을 기반으로 검색합니다:
- "신호위반" → "적신호 무시", "교통신호 미준수" 같은 유사한 의미도 찾아냄
- "과실비율" → "책임 분담", "손해배상 비율" 등과 연결
- 자연어로 상황을 설명해도 관련 법령을 찾아냄
실제 테스트
입력:

출력:

기술 스택 선택
ChromaDB vs 다른 벡터 DB들
| 특징 | ChromaDB | Pinecone | Weaviate | FAISS |
| 설치 | pip install 한 줄 | 클라우드 서비스 | Docker 필요 | 저수준 라이브러리 |
| 비용 | 무료 | 유료 | 무료(복잡) | 무료 |
| 설정 복잡도 | 매우 간단 | 간단 | 복잡 | 복잡 |
| 프로토타입 적합성 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
ChromaDB의 독특한 점: Neo4j 같은 그래프 DB는 독립적인 서버로 실행되지만, ChromaDB는 Python 애플리케이션에 임베디드 라이브러리로 포함됩니다. Docker나 별도 서버 설정 없이 코드로 바로 사용할 수 있어요.
# 이게 전부입니다!
import chromadb
client = chromadb.PersistentClient(path="./legal_db")
프로젝트 구조 설계
디렉터리 구성
vectordb-legal-search/
├── legal_db/ # ChromaDB 벡터 데이터 저장소
│ ├── chroma.sqlite3 # 메타데이터 DB
│ └── [벡터 파일들] # 실제 임베딩 데이터
├── data/ # 향후 법률 문서 파일 저장
├── main.py # FastAPI 메인 애플리케이션
├── test_client.py # API 테스트 클라이언트
├── requirements.txt # 의존성 패키지
└── venv/ # 가상환경
가상환경 설정
mkdir legal-vector-search
cd legal-vector-search
python3 -m venv venv
source venv/bin/activate
pip install fastapi uvicorn chromadb sentence-transformers pydantic
핵심 구현
1. 한국어 임베딩 모델
from sentence_transformers import SentenceTransformer
# 한국어에 최적화된 임베딩 모델 사용
model = SentenceTransformer('jhgan/ko-sroberta-multitask')
2. 의미 기반 문서 저장
# 단순한 텍스트를 고차원 벡터로 변환
def add_document(title, content, doc_type, category):
embedding = embedding_model.encode(content)
collection.add(
embeddings=[embedding.tolist()],
documents=[content],
metadatas=[{
"title": title,
"doc_type": doc_type,
"category": category
}],
ids=[unique_id]
)
3. 자연어 상황 검색
def search_documents(situation, case_type=None, keywords=None, top_k=3):
# 사용자의 상황 설명을 벡터로 변환
query_embedding = embedding_model.encode(situation)
# 벡터 유사도로 관련 문서 검색
results = collection.query(
query_embeddings=[query_embedding.tolist()],
n_results=top_k,
include=['metadatas', 'documents', 'distances']
)
return format_search_results(results)
실제 동작 과정
1. 서버 시작
python main.py
첫 실행 시 다음과 같은 과정이 진행됩니다:
- 한국어 임베딩 모델 다운로드 (약 471MB)
- ChromaDB 컬렉션 생성
- 샘플 법률 데이터 6건 로딩
2. API 테스트

브라우저에서 http://localhost:8001/docs로 접속하면 Swagger UI를 통해 API를 테스트할 수 있습니다.
검색 요청 예시:
{
"situation": "회사를 그만했는데 밀린 월급을 받지 못했어요",
"case_type": "",
"keywords": []
}
검색 결과:

📊 시스템의 똑똑한 점들
1. 의미 기반 매칭
- 입력: "교통사고 과실비율"
- 매칭: 민법 제750조 불법행위, 판례의 "손해배상 책임" 등
- 스코어: 0.8513 (매우 높은 유사도)
2. 메타데이터 활용
# 문서 타입별 분류
doc_types = ["법령", "판례", "해석례"]
# 카테고리별 정리
categories = ["민법", "형법", "근로기준법", "교통법규"]
# 날짜, 법원, 사건번호 등 상세 정보
metadata = {
"date": "2023-05-15",
"court": "대법원",
"case_number": "2023다1234"
}
3. 유연한 검색 옵션
- 상황 기반 검색: 자연어로 상황 설명
- 카테고리 필터: 특정 법 영역으로 제한
- 키워드 보조: 중요 키워드 힌트 제공
현재의 한계와 확장 가능성
현재 상황
- 데이터: 하드코딩된 6개 샘플 문서
- 범위: 제한적인 법률 영역
- 언어: 한국어 중심
확장 아이디어
# 1. 실제 법률 데이터 연동
- 법제처 오픈API 활용
- 대법원 판례 크롤링
- PDF 판결문 자동 파싱
# 2. 고도화 기능
- GPT API 연동 판례 요약
- 카테고리별 전문 검색
- 법률 용어 사전 연동
# 3. 성능 최적화
- Pinecone 클라우드 마이그레이션
- 캐싱 시스템 도입
- 검색 결과 랭킹 개선
후기
예상과 다른 점들
- ChromaDB의 편의성: Docker 없이도 벡터 DB를 쓸 수 있다는 게 신선함..
- 한국어 임베딩의 품질: ko-sroberta-multitask 모델이 법률 용어도 잘 이해함
- FastAPI의 자동 문서화: Swagger UI가 자동 생성되어 테스트가 편함
기술적 깨달음
- 벡터 DB != 복잡한 서버: 라이브러리 형태로도 충분히 강력함
- 의미 검색의 실용성: 키워드 검색으로는 불가능한 결과들이 나옴
- 프로토타입의 중요성: 완벽한 데이터보다 동작하는 시스템이 먼저
마무리
벡터 데이터베이스를 활용한 의미 검색은 단순한 키워드 매칭을 넘어서는 차세대 검색 경험을 제공합니다. 특히 법률처럼 복잡하고 전문적인 도메인에서는 더욱 큰 가치를 발휘하죠.
이 프로젝트를 통해 다음을 배울 수 있었습니다:
- 벡터 데이터베이스의 실제 활용법
- 임베딩 모델을 통한 의미 검색 구현
- FastAPI를 활용한 REST API 설계
- 자연어 처리와 정보 검색의 결합
다음 단계: 실제 법률 데이터를 연동하고, 더 정교한 검색 알고리즘을 적용해보면서 실용적인 서비스로 발전시켜나가고 싶습니다.
이 프로젝트의 전체 코드는 GitHub에서 확인하실 수 있습니다.
'development > Database' 카테고리의 다른 글
| Neo4j Graph Database로 기술스택 추천 시스템 만들기 (1) | 2025.09.10 |
|---|