AICX: 수작업의 한계를 넘다. AI 기반 여행 상품 운영 자동화 구축기
AICX Product Engineer 김현겸 님
AICX Product Engineer 김현겸 님
AICX는 인공지능(AI)를 통해 기업 운영의 반복 업무를 자동화하고 고객 경험(CX)을 혁신하는 미션을 가진 마이리얼트립의 자회사입니다.
[AICX 바로가기]
마이리얼트립은 다양한 도시의 여행 상품을 여행자들에게 제공하고 있습니다. 하지만, 하나의 여행 상품을 만들기 위해서는 여전히 많은 부분이 사람의 수작업에 의존하고 있어 상당한 시간과 인력 리소스를 필요로 합니다.
더불어 인기 있는 도시를 중심으로 상품이 구성되다 보니, 아직 널리 알려지지 않은 도시에 대한 정보는 상대적으로 부족한 상황입니다.
AICX는 이러한 문제를 해결하고 여행자들의 여행 경험을 향상시키기 위해 “신규 도시 개발” 프로젝트를 진행하고 있습니다.
이 프로젝트를 통해 도시 단위로 여행 상품을 자동 분류•카테고리화하여 다양한 여행지를 보다 쉽고 빠르게 탐색할 수 있도록 지원하고자 합니다.
신규 도시 개발 프로젝트, 어떤 문제를 어떻게 개선하는가?
마이리얼트립에서 하나의 여행 상품이 플랫폼에 온세일되기까지는 정책 검수, 카테고리 매칭, 번역 등 여러 단계의 작업이 필요합니다.
현재 이러한 모든 과정은 담당자가 직접 판단하고 작업해야 하며, 여러 파일과 데이터를 동시에 확인해야 하는 높은 복잡도와 많은 인력 리소스를 요구합니다.
AICX는 이처럼 반복적이고 복잡한 업무를 개선하기 위해 AI 기반의 도시 개발 자동화를 목표로 프로젝트를 진행하고 있습니다.
도시 개발 자동화란,
개발할 도시를 입력하면, AI를 통해 자동으로
- 마이리얼트립의 카테고리 매칭
- 여행 상품 번역 및 검수
- 온세일을 위한 상품 등록 자동화
까지 수행하여 실제 판매 가능한 상태로 자연스럽게 이어지는 자동화 파이프라인을 의미합니다.
이를 위해 AICX는 다음과 같은 기능을 구축하고 있습니다.
- 생성형 LLM을 활용한 신규 여행 상품-카테고리 자동 매칭
- 여행 상품 번역 및 검수 작업 자동화
- 기존에 수작업으로 진행하던 상품 등록 프로세스 자동화
이러한 자동화 체계를 도입함으로써 많은 도시의 여행 상품을 빠르게 제공할 수 있게 되고, 마이리얼트립 사용자들은 기존의 인기 도시뿐 아니라 아직 널리 알려지지 않은 지역에서도 풍부한 여행 컨텐츠를 탐색하고 경험할 수 있게 됩니다.
AICX Product Engineer는 프로젝트에서 AI를 어떻게 활용했는지,
1. AI 자동화를 위한 여러 공급사 데이터 통합 모델 설계
여행 상품 자동화를 위해 가장 먼저 해결해야 했던 문제는 공급사마다 제각각 다른 데이터 구조를 통합하고 적재하는 것이었습니다.
동일한 상품 정보(ex: 가격 포함, 가격 불포함)라도 공급사마다 필드명, 구조, 제공 방식이 모두 달라, AI 파이프라인에 투입하기 위한 통합 데이터 모델 설계가 필수적이었습니다.
프로젝트 초기에는 B 공급사와 G 공급사 두 곳의 데이터만 적재했음에도 두 공급사의 데이터 형식이 크게 달랐습니다. 이를 해결하기 위해 다음과 같은 단계로 AICX 기준의 표준 데이터 모델을 설계했습니다.
① 상품 판매를 위해 무조건 필요한 필드 선출
② 공급사 데이터를 마이리얼트립 기준으로 변환(파싱)
- ex) 공급사 데이터의 위도(latitude), 경도(longitude)
→ 마이리얼트립 시스템의 도시 ID(city_id) 파싱 작업
③ GPT와 Claude Code를 활용한 스키마 분석
공급사별 스키마 문서를 사람이 모두 분석하면 많은 시간이 소요되기 때문에,
- 어떤 필드가 존재하는지
- 동일한 상품 정보를 어떤 변수명으로 제공하는지
- 상품 데이터의 구조적 차이
위 작업 과정을 GPT와 Claude Code를 활용해 분석하여 데이터 모델 설계 시간을 크게 단축할 수 있었습니다.
1–1. 대용량 데이터 적재를 위한 저장 성능 최적화
데이터 모델을 구성한 후에는, 공급사 데이터를 AICX 내부 시스템으로 자동 적재하기 위한 배치 작업이 필요했습니다. 이를 Kotlin + Spring 기반 Scheduler를 구축했습니다.
초기에는 Spring Data JPA를 사용하고 있었기 때문에, Claude Code 역시 자연스럽게 saveAll() 처리 방식을 추천했습니다. 하지만 실제로 테스트해보니 saveAll()에는 몇 가지 구조적 한계가 존재했습니다.
< JPA saveAll()의 문제점 ⚠️>
- saveAll()은 컬렉션을 한 번에 저장하는 것처럼 보이지만, 실제로는 각 객체마다 개별 쿼리를 실행하여 DB 요청이 N번 발생
- 저장할 데이터를 모두 Entity 객체로 생성해야 해서 메모리 사용량 증가
- JPA Persistence Context가 동작하며 불필요한 객체 관리 비용 발생
AI는 초안을 만들어주는 데 큰 도움이 되었지만, 대량의 데이터를 적재하는 환경에서는 JPA 기본 방식이 비효율적이라 판단했습니다.
1–2. JdbcTemplate + BatchUpdate + Upsert 방식으로 최적화
보다 효율적인 저장 방식을 찾기 위해, JdbcTemplate.batchUpdate()와 Upsert 쿼리를 조합한 방식으로 적재 구조를 재구현했습니다.
<최적화 효과 📊>
- DB Network I/O 횟수 대폭 감소 → 단일 Batch로 묶어 전송
- Entity 매핑·Persist Context 비사용 → 메모리 사용량 절감
- Upsert 적용으로 중복 데이터 자동 방지 → 운영 리스크 감소
➡️ 전체 배치 실행 시간이 2.6배 빨라짐
〈성능 테스트 결과 — 데이터 2,077건 기준〉
이러한 성능 개선을 통해 대량의 공급사 데이터를 안정적이고 빠르게 적재할 수 있는 인프라 기반을 확보했으며, 이를 통해 향후 더 많은 글로벌 공급사를 연결하고 AI 자동화 범위를 확장할 수 있는 환경을 마련하였습니다.
2. AI를 활용한 신규 상품 ↔️ 카테고리 매칭 자동화
기존에는 새로운 여행 상품이 등록될 때, 운영 담당자가 공급사 사이트의 상품 제목, 소개, 하이라이트 정보 등을 직접 확인하며 약 1,213개의 카테고리 중 적절한 항목을 골라야 했습니다.
또한, 카테고리 가이드라인도 확인해야 하는 어려움으로 많은 시간이 소모되고, 판단 기준이 사람마다 다를 수 있는 문제가 있었습니다.
위 과정을 생성형 LLM을 통해 각 상품 데이터(title, description, highlights)를 기준으로 카테고리를 자동 매칭하도록 설계했으며, AI 기반 매칭의 평균 소요 시간은 약 30~40초였습니다. 이는 기존 사람의 판단 대비 월등히 빠른 속도로 처리할 수 있었습니다.
2–1. 카테고리 매칭 품질 개선을 위한 접근 방식 비교
LLM을 통해 추천된 카테고리 중에는 정확도가 높은 경우도 있었지만, 상품 특성과 맞지 않는 애매한 결과도 존재했습니다. 이를 개선하기 위해 여러 방식의 카테고리 매칭 전략을 테스트했습니다.
① 1차 카테고리 매칭 → 2차 카테고리 매칭
먼저 상위 카테고리를 선택하고, 이후에 세부 카테고리를 매칭하는 방식입니다. 이 방식은 LLM이 처음부터 전체 구조와 세부적인 카테고리 내용을 고려하지 못하는 단점이 있었습니다.
② 2차 카테고리만으로 매칭 (제외됨)
2차 카테고리에 중복되거나 유사한 이름이 다수 존재하고 상위 카테고리와의 관계를 고려하지 않아 LLM이 혼동할 가능성이 있어 해당 방식은 테스트 단계에서 제외했습니다.
③ 1차 + 2차 카테고리 정보 통합 매칭
이 방법은 1차와 2차 카테고리를 하나의 묶음으로 함께 제공하여 LLM이 전체 카테고리 구조(= 포괄적–세부적 분류 기준) 를 동시에 고려할 수 있도록 했습니다. 이는 모델이 보다 넓은 맥락에서 상품 정보를 판단하도록 해 카테고리 매칭 정확도를 높일 수 있는 방법이었습니다.
이러한 과정을 통해서 카테고리 매칭 로직을 구현함으로써, 담당자가 방대한 카테고리 가이드라인을 직접 검토하지 않아도 되는 환경을 만들 수 있었습니다.
자동화된 카테고리 매칭은 단순히 업무 편의성을 높이는 것을 넘어, 다음과 같은 의미 있는 성과로 이어졌습니다.
- 운영 효율 향상: 대량의 신규 상품을 빠르게 카테고리 매칭
- 리소스 절약: 운영팀의 반복 업무를 줄여 보다 가치 있는 작업에 집중할 수 있도록 지원
- 일관성 보장: 일관된 기준으로 상품 분류 가능
3. AI를 활용한 상품 번역 및 정보 보완 자동화
공급사로부터 제공받는 상품 데이터는 대부분 외국어로 작성되어 있거나, 만나는 장소·시간·주의사항 등 중요한 정보가 하나의 필드에 통합되어 있는 경우가 많았습니다.
이를 해결하기 위해 생성형 LLM을 활용하여 한국어 번역, 그리고 여행자가 반드시 알아야 할 핵심 정보를 자동으로 추출하는 작업을 수행했습니다.
번역 과정은 비교적 단순하여 한국어 번역 및 말투·어조를 설정하는 최소한의 Prompt만으로도 결과를 얻을 수 있었습니다.
그러나 상품 정보 보강 작업에서는 LLM이 실제 데이터에 존재하지 않는 정보를 임의로 만들어내거나 (=Hallucination) 필요한 정보를 제대로 추출하지 못하는 문제가 있었습니다. 이를 해결하기 위해 여러 차례 Prompt 고도화 및 모델 설정 조정 작업을 진행했습니다.
3–1. LLM Hallucination 방지
① Temperature 조절을 통한 모델 추론 안정화
LLM의 답변 창의성(Temperature)을 조절하며 최적의 값을 찾아가는 작업을 진행했습니다.
- Temperature가 0.5 이상일 경우:
→ 모델이 자체적으로 정보를 추론하는 경향이 강해 Hallucination 발생률 증가 - Temperature가 너무 낮거나 0일 경우:
→ 존재하는 정보조차 추출하지 못하는 경우가 발생
여러 도시의 상품 데이터를 기반으로 테스트한 결과, 0.1 ~ 0.2 범위가 가장 안정적이라는 결론을 얻을 수 있었습니다.
② Prompt 구조화 및 규칙 명시
Temperature 조절만으로는 Hallucination을 방지하는데 부족했기에, Prompt 안에 LLM이 반드시 지켜야 하는 규칙을 명확히 작성했습니다.
예를 들어:
- 데이터에 존재하지 않는 정보는 생성하지 않는다.
- 반드시 제공된 필드 내에서만 정보를 추출한다.
와 같은 규칙을 시스템 프롬프트 내에 명시하여 Hallucination을 방지하였습니다.
3–2. 부족한 상품 정보를 채우기 위한 Prompt 고도화
마이리얼트립에서 판매 가능한 형태로 상품 정보를 관리하기 위해서는, 공급사로부터 전달되는 다양한 형태의 데이터를 구조화된 형태로 관리해야 합니다.
예를 들어, 만나는 장소, 이용 가능 시간, 주의사항, 여행 일정 등의 정보를 각각 분리해 소개함으로써, 사용자가 상품을 이해하고 구매하는 과정에서 불편함이 없도록 해야 합니다.
초기에는 “상품의 모든 정보를 바탕으로 주의사항을 추출해줘.” 와 같은 포괄적인 Prompt를 사용했습니다. 그러나 이러한 접근은 구체성이 부족해, 실제 텍스트 안에 존재하는 정보조차 추출하지 못하는 이슈가 있었습니다.
이를 개선하기 위해 Prompt를 보다 구체적이고 명확하게 명세하는 방식으로 접근했습니다.
“만나는 장소는 description 또는 additional_info 필드가 존재하는 경우 해당 필드를 탐색해서 추출해줘.”
와 같이 필드 단위로 추출 지점을 명확히 지정해 주었습니다.
구체화된 요구사항을 통해 존재하는 상품 정보를 원하는 필드에 추출하여 상품 정보를 구조화할 수 있었습니다.
Prompt 고도화 작업을 통해 팀원 간 협업에서도 구체적으로 설명해줄수록 전달력이 높아지듯이, LLM에게도 명확하게 명령을 제시할수록 성능이 향상된다는 점을 확인할 수 있었습니다.
이러한 AI 자동화 과정을 수행하면서, 단순히 LLM을 사용하는 것을 넘어 최적의 결과를 위한 모델 설정, Prompt 엔지니어링 전반을 직접 설계하고 검증해 보는 값진 경험을 얻을 수 있었습니다.
앞으로의 방향
이번 프로젝트를 통해 AI 자동화가 여행 상품 운영 프로세스를 크게 개선할 수 있음을 확인했습니다. 앞으로는 더 다양한 도시와 상품 유형에 적용할 수 있도록 모델의 정확도와 안정성을 지속적으로 고도화할 계획입니다.
또한, 카테고리 매칭·번역·상품 등록 자동화가 단일 기능에 머무르지 않고, “도시 검색(개발)”을 통해 실제 판매 가능한 형태까지 자연스럽게 이어지는 자동화 파이프라인으로 개선해 나갈 예정입니다.
이를 통해 운영 효율뿐 아니라 사용자 경험 전반에도 긍정적인 변화를 만들어내고, 나아가 마이리얼트립이 더욱 다양한 도시와 여행 기회를 제공할 수 있는 기반을 마련하고자 합니다.
마무리하며
AICX의 AI 친화적인 환경 속에서 이번 프로젝트는 개발자로서 AI와 어떻게 공존하며 성장할 수 있을지 깊이 고민하게 만든 의미 있는 경험이었습니다.
AI 덕분에 개발 속도뿐 아니라 학습과 정보 탐색 과정도 한층 효율적이 되었고, 익숙하지 않은 개발 영역에서도 빠르게 결과물을 구현해 팀원들과 공유할 수 있었습니다.
이러한 경험은 생산적인 피드백을 가능하게 해 프로젝트의 완성도를 높일 수 있었고, 동시에 제 개인적인 역량 확장에도 큰 도움이 되었습니다.
앞으로도 AICX는 기술 혁신이 고객 경험의 혁신으로 이어질 수 있도록 끊임없이 도전하고 실험하겠습니다.
감사합니다.