← Work
Live2025 · Solo Builder· Started(First Commit date)
Jira AI Duplicate Detector
Jira 이슈의 제목·본문을 임베딩으로 비교해 중복 후보 쌍을 찾아주는 Python CLI - 엑셀 리포트와 사용량·비용 통계까지.
- Python
- CLI
- OpenAI
- Jira
Setup
- Problem
QA 백로그엔 같은 이슈가 다른 표현으로 여러 번 등록된다. 사람이 일일이 훑어 중복을 찾는 비용은 백로그가 커질수록·사람이 늘수록 커지고, 대개 그냥 방치된다.
- Context
실무에서 겪은 "중복 이슈" 문제를 자동화하려고 만든 Python CLI. 새 이슈를 만들지 않고 기존 이슈들만 비교해 중복 후보 쌍을 뽑는다.
- Users
이슈가 쌓인 QA·제품 백로그를 운영하는 팀, 그리고 "보이지 않는 중복 비용"을 진단해 보여줘야 하는 QA 컨설팅 상황.
Build
- What I did
- Jira API로 이슈를 대량 조회(JQL,
MAX_ISSUES기본 50)하고 [UI] 같은 키워드 이슈는 제외 - 제목 + 본문을 OpenAI text-embedding-ada-002로 임베딩, 코사인 유사도로 중복 후보 쌍 산출
- 임베딩을 캐시(
issue_embeddings_cache.json)해 재실행 비용 절감 - 결과를 콘솔·로그·Excel(.xlsx)로 출력하고, 비교 쌍 수·API 호출·토큰·예상 비용까지 함께 리포트
- Jira API로 이슈를 대량 조회(JQL,
- Product decisions
- 새 이슈를 만들지 않고 기존 이슈만 비교 - 진단 도구는 백로그를 어지럽히지 않아야 한다
- 문자열 매칭이 아니라 임베딩 - 중복은 대개 단어가 아니라 뜻이 겹치므로 "같은 의미의 다른 표현"까지 잡는다
- 임베딩을 캐시해 비용을 낮게 - 대량 비교에서도 센트 단위라 "한 번 돌려보는" 진입 장벽을 없앴다
- 사용량·비용을 결과에 같이 출력 - 자동화 자체의 비용이 투명해야 도입 판단이 선다
- QA considerations
- 유사도 임계값의 precision/recall - 임계값을 낮추면 오탐(무관 쌍), 높이면 진짜 중복을 놓치는 트레이드오프를 어디에 두는가
- 오탐 비용 - 중복 아닌 쌍을 중복이라 말하면 사람 리뷰 시간을 되레 늘리므로 그 비용을 인지했는가
- 임베딩 캐시(
issue_embeddings_cache.json)가 이슈 본문 변경 시에도 낡은 벡터로 오판하지 않는가 - 새 이슈를 만들지 않고 기존만 비교 - 진단 도구가 백로그를 어지럽히지 않는가(부작용 없음)
- JQL 대량 조회 경계 -
MAX_ISSUES(기본 50)에 걸린 백로그에서 비교 대상이 조용히 잘려 중복을 놓치지 않는가 - 결과에 함께 찍는 사용량·비용(API 호출·토큰·예상 비용)이 실제 소비와 어긋나지 않아 도입 판단의 근거로 믿을 수 있는가
Outcome
- Metrics
실무 필요로 만든 개인 CLI(Python 한 덩어리). 대량 비교에서도 임베딩 비용이 1센트 안팎. 실 팀 도입 지표는 미집계.
- Retrospective
- 유사도 임계값을 config에 박아 둔 게 한계 - 프로젝트마다 "중복"의 기준이 달라서, 임계값·키워드 제외를 CLI 옵션으로 빼는 걸 다음 과제로 남겨뒀다.
- Tech stack
- Python
- OpenAI Embeddings