Skip to content

About

LLM을 이용한 매물 추천 시스템

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

GoZip 메인페이지

🏠 GoZip - 부동산 매물 추천 AI 플랫폼

AI 기반 부동산 매물 검색 및 추천 서비스
서울특별시 부동산 매물 데이터를 기반으로 최적의 매물을 추천하는 지능형 플랫폼

🌐 웹사이트 바로가기


팀 소개

이름 역할 주요 업무 GitHub
이태호 PM Elasticsearch, RAG, Frontend, Backend @william7333
최은정 APM 중개사 신뢰도 ML, DevOps, Frontend, Backend @eunjeong0911
임연희 팀원 실거래가 분류 ML, DevOps, Frontend, Backend @yheeeon
김수미 팀원 중개사 신뢰도 ML, Frontend, Backend @ghyeju0904
김담하 팀원 Neo4j, RAG, Frontend, Backend @DamHA-Kim
조준호 팀원 실거래가 분류 ML, Frontend, Backend @lemondear

목차


프로젝트 소개

부동산 매물 추천 AI 플랫폼은 서울특별시 부동산 매물 데이터를 기반으로 사용자에게 최적의 매물을 추천하는 지능형 플랫폼입니다.

핵심 가치

  • AI 기반 추천: 머신러닝 모델을 활용한 중개사 신뢰도 평가 및 가격 적정성 분석
  • RAG 챗봇: LangGraph 기반 대화형 매물 검색 및 추천 서비스
  • 하이브리드 검색: Elasticsearch 전문 검색 + Neo4j 그래프 검색의 결합
  • 그래프 DB: Neo4j를 활용한 매물-시설 간 관계 기반 검색
  • 실시간 분석: Elasticsearch를 통한 매물 통계 및 트렌드 분석

프로젝트 배경

설문조사 결과 (125명 대상)

1️⃣ 타 서비스 이용 불편사항

불편사항 비율
허위매물 58.3%
UI/UX 16.7%
정보부족 12.5%
기타 8.3%
매물관리 4.2%

2️⃣ 신규 서비스 희망 기능

희망 기능 비율
허위매물 판별 25.0%
매물비교/추천 21.4%
기타 17.9%
검색/필터 개선 14.3%
후기/리뷰 10.7%
실거래가 7.1%
사진/정보 3.6%

설문조사 기반 구현 기능

문제점 해결책 구현
허위매물 중개사 신뢰도 모델 거래성사율, 운영기간, 자격구분 → 골드/실버/브론즈 등급 분류
가격 불투명 가격 적정성 모델 지역별 시세 대비 → 저렴/적정/비쌈 자동 분류
복잡한 검색 AI 챗봇 자연어 기반 매물 검색 + 하이브리드 검색
불편한 UI 직관적 UX 채팅으로 바로 검색 + 매물 동시 비교 화면

핵심 기능

1. AI 챗봇 (RAG)

  • 자연어 기반 매물 검색
  • LangGraph 기반 질문 분류 및 응답
  • Neo4j + Elasticsearch 하이브리드 검색

2. 중개사 신뢰도 분석

  • 골드/실버/브론즈 등급 자동 분류
  • F1-macro 0.74

3. 가격 적정성 분석

  • 저렴/적정/비쌈 자동 분류
  • F1-macro 0.73
  • 지역×건물용도별 상대 시세 비교

4. 온도 지표

  • 안전 / 생활편의 / 교통 / 문화 / 반려동물
  • 각 항목 점수화 후 온도(°C)로 표시
  • 평균 기준선: 36.5°C

데이터 규모

총 매물

30,000+

중개사무소

400+

커버리지

서울 25개구

데이터 소스

데이터 출처 설명 용도
직방 API 서울시 월세/전세 원룸 매물 실시간 매물 정보
피터팬 서울시 부동산 매물 크롤링 매물 상세 정보
V-WORLD API 중개업소/중개업자 정보 중개사 신뢰도 모델 학습
서울시 열린 데이터 월세 실거래가 + 한국은행 금리 가격 적정성 모델 학습
공공 데이터 CCTV, 범죄 통계, 시설, 교통 온도 지표 산출

기술 스택

Frontend

  • Framework: Next.js 14 (App Router)
  • Language: TypeScript
  • Styling: Tailwind CSS
  • State Management: React Context API
  • Map: Kakao Map API
  • Authentication: NextAuth.js (Google OAuth)

