Déjà vu, but billable
데자뷔를 다시 겪는 데도 비용이 듭니다
CaseJog는 수리 기술자가 과거 작업 기록에서 현재 증상과 비슷한 사례를 찾도록 돕는 로컬 검색 도구입니다. 작성자는 기기 필터와 오류 코드 일치 점수를 결합한 검색이 순수 코사인 유사도보다 28개 증상 평가에서 높은 precision@k를 보였다고 보고합니다.
- 주제
에디터 노트
28개 증상 평가에서 기기 필터와 오류 코드 점수를 결합한 검색이 순수 코사인 기준선보다 높은 수치를 냈고, 전자레인지 예시도 검색 단계에서 기기를 제한해야 하는 이유를 구체적으로 보여줍니다. 다만 표본이 작고 재평가도 한 번이라 성능 차이를 넓은 수리 기록에 일반화하기는 어렵습니다. 기록을 클라우드로 보내지 않는다는 제품 설명과 MongoDB Atlas를 쓰는 검색 구조 사이의 배포 경계는 본문에서 충분히 분명하지 않습니다. 로컬 임베딩과 연결 오류 시 메모리 검색은 제시됐지만, 실제 설치에서 사례 데이터가 어디에 저장되고 Atlas 없이 어떤 기능이 남는지까지는 설명하지 않습니다. 따라서 검색 설계의 근거와 로컬 운영 주장은 각각 따로 확인할 지점으로 남습니다.
AI 요약
CaseJog는 독립 가전 수리 기술자가 자신의 과거 작업 기록을 의미 검색으로 다시 찾는 도구입니다. 증상을 입력하고 현재 수리 중인 기기를 고르면 원인, 부품, 작업 시간, 가격과 출처 사례를 순위별로 보여줍니다. 결과는 과거 기록을 찾아주는 용도로 제한하며, 새 고장을 진단하거나 수리 방법을 생성하지 않습니다. 작성자는 가상의 기술자 사례를 실제 사용 후기처럼 제시하지 않았다고 밝힙니다.
기기 필터가 바꾼 검색 결과
전자레인지 문이 잠기지 않는다는 증상으로 비교한 예에서 순수 코사인 유사도는 세탁기 도어 잠금 사례 다섯 건을 상위에 올렸습니다. 세탁기 사례에 비슷한 표현이 더 많이 들어 있어 의미 점수만으로는 기기 종류를 구분하지 못했습니다. 기기 필터를 벡터 검색 단계에 결합한 filtered-hybrid 검색은 전자레인지 도어 스위치 인터록 사례 다섯 건을 반환했고, 각 결과에 사례 ID와 날짜, 수리 가격을 붙였습니다. 정상 상태 검색 시간은 72ms이며, 서비스가 쉬었다가 다시 시작된 뒤 첫 요청에는 모델 로딩 시간이 추가됩니다.
냉장고 증상과 오류 코드 5E를 함께 입력한 예에서는 벡터 유사도에 정확한 오류 코드 일치 점수 0.150을 더했습니다. 작성자는 이 방식으로 표현이 비슷하지만 원인이 다른 사례보다 코드가 일치하는 사례를 위로 올린다고 설명합니다.
구현과 평가
임베딩은 BAAI/bge-small-en-v1.5를 fastembed와 ONNX를 사용해 CPU에서 로컬로 실행합니다. MongoDB Atlas Vector Search가 검색 후보를 찾고, Python 코드가 기기 메타데이터 필터와 오류 코드 및 최근성 점수를 반영해 순위를 다시 매깁니다. 임베딩 모델은 환경 변수 EMBED_MODEL로 교체하도록 구성했습니다. MongoDB 연결 오류가 나면 메모리 기반 코사인 검색으로 전환하며, 실제 버그까지 감추지 않도록 전환 조건을 연결 오류로 한정했습니다. 결과 카드에는 확인 가능한 원본 사례를 연결하고, 생성형 모델은 답변 경로에 넣지 않았습니다.
작성자는 코퍼스에 없는 표현으로 만든 증상 28개를 한 번 평가했습니다. precision@1은 filtered-hybrid 0.893, 순수 코사인 기준선 0.857이었습니다. precision@3은 각각 0.869와 0.738, precision@5는 0.814와 0.657이었습니다. 평가 문구가 코퍼스 표현과 겹쳐 결과가 약 0.96까지 부풀려졌던 첫 평가를 폐기하고, 표현을 다시 준비해 한 차례 재실행했다고 설명합니다. 표본이 28개뿐이므로 통계적 유의성을 주장하지 않는다고도 덧붙입니다.
설계 한계
CaseJog는 과거 기록과 가까운 사례를 보여줄 뿐, 처음 겪는 고장에도 가장 가까운 옛 사례를 반환할 수 있습니다. 따라서 기술자가 사례를 열어 직접 확인하는 단계가 설계에 포함됩니다. 작성자는 후보별 신뢰도를 판단하는 2B 모델도 시험했지만, CPU에서 쌍마다 약 20초가 걸렸고 오답을 자신 있게 표시했으며 확률처럼 보이는 값 두 개도 내놓아 제외했다고 밝혔습니다.
원문: dev.to / 번역·요약: Trawling