LLM을 활용한 집 추천 시스템
대전광역시와 KAIST가 주최하고, KAIST 총학생회 산하 특별기구 SPARCS가 주관하는 해커톤인 SPARCS Service Hackathon 2024에 참가했습니다.
수요일부터 금요일까지 2박 3일 동안 진행하며, 주제는 ‘지역 사회 문제 해결’이고, 데이터 분석 및 시각화 과제는 ‘대전광역시의 특징이나 문제점 발굴하기’이었습니다.
이때 우리 팀은 대전에 상태가 좋은 빈집이 많다는 것을 데이터 분석을 통해 알아냈고, 그 집을 활용해 청년 가구 유입을 기대할 수 있을 것이라고 생각했습니다. 일단 한번 살아보고, 그 과정에서 많은 것을 지원해 준다면 계속 살게 될 것이라고 생각해서 서비스 이름을 “살아봐유”라고 정했습니다.
해커톤 기간 동안 엘리스에서 GPU 클라우드를 지원해 줘서, llm을 활용한 추천 시스템을 만들어볼 수 있는 좋은 기회였습니다. 대전에 있는 매물을 모두 크롤링 해서, gemini pro로 라벨링 한 후 llama2를 학습시켜 사용자가 입력한 정보를 바탕으로 집을 추천해 주고, 그 이유를 설명해 주는 모델을 제작했습니다.
이전에 논문으로만 봤던 작업을 직접 해보면서 NLP에 대한 이해를 높일 수 있었고, 이 경험을 바탕으로 더 고도화된 추천 시스템을 만들 수 있겠다는 자신감도 생겼습니다.
모델 제작 과정에 대해 정리한 글 입니다.
추천 시스템 구조
사용자에게 추천해줄 때 기본적으로 다음과 같은 정보를 입력받습니다.
- person_count : (1명, 2명, 3명, 4명 이상)
- period : (1주, 2주, 3주, 4주 이상)
- identity : (학생, 직장인, 기타)
- car : (자차, 대중교통)
- child : (아이 있음, 아이 없음)
- significant: (사용자가 직접 입력한 내용)
총 3단계로 이루어져 추천이 진행됩니다.
- 데이터 필터링으로 데이터의 갯수를 줄입니다.
- 아이가 있다. → walkTime 10분 이하
- 차가 있다. → aptParkingCountPerHousehold > 0
2. 데이터 유사도 계산
- TF-IDF를 활용한 코사인 유사도를 계산해 데이터의 정보와 사용자가 원하는 정보에 대한 데이터에 순위를 계산합니다.
3. LLM을 활용해 XAI(eXplainable AI) 추천
- 유사도로 계산한 상위 데이터를 바탕으로 데이터의 추천 순위 및 그 이유를 생성합니다.
데이터 크롤링
우선 네이버 지도에서 대전 광역시의 주택 정보를 크롤링 해옵니다. 링크
{"aptName": "대전센트럴자이1단지", "tradeBuildingTypeCode": "APT", "aptHeatMethodTypeName": "개별난방", "aptHeatFuelTypeName": "도시가스", "aptParkingCountPerHousehold": "1.43", "aptHouseholdCount": "874", "exposureAddress": "대전시 중구 대흥동", "monthlyManagementCost": 180000, "articleFeatureDescription": "주방넓은구조로 이사협의 가능.", "detailDescription": "대흥초,대전중,대전고,대전여중,성모여고 최고의 학군이며\r\n도보로 중앙로역 5분거리입니다.\r\n또한 먹자골목 5분거리라 살기 너무 좋아요.\r\n대흥2구역재개발(kcc건설) 호재로 인해 투자가치 상당히 높습니다.\r\n자세한 상담은 자이 부동산(042-221-3003) 으로 언제든지 \r\n편하게 연락주세요!!", "floorLayerName": "단층", "principalUse": "공동주택", "tagList": ["15년이내", "방세개", "화장실두개", "세대당1대"], "schoolName": "대전대흥초등학교", "organizationType": "공립", "establishmentYmd": "19380702", "walkTime": 4, "studentCountPerTeacher": 16.7, "id": 2817, "url": "https://new.land.naver.com/complexes/103255?ms=36.322262,127.42776,17&a=APT:OBYG:PRE&e=RETAIL", "image_url": "https://landthumb-phinf.pstatic.net//20200525_259/apt_realimage_1590371141039Aun5e_JPEG/1865cbce9afe5320953dcbbfb29f0db0.JPG"}
약 2900개의 데이터를 수집했습니다.
데이터 전처리 및 라벨링
서비스에 필요한 모델의 입력과 출력은 다음과 같습니다.
- 입력: 사용자의 정보 + 후보 데이터셋 3개
- 출력: 후보 데이터셋 3개에 대한 순위 및 이유
사용에 필요한 퍼소나를 가상으로 생성하고 gemeni-pro로 예상되는 결과값을 라벨링합니다. 링크
후보 데이터셋 정보
{"aptName": "경남아너스빌1단지", "articleFeatureDescription": "올확장 풀옵션의 조용하고 조망좋은 최고급아파트", "tagList": ["25년이내", "1층", "대형평수", "방네개이상"], "walkTime": 7, "studentCountPerTeacher": 16.2, "aptParkingCountPerHousehold": "2.42"}
- aptName: 집 이름
- articleFeatureDescription: 기본적인 설명 + 관계자가 쓴 글 (100자 이내로 슬라이싱)
- tagList: 키워드 정보
- walkTime: 학교까지의 거리
- studentCountPerTeacher: 교사당 학생수
- aptParkingCountPerHousehold: 가구당 주자 자리 수
walkTime와 studentCountPerTeacher는 아이가 있는 가구에 중요한 정보, aptParkingCountPerHousehold는 차가 있는 가구에 중요한 정보입니다.
사용자가 입력한 특이 사항과 코사인 유사도를 계산할 때 articleFeatureDescription를 사용합니다.
모델 학습
라벨링한 데이터로 beomi/open-llama-2-ko-7b 모델을 활용해 파인튜닝을 해줍니다. 지원받은 엘리스 클라우드의 GPU VRAM은 40GB정도지만, 학습시킬 데이터의 길이가 길기 때문에 양자화를 진행하여 학습을 진행합니다. 링크
persona = {
"person_count": "3명 이상",
"period": "한달 이상",
"identity": "직장인",
"car": "차 없음",
"child": "아이 없음",
"significant": "주변에 공원이 있었으면 좋겠어"
}
이렇게 입력시 다음과 같은 결과물을 추천해줍니다.
[
[
"효동현대",
"소라",
"e편한세상대전법동"
],
[
"효동현대는 남향으로 올리모델링이 완료되어 깨끗하고 쾌적한 주거 환경을 제공합니다. 또한, 주변에 공원이 있어 자연을 즐길 수 있으며, 주변에 초등학교와 중학교가 있어 자녀 교육에 편리합니다.",
"소라는 남향으로 완전 리모델링이 완료되어 깨끗하고 편안한 주거 환경을 제공합니다. 또한, 초등학교와 오정공원이 가까워 아이들과 산책하기 좋습니다.",
"e편한세상대전법동은 대단지 아파트로 주변 환경이 안정적이며, 주변에 중리시장이 있어 생활이 편리합니다. 또한, 전면이 탁트이고 아름다운 공원이 있어 자연을 즐길 수 있습니다."
]
]
활용 예시
이번 기회를 통해서 llm을 활용하는 추천 시스템에 대해 많은 관심을 가질 수 있었습니다. 많은 논문들을 참고하여 새로운 형태의 추천 시스템에 대해 공부해 봐야겠다고 생각했습니다.