Reranker에 보안 티켓 언어를 학습시켜 MRR@10 41% 상승
출처: Dev.to
TL;DR
우리 SOC의 RAG 파이프라인은 142,000개가 넘는 종료된 XSOAR 보안 티켓을 검색해 조사 답변을 근거로 삼습니다. 쉬운 승리(청크화, top‑k, 재정렬 선택)를 모두 소진한 뒤에도, 올바른 과거 티켓이 5~10위에 너무 자주 나타났고, LLM이 근접하지만 정확히 맞지 않는 이웃에 답변을 근거 두는 경우가 있었습니다.
우리는 자체 데이터로 재정렬 모델을 파인튜닝했습니다. 보류된 테스트 세트(시간 기반 분할)에서:
MRR@10
BAAI/bge-reranker-v2-m3 (기성품)
0.598
24K XSOAR 쌍으로 파인튜닝
0.846
+41 % 상승. 모델 아키텍처도, 임베딩 모델도 바꾸지 않았습니다. 동일한 베이스 재정렬기에 도메인 특화 파인튜닝만 적용했습니다.
+41 %
보류된 시간 분할 테스트 세트에서 MRR@10 상승
24,213 + 10,848
양성 쌍 + 정제된 어려운 부정(클린 하드 네거티브), 클로즈‑노트에서 추출
0
명시적 관련성 라벨 수집 — 모든 신호는 기존 분석가 텍스트에서 추출
흥미로운 부분은 결과가 아니라 학습 데이터가 어디서 왔는가입니다. 우리는 한 번도 명시적인 관련성 판단을 기록하지 않았습니다. 24K 양성 쌍은 아무도 작성하도록 요구하지 않은 분석가 클로즈‑노트 안에 평범하게 숨겨져 있었습니다.
설정: 임베더 + 재정렬기, 표준 2단계 RAG
flowchart LR
Q[사용자 질의] --> E[임베더
Qwen3-Embedding-8B
4-bit DWQ]
E --> Top50[코사인 유사도 기준 Top‑50]
Top50 --> R[재정렬기**bge-reranker-v2-m3
파인튜닝**]
R --> Top5[공동 스코어링 기준 Top‑5]
Top5 --> LLM[LLM이 답변 근거]
style R fill:#1e40af,color:#fff
style E fill:#0e7490,color:#fff
style LLM fill:#065f46,color:#fff
우리 검색 파이프라인은 표준 캐스케이드입니다.
1단계 — 임베더 (바이‑인코더). Qwen3-Embedding-8B-4bit-DWQ를 vllm‑mlx로 서비스합니다. 질의를 독립적으로 인코딩하고, 코사인 유사도로 ChromaDB에서 Top‑50 후보를 끌어옵니다. 빠르지만 질의와 문서를 별도로 점수화합니다.
2단계 — 재정렬기 (크로스‑인코더). BAAI/bge-reranker-v2-m3를 Apple Silicon(MPS)에서 실행합니다. (질의, 문서) 쌍을 공동으로 어텐션하고 Top‑50을 Top‑5로 재점수화해 LLM에 전달합니다. 아이템당 느리지만 임베더 전용 랭킹보다 훨씬 정확합니다.
멘탈 모델: 임베더는 제목 유사도로 50권을 꺼내는 빠른 사서이고, 재정렬기는 실제로 각 책을 열어 질문에 대한 관련성에 따라 재배열하는 꼼꼼한 독자입니다.
bge-reranker-v2-m3 같은 기성품 재정렬기는 일반 영어 구절 검색(MS MARCO 등)으로 학습되었습니다. XSOAR 티켓을 본 적이 없고, “INBLRPRDDKNF01: ML via Cloud‑based ML” 같은 문자열이 일반 영어 의미 유사도로는 포착되지 않는다는 점을 모릅니다. 파인튜닝이 바로 그들을 가르치는 방법입니다.
학습 데이터는 어디서 왔나
크로스‑인코더 학습에는 (질의, 양성, 부정) 삼중항이 필요합니다. 우리는 명시적 관련성 라벨—클릭, 좋아요/싫어요 등—이 전혀 없었습니다. 그래서 분석가 클로즈‑노트에서 암묵적 라벨을 추출했습니다.
142,000개의 종료 티켓 안에는 분석가가 자주 쓰는 문장이 숨어 있습니다:
- “XSOAR #289008에 대해, 지역 팀이 확인했습니다…”
- “마스터 티켓 #158126을 참조하십시오.”
- “XSOAR #463428에 따라, 사용자가 확인했습니다…”
각 문장은 두 티켓 사이의 인간이 만든 연결 고리이며, 무료 관련성 라벨입니다. 우리는 이를 추출하기만 하면 됩니다.
일반화 가능한 교훈. 라벨에 비용을 쓰기 전에, 사용자가 이미 입력하고 있는 텍스트를 살펴보세요. 클로즈‑노트, 코멘트, JIRA 설명 등 자유 형식 텍스트에는 아무도 기록하도록 요구하지 않은 암묵적 관련성 판단이 가득합니다.
{: .prompt-tip }
잡음 필터링: 모든 #N 참조가 동일하지 않다
클로즈‑노트에 정규표현식을 적용해 61,500개의 #N 참조를 추출했지만, 대부분은 쓸모없었습니다.
| 풀 | 앞 문구 | 개수 | 신호 품질 |
|---|---|---|---|
| A | “Duplicate to #N” | 52,782 | 강하지만 사소함 — 동일 알림, 다른 호스트. 임베더가 이미 잡음 제거 |
| B | “XSOAR #N · Per XSOAR…” | ~3,000 | 골드 — 서로 다른 티켓 간 분석가가 만든 교차 참조 |
| — | “QRadar offense #N” | ~1,400 | 쓸모없음 — XSOAR가 아닌 다른 시스템을 참조 |
풀 A는 이미 임베더가 잘 처리하는 영역이므로 재정렬기가 별도 도움이 필요 없습니다. 풀 B가 바로 흥미로운 신호이며, “두 티켓은 관련 있지만 동일하지 않다”는 상황—재정렬기가 가치를 발휘하는 경우입니다.
정규식 필터링 후 양쪽 엔드포인트가 DB에 존재하는지 확인한 결과, 4,260개의 고유 직접 (src → tgt) 쌍을 확보했습니다.
전이적 형제(Transitive siblings)로 얻은 무료 양성 (다항 폭발 함정)
다섯 개 티켓이 동일한 마스터 티켓을 인용하면, 이 다섯 티켓은 서로도 관련이 됩니다. 이는 O(n²) 규모의 학습 쌍을 무료로 늘리는 효과가 있지만, 폭발을 억제해야 합니다.
각 마스터당 자식 티켓을 20개로 제한하고 형제 쌍을 생성했습니다. 한 번에 553개의 자식을 가진 마스터가 있었는데, 제한을 두지 않았다면 약 150,000개의 사소한 형제 쌍이 생성돼 학습 분포를 장악했을 것입니다. 규칙별로 층화 샘플링을 적용해 교차 규칙 쌍을 앞쪽에 배치함으로써 모델이 일반화 가능한 관계를 학습하도록 했습니다.
| 출처 | 개수 |
|---|---|
직접 #N 참조 | 4,260 |
| 전이적 형제(제한·층화) | 19,953 |
| 학습 준비 완료 총 양성 | 24,213 |
전이적 쌍의 72 %가 교차 규칙이었으며, 이는 제한 + 샘플링이 잘 작동했음을 보여줍니다.
일반화 가능한 교훈. 전이성(또는 기타 구조적 추론)으로 새 학습 예시를 만들 때는 밀집 클러스터에서 다항 폭발을 조심하세요. 층화 샘플링이 보통 올바른 대응책입니다.
{: .prompt-tip }
초보자들이 가장 흔히 틀리는 부분: 하드 네거티브 마이닝
네거티브는 양성만큼 중요합니다. 모델은 대비를 통해 학습하며, 무작위 네거티브는 거의 가르침이 없습니다—이미 명백히 다르기 때문이죠. 흥미로운 네거티브는 임베더가 비슷하다고 판단하지만 실제로는 관련이 없는 경우입니다. 이는 임베더가 틀리는 상황이며, 재정렬기가 이를 구분하도록 학습해야 합니다.
레시피: 각 소스 티켓에 대해 기존 임베딩 인덱스에서 Top‑50 가장 가까운 이웃을 조회합니다. 이미 알려진 양성(직접, 전이, 혹은 같은 마스터)인 경우는 제외합니다. 남은 것이 하드 네거티브—임베더는 매치라고 생각하지만 분석가는 연결하지 않은 경우입니다.
첫 실행에서 미묘한 함정을 발견했습니다: 같은 규칙의 근접 중복은 하드 네거티브가 아닙니다. INBLRPRDDKNF01: ML via Cloud‑based ML 규칙에 의해 발생한 두 티켓이 코사인 유사도 0.997을 보이면, 이는 같은 자동 탐지 규칙의 형제 알림이며, 분석가의 #N 참조가 없더라도 실제로는 관련 있습니다. 이를 네거티브로 학습시키면 모델이 실제 관련된 항목을 멀리 밀어내게 됩니다. 규칙별로 필터링해 네거티브 풀에 추가하기 전 33 % 후보를 제거했습니다.
|