Backend

  • Framework: Django 4.2 + Django REST Framework
  • Language: Python 3.11
  • API: FastAPI (RAG 서버, 추천 서버)
  • Authentication: JWT (djangorestframework-simplejwt)

Database

  • Relational DB: PostgreSQL 16 + pgvector (벡터 검색)
  • Graph DB: Neo4j 5.15 (APOC 플러그인)
  • Cache: Redis 7

Search Engine

  • Elasticsearch 8.17
    • 하이브리드 검색: 키워드 + k-NN 벡터 검색 결합
    • 텍스트 재정렬: Neo4j 후보를 텍스트 기반 재정렬
    • 한글 분석: Nori Analyzer (형태소 분석)
    • 벡터 검색: text-embedding-3-large (3072차원)
    • 점수 조합: Neo4j 60% + ES 40%

AI/ML

  • LLM: OpenAI GPT-4, gpt-4o-mini
  • Framework: LangChain, LangGraph
  • ML Libraries: scikit-learn, LightGBM, XGBoost, SHAP
  • Embeddings: OpenAI text-embedding-ada-002

Infrastructure

  • Containerization: Docker, Docker Compose

Development Tools

  • Package Manager: uv (Python), npm (Node.js)
  • Version Control: Git, GitHub
  • Analytics: Jupyter Notebook

시스템 아키텍처

flowchart TB
    subgraph CLIENT["Client"]
        USER[사용자]
    end

    subgraph FRONTEND["Frontend Layer"]
        NEXT["Next.js 14<br/>챗봇 UI | 지도 검색 | 매물 비교 | 찜 목록"]
    end

    subgraph BACKEND["Backend Layer"]
        DJANGO["Django REST API<br/>JWT 인증 | 매물 CRUD | 커뮤니티 API"]
    end

    subgraph AI_SERVICES["AI Services"]
        RAG["RAG Server (FastAPI)<br/>LangGraph | 챗봇 응답"]
        RECO["Reco Server (FastAPI)<br/>신뢰도 ML | 가격 ML"]
    end

    subgraph DATA["Data Layer"]
        NEO4J[(Neo4j)]
        POSTGRES[(PostgreSQL)]
        ES[(Elasticsearch)]
        REDIS[(Redis)]
    end

    subgraph EXTERNAL["External"]
        OPENAI["OpenAI API<br/>GPT-4o-mini"]
    end

    USER --> NEXT
    NEXT -->|REST API| DJANGO
    DJANGO --> RAG
    DJANGO --> RECO
    DJANGO --> NEO4J
    DJANGO --> POSTGRES
    DJANGO --> ES
    DJANGO --> REDIS
    RAG --> OPENAI
    RAG --> NEO4J
    RAG --> ES
Loading

데이터 흐름

1️⃣ 매물 검색 흐름

사용자 → Frontend → Backend → Neo4j/Elasticsearch
                              ↓
              하이브리드 검색 (Neo4j 60% + ES 40%)
                              ↓
              Backend → Frontend → 사용자

2️⃣ 챗봇 대화 흐름

사용자 질문 → Frontend → RAG Server → LangGraph Pipeline:
   ├── 1. query_analyzer_node (질문 분류/의도 추출)
   ├── 2. neo4j_search_node + vector_search_node (병렬 검색)
   ├── 3. soft_filter_rerank_node (재정렬 및 랭킹)
   ├── 4. sql_search_node (상세 정보 조회)
   └── 5. generate_node (LLM 응답 생성)
→ Frontend → 사용자

3️⃣ ML 모델 추론 흐름

매물 데이터 → Reco Server
   ├── Trust Model (중개사 신뢰도: 골드/실버/브론즈)
   └── Price Model (가격 적정성: 저렴/적정/비쌈)
→ Backend → Frontend

ML 모델

1️⃣ 중개사 신뢰도 모델 (Trust Model)

목적: 부동산 중개사의 신뢰도를 금/은/동 등급으로 분류

데이터

  • 출처: 크롤링 데이터 + V-WORLD API (중개업소 정보, 중개업자 정보)
  • 규모: 약 400개 중개사무소
  • 매칭: 3단계 매칭 (중개사무소명+대표자명, 등록번호+중개사무소명, 중개사무소명+대표자명)

