부동산 관련 법률은 복잡하고, 일반인들이 이해하기 어려운 경우가 많습니다.
부동산 거래 신고법, 임대차 보호법, 재개발·재건축 규정 등은 전문가가 아니면 해석하기 쉽지 않죠.
이러한 법률 정보를 보다 쉽게 접근할 수 있도록, 우리는 LangChain을 활용한 부동산 법률 Q&A 챗봇을 개발했습니다!
이번 프로젝트에서는 RAG(Retrieval-Augmented Generation) 방식을 적용해,
실제 법률 문서를 기반으로 질문에 답변하는 AI 챗봇을 만들었어요.
🔍 프로젝트 주요 내용
✔ 법률 문서 크롤링 및 데이터베이스화
✔ VectorDB 기반 검색 및 답변 생성
✔ OpenAI & Upstage API를 활용한 자연어 처리
✔ 사용자의 질문을 이해하고, 관련 법 조항을 찾아 답변하는 시스템 구축
이번 프로젝트를 통해 AI가 부동산 법률 데이터를 어떻게 이해하고 답변할 수 있는지 실험하면서, LangChain의 강력한 기능을 직접 경험할 수 있었습니다.
이 글에서는 부동산 법률 챗봇을 어떻게 개발했는지, 어떤 과정과 기술을 활용했는지, 그리고 결과물은 어떤 모습인지 자세히 소개해 보겠습니다.
데이터 수집 및 전처리
부동산 법률 챗봇을 개발하기 위해 가장 먼저 진행한 과정은 법률 데이터 수집입니다.
일반적으로 법률 정보는 정부 기관의 웹사이트나 공식 문서에서 제공되며, 이를 AI가 활용할 수 있도록 크롤링을 통해 데이터를 정리해야 합니다.
이번 프로젝트에서는 대한민국 법령정보센터(law.go.kr)에서 부동산 거래 신고법 데이터를 수집하였습니다.
이 데이터를 바탕으로 AI가 실시간으로 법률 관련 질문에 답변할 수 있도록 구성했습니다.
크롤링을 활용한 데이터 수집
웹에서 필요한 데이터를 자동으로 가져오는 과정을 웹 크롤링(Web Crawling)이라고 합니다.
이를 위해 Python의 requests와 BeautifulSoup 라이브러리를 활용하여 법령 데이터를 수집했습니다.
✅ 크롤러 구현 코드 (crawler/crawler.py)
import requests
from bs4 import BeautifulSoup
class Crawler:
def fetch_law_data(self, url):
try:
response = requests.get(url)
response.raise_for_status()
except Exception as e:
print(f"크롤링 오류: {e}")
return []
soup = BeautifulSoup(response.text, 'html.parser')
# 예시: 'law-item' 클래스를 가진 div 태그 내의 텍스트를 수집
law_items = soup.find_all("div", class_="law-item")
data = [item.get_text(strip=True) for item in law_items]
return data
- requests.get(url)을 통해 웹페이지의 HTML을 가져옴
- BeautifulSoup을 이용해 HTML을 파싱
- find_all("div", class_="law-item")을 이용하여 관련 법 조항을 추출
- 추출한 데이터를 텍스트로 변환하여 리스트로 반환
위 방식으로 부동산 거래 신고법의 조항 및 설명을 자동으로 수집할 수 있습니다.
✅ 데이터 저장 과정 (main.py)
from llm.llm_manager import LLMManager
from vector_store.vector_store_manager import VectorStoreManager
from retriever.retriever_manager import RetrieverManager
from crawler.crawler import Crawler
from chat_history.chat_history_manager import ChatHistoryManager
from sql.db_manager import DBManager
from logger.logger import Logger
def main():
# 로그 기록 초기화
logger = Logger()
logger.log("프로젝트 시작")
# 크롤러를 통해 법령 데이터 수집
crawler = Crawler()
law_data = crawler.fetch_law_data(url="https://www.law.go.kr/법령/부동산거래신고등에관한법령")
logger.log(f"수집된 법령 데이터: {len(law_data)}개 항목")
# 벡터 스토어에 수집 데이터 저장
vector_store = VectorStoreManager()
vector_store.store_documents(law_data)
logger.log("데이터를 Vector DB에 저장 완료")
- 크롤러(Crawler)를 실행하여 fetch_law_data(url)로 데이터를 수집
- 수집된 데이터를 VectorStoreManager를 이용해 벡터 데이터베이스에 저장
- AI가 효율적으로 검색할 수 있도록 인덱싱 및 데이터 정리
📌 데이터 전처리
- 수집된 데이터는 그대로 사용할 수 없고, AI가 처리할 수 있도록 전처리가 필요합니다.
- 불필요한 HTML 태그 및 공백 제거
- 조항별로 적절한 키워드 및 구조를 정리
- VectorDB에 저장할 때 문장 단위로 나누어 검색 최적화
향후 모델이 사용자의 질문을 이해하고 적절한 답변을 제공하려면 질문과 가장 관련 있는 법 조항을 빠르게 찾아야 합니다.
이를 위해 법률 문서를 벡터화(Vectorization)하고, 검색 기능을 최적화하는 과정이 포함됩니다.
LangChain 기반 Q&A 시스템 설계
챗봇의 주요 기능을 모듈별로 정리하여 모듈화된 구조로 개발하였습니다.
Q&A 시스템 작동 원리
챗봇의 작동 흐름은 다음과 같습니다.
- 법률 데이터 크롤링 (crawler/)
대한민국 법령정보센터에서 부동산 관련 법령을 수집합니다. - 크롤링된 데이터를 벡터 데이터베이스(VectorDB)에 저장 (vector_store/)
크롤링한 법률 데이터를 벡터화하여 저장합니다. - 사용자의 질문을 이해하고 문서 검색 (retriever/)
사용자의 질문을 분석하고, 관련 법 조항을 벡터 DB에서 검색합니다. - LLM을 활용하여 답변 생성 (llm/)
검색된 문서를 참고하여 AI가 법률 기반 답변을 생성합니다. - 대화 기록 관리 (chat_history/ + sql/)
사용자와 AI의 대화 내역을 기록하고 저장합니다. - Streamlit을 활용한 웹 인터페이스 제공 (streamlit_app.py)
사용자가 직접 질문을 입력하고 답변을 받을 수 있도록 웹 애플리케이션 형태로 구현합니다.
챗봇을 웹 브라우저에서 직접 실행할 수 있도록 Streamlit을 활용하여 프론트엔드를 개발하였습니다.
✔ 사용자가 입력한 질문을 실시간으로 처리
✔ 관련 법률 데이터를 기반으로 LLM이 답변 생성
✔ 대화 히스토리 저장 및 관리
✔ 직관적인 UI 제공
트러블슈팅
- Circular Import 에러
crawler.py에서 자기 자신을 import하는 코드로 인해 순환 참조 에러가 발생했습니다. 불필요한 import 문을 제거하여 해결했습니다. - Conda 환경 활성화 문제
conda activate 명령어 실행 시 오류가 발생했는데, 이는 Conda 쉘 초기화 문제였습니다. source /opt/conda/etc/profile.d/conda.sh 실행 후 다시 활성화하거나, Conda를 최신 버전으로 업데이트하여 해결했습니다. - Streamlit on_submit 파라미터 오류
Streamlit 버전 문제로 on_submit이 지원되지 않아 발생한 오류였습니다. 최신 버전(1.22.0 이상)으로 업그레이드하거나, st.text_input과 st.button을 조합하는 방식으로 수정했습니다. - Session State 값 초기화 에러
Streamlit에서 st.session_state["user_input"] = ""를 직접 재할당하면 오류가 발생했습니다. .get()을 사용해 안전하게 접근하도록 수정했습니다. - display_chat 함수 미정의 오류
display_chat()을 호출하기 전에 정의하지 않아 발생한 문제였습니다. 함수 선언을 먼저 한 뒤, 마지막에 호출하는 방식으로 해결했습니다. - 채팅 내역 출력 순서 문제
대화 내역이 최신 메시지가 아래쪽에 표시되는 문제가 있었습니다. reversed()를 사용해 최신 메시지가 위쪽에 나타나도록 수정했습니다. - 크롤링한 데이터와 벡터 DB 연동 문제
Streamlit에서는 크롤링 데이터를 직접 사용하고 있었고, 벡터 DB를 활용하지 않았습니다. 크롤링 데이터를 VectorDB에 저장한 후 검색하여 답변을 생성하는 방식으로 수정하여 일관성을 유지했습니다.
프로젝트 챗봇
사용자가 질문을 입력하면, 크롤링한 법령 데이터를 바탕으로 답변을 생성합니다. 특히 LangChain 기반의 RAG(Retrieval-Augmented Generation) 방식을 활용해, 벡터 DB에서 관련 법률 조항을 검색하고 이를 바탕으로 답변을 제공합니다.
웹 인터페이스는 Streamlit으로 구현되어 있으며, 사용자는 입력창에 질문을 입력하고 "전송" 버튼을 눌러 답변을 받을 수 있습니다.
챗봇의 답변은 단순 요약이 아니라, 실제 법률 문서를 참고하여 생성되며, 추가 질문을 통해 보다 심층적인 상담도 가능합니다.
이 프로젝트를 통해 AI가 법률 데이터를 어떻게 활용할 수 있는지 실험해보았고, 크롤링한 데이터를 벡터 DB에 저장하여 검색 및 답변 성능을 최적화하는 방식을 적용했습니다.
이를 통해 복잡한 부동산 법률 정보를 보다 쉽게 제공하는 시스템을 구축할 수 있었습니다.
프로젝트를 통해 배운 점
이 프로젝트를 통해 부동산 법률 데이터를 AI가 어떻게 활용할 수 있는지 직접 경험할 수 있었습니다.
특히 LangChain과 RAG(Retrieval-Augmented Generation) 기법을 활용한 법률 Q&A 시스템 구축 과정에서 여러 가지 중요한 점을 배웠습니다.
- 데이터 크롤링 및 전처리의 중요성
법률 문서는 구조가 복잡하고, 크롤링한 원본 데이터를 그대로 활용하기 어려웠습니다. 데이터를 벡터 DB에 적절하게 저장하고 검색하기 위해 텍스트를 정제하는 과정이 필수적이었습니다. - LangChain을 활용한 검색 기반 답변 생성
단순히 LLM을 사용해 답변을 생성하는 것이 아니라, 벡터 DB를 활용한 검색 과정이 AI의 응답 정확도를 크게 향상시킨다는 점을 확인했습니다. 즉, 질문과 관련된 법령 내용을 먼저 찾아 이를 기반으로 답변을 생성하는 방식이 더욱 신뢰할 만한 결과를 제공합니다. - Streamlit을 활용한 챗봇 인터페이스 구축
Streamlit을 활용해 간단하지만 직관적인 챗봇 UI를 구현하면서, 사용자가 쉽게 법률 상담을 받을 수 있도록 UX를 개선하는 경험을 했습니다. 특히 세션 상태 관리, 대화 기록 저장 등의 기능을 추가하면서 인터랙티브한 시스템을 구현할 수 있었습니다. - 트러블슈팅을 통한 실전 경험
개발 과정에서 Circular Import 문제, Conda 환경설정 오류, Streamlit 버전 문제 등 다양한 트러블슈팅을 경험하면서, 문제를 해결하는 능력을 키울 수 있었습니다. 특히 패키지 의존성과 모듈 구조 설계가 코드 유지보수에 큰 영향을 미친다는 점을 체감했습니다. - 법률 데이터를 활용한 AI 응용 가능성 탐색
법률과 같은 구조화된 전문 지식을 AI가 다룰 때의 한계를 이해할 수 있었습니다. 단순한 법률 요약이 아닌, 정확한 법 조항을 기반으로 한 AI 답변 시스템을 설계하는 것이 핵심이라는 점을 배웠고, 이를 통해 다양한 분야에서 RAG를 활용한 AI 시스템 구축 가능성을 확인할 수 있었습니다.
이번 프로젝트를 통해 실제 법률 데이터를 활용한 AI 시스템을 설계하는 방법을 익히고, AI가 법률 상담을 보조하는 방식에 대한 새로운 인사이트를 얻을 수 있었습니다.
'Upstage AI LAB 부트캠프 5기 > 성장 기록' 카테고리의 다른 글
NLP 경진대회, 성과보다 중요한 배움의 순간들 (1) | 2025.02.05 |
---|---|
컴퓨터 비전 첫 도전기: 경진대회에서 배운 것들 (1) | 2025.01.09 |
DL 프로젝트 이론 탐구: 중반 학습 기록 (3) | 2024.12.17 |
추천 시스템 프로젝트, 첫 ML프로젝트 도전 (4) | 2024.12.11 |
처음 나선 경진대회, 도전과 성취의 여정 (3) | 2024.11.15 |