타겟 생성

# 1. 거래성사율 계산
거래성사율 = 거래완료 / (거래완료 + 등록매물)

# 2. 지역별 표준화 (Z-score)
Performance_Zscore = (거래성사율 - 지역평균) / 지역표준편차

# 3. 자격점수 표준화
Qual_Zscore = (자격점수 - 평균) / 표준편차

# 4. 복합 Z-score (성사율 70% + 자격 30%)
Zscore = Performance_Zscore * 0.7 + Qual_Zscore * 0.3

# 5. 대표자구분 가중치 적용
대표자구분_가중치 = {
    '공인중개사': 0.0,
    '법인': +0.2,
    '중개보조원': -0.1,
    '중개인': -0.3
}
Zscore_조정 = Zscore + 대표자구분_가중치

# 6. 등급 분류 (Train 기준 분위수)
금등급: 상위 30% (Zscore_조정 > 70th percentile)
은등급: 중위 40% (30th ~ 70th percentile)
동등급: 하위 30% (Zscore_조정 < 30th percentile)

Feature (총 14개)

1. 실적 지표 (3개) - log 변환 적용

  • 등록매물_log
  • 총거래활동량_log
  • 1인당_거래량_log

log 변환 이유:
거래량 데이터는 왜도(Skewness)가 심함 (소수가 매우 많고, 대다수가 적음)
→ log 변환으로 이상치 영향 감소 및 스케일 정규화

2. 인력 지표 (3개)

  • 총_직원수
  • 중개보조원_비율
  • 자격증_보유비율

3. 경험 지표 (3개)

  • 운영기간_년
  • 숙련도_지수
  • 운영_안정성

4. 구조 지표 (1개)

  • 대형사무소

5. 대표자 자격 (2개)

  • 대표_공인중개사
  • 대표_법인

6. 지역 지표 (2개)

  • 지역_경쟁강도
  • 1층_여부

모델 성능

최종 성능 지표:

  • Test Accuracy: 73.24%
  • Train Accuracy: 80.43%
  • 과적합 정도: 7.19%
  • CV Mean: 74.76% (±7.60%)

등급별 성능 (Test 기준):

등급 Precision Recall F1-Score
브론즈 등급(0) 0.62 0.94 0.75
실버 등급(1) 0.75 0.69 0.72
골드 등급(2) 0.87 0.65 0.74

특징:

  • 브론즈 등급(신뢰도 낮음) 재현율이 가장 높음 (94%) - 문제 중개사 잘 감지
  • 골드 등급(신뢰도 높음) 정밀도가 가장 높음 (87%) - 우수 중개사 정확히 분류

알고리즘

  • 모델: Logistic Regression
  • 최적화: GridSearchCV (144개 조합)
  • 하이퍼파라미터: C=1, penalty='l1', solver='saga', class_weight='balanced'

alt text


2️⃣ 가격 적정성 모델 (Price Model)

목적: 월세 매물의 가격을 저렴/적정/비쌈으로 분류

모델 비교 (Test F1-Macro)

모델 F1-Macro Accuracy
LightGBM 0.7317 73.46%
XGBoost 0.6854 68.80%
LSTM 0.6715 67.04%

혼동행렬 (LightGBM)

등급 저렴 적정 비쌈
저렴 0.85 0.13 0.02
적정 0.24 0.63 0.13
비쌈 0.02 0.24 0.73

SHAP 분석 TOP-3

  1. 보증금_지역대비 - 지역 평균 대비 상대적 가격
  2. 임대면적 - 면적 차이로 가격 등급 변화
  3. 자치구_월별_임대료수준_구간 - 최근 지역 임대료 수준

가격 적정성 모델

Cost-Sensitive Learning

부동산 가격 분류에서 저렴한 매물을 비싸다고 예측하거나, 비싼 매물을 저렴하다고 예측하는 치명적 오류(Extreme Error) 는 사용자 경험에 큰 영향을 주기에, 이를 해결하기 위해 Cost-Sensitive Learning을 적용했다.

비용 행렬 (Cost Matrix)

실제 \ 예측 저렴(0) 적정(1) 비쌈(2)
저렴(0) 0 1 4
적정(1) 1 0 1
비쌈(2) 4 1 0

저렴 ↔ 비쌈 간 오분류는 비용 4 (인접 클래스 오분류 대비 4배)

2단계 학습 전략

Stage 1: class_weight 기반 초기 학습
  → 클래스 불균형 보정 (LightGBM class_weight='balanced')

Stage 2: 비용 기반 Sample Weight 재학습
  → Stage 1 모델의 예측 확률로 예상 비용 계산
  → E[Cost] = Σ P(pred=j) × Cost(true=i, pred=j)
  → 오분류 비용이 높은 샘플에 더 큰 가중치 부여 후 재학습

Threshold 조정: 저렴(0) 클래스 예측 시 보수적 임계값 적용 (conservative_factor=1.2)하여 확신이 낮은 극단 예측을 억제

Extreme Error Rate: 저렴 ↔ 비쌈 간 치명적 오류율을 별도 메트릭으로 추적하여 모델 안정성 모니터링


RAG 챗봇

LangGraph 파이프라인

flowchart LR
    A[사용자 질문] --> B[query_analyzer]
    B --> C[neo4j_search]
    B --> D[vector_search]
    C --> E[soft_filter_rerank]
    D --> E
    E --> F[sql_search]
    F --> G[generate]
    G --> H[응답]
Loading

노드 구성

노드 파일 경로 역할
query_analyzer_node apps/rag/nodes/query_analyzer_node.py 사용자 질문 분류 및 의도/엔티티 추출
neo4j_search_node apps/rag/nodes/neo4j_search_node.py Neo4j 기반 관계·거리 검색 (후보 탐색)
sql_search_node apps/rag/nodes/sql_search_node.py PostgreSQL에서 매물 상세 조회
es_search_node apps/rag/nodes/es_search_node.py Elasticsearch 텍스트/벡터 검색 및 후보 수집
vector_search_node apps/rag/nodes/vector_search_node.py 임베딩 기반 유사도 검색 (벡터 검색)
soft_filter_rerank_node apps/rag/nodes/soft_filter_rerank_node.py 텍스트 재정렬 및 소프트 필터 적용 (랭킹 보정)
generate_node apps/rag/nodes/generate_node.py LLM 호출 및 응답 생성·포맷팅 (최종 출력)
style_mapping apps/rag/nodes/style_mapping.py 응답 스타일/포맷 매핑 (선택적 후처리)

주요 기능

기능 설명 예시
자연어 검색 하드필터 + 소프트필터 동시 처리 "홍대역 근처 깨끗한 원룸"
허위매물 분석 중개사 신뢰도 등급 제공 골드/실버/브론즈
가격 분석 지역×용도별 시세 비교 저렴/적정/비쌈
랭킹 시스템 1순위~3순위 매물 추천 거리+가격+온도 종합

RAG 챗봇 검증

벤치마크 테스트를 통해 응답 품질 검증:

  • 복합 쿼리 성능 (위치 + 가격 + 편의시설)
  • Neo4j 그래프 검색 정확도
  • LLM 응답 생성 품질
  • 검색 결과와 응답 일관성

온도 지표(환경 점수)

온도 지표는 매물의 다양한 생활 요소를 한눈에 보여주기 위한 상대 점수입니다. 각 항목은 해당 범주의 세부 메트릭을 정규화하여 가중합한 후, 전체 매물 분포 대비 상대 위치를 온도(°C)로 표시합니다. 평균 기준선은 약 36.5°C입니다.

🛡️
안전
범죄 위험도 + 안전 인프라 (CCTV, 경찰서, 비상벨)
🛒
생활편의
편의점, 마트, 세탁소 등 필수 편의시설 접근성
🚇
교통
지하철역 이용량, 노선 수, 버스정류장 수, 업무지구 거리
🎨
문화
영화관, 미술관, 공연장, 도서관, 공원 접근성
🐾
반려동물
동물병원, 펫샵, 반려동물 놀이터, 산책로 접근성

온도 지표 예시


배포 아키텍처

AWS 아키텍처


문서

아키텍처 및 설계
API 및 백엔드
기능 구현
ML 모델
개발 환경

SKN18-FINAL-1TEAM - SK Networks Family AI Camp 18기 최종 프로젝트

Made with by GoZip Team

About

LLM을 이용한 매물 추천 시스템

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages