CoolFace
Modelpublic

1T/wt-kure-insurance-v1

sourceHugging Facemitupdated 4d agoView on Hugging Face
0likes15downloads
Model Card

wt-kure-insurance-v1

긴 문서 인덱싱용 한국어 보험 도메인 임베딩 LoRA 어댑터. 256 ~ 7,500 토큰을 한 모델로 처리합니다.

개요

nlpai-lab/KURE-v1 (bge-m3 backbone, 568M, 1024-dim, max_seq 8,192) 에 LoRA 어댑터를 붙였습니다. 짧은 청크만 잘 되는 게 아니라 긴 청크일수록 base 및 상용 API 와의 격차가 벌어지도록 학습한 점이 핵심입니다 (7,500 토큰 Recall@1 에서 base +22.2pp, OpenAI text-embedding-3-large +59.5pp). 같은 코퍼스를 짧은 청크(정밀 검색)와 긴 청크(맥락 보존)로 동시에 인덱싱하는 multi-resolution 전략을 단일 모델로 커버하는 용도입니다.

Basenlpai-lab/KURE-v1 (bge-m3, 568M, 1024-dim, max_seq 8,192)
AdapterLoRA r=16, alpha=32, target Q/K/V/dense
Trainable params7,110,656 (base 대비 1.24%) · 어댑터 28.5 MB
LossMultipleNegativesRankingLoss, temperature 0.05, in-batch + mined hard negative 4
학습 데이터비공개 보험 도메인 문서 437건 → 4-resolution 청크 15,500개 → 합성 query 46,500건 (3/청크) → hard negative 8/query mining → 상품 단위 split (train 40,344 / eval 5,397 / out-of-domain test 759)
Curriculumepoch 1 short-heavy (256 토큰 50%) → epoch 3 long-heavy (7,500 토큰 50%)
학습H100 80GB × 1, bf16 + gradient checkpointing, peak VRAM 18.6 GB, 15h 21m (3 epoch)

벤치마크

길이별 도메인 retrieval — Recall@1 (비공개 평가셋)

resolution**본 모델**base KURE-v1OpenAI 3-largevs basevs OpenAI
256 tok96.32%93.23%89.73%+3.09pp+6.60pp
1,024 tok94.77%88.45%76.51%+6.31pp+18.26pp
4,096 tok82.06%65.16%37.02%+16.90pp+45.04pp
7,500 tok77.74%55.59%18.22%+22.15pp+59.52pp

유의성은 paired permutation test + Bonferroni 보정으로 확인했습니다 (OpenAI 대비 14승 2무 0패).

평가 코퍼스가 실서비스 (200K+ 청크) 보다 작아 절대 수치는 inflated 입니다. 모델 간 상대 격차는 동일 조건이라 공정합니다. OpenAI 3-large 는 4,096/7,500 토큰 입력에서 8,192 token 한계를 피하려 6,000자로 cap 했습니다 (한국어 cl100k_base 기준 약 5.5~6.5K 토큰). 평가 데이터는 비공개라 재현 불가 — 공개 검증은 아래 KorSTS 를 보세요.

일반 한국어 (KorSTS, 519 sentence pair · 공개 데이터)

보험 특화 학습으로 일반 성능이 깎였는지 보는 forgetting probe 입니다.

모델Spearman
본 모델0.8766
base KURE-v10.8774 (−0.07pp)
OpenAI 3-large0.8234
e5-small-ko + LoRA (384-dim)0.7996

base 대비 −0.07pp. forgetting 없습니다.

Latency (per query)

환경seq=128seq=1,024seq=4,096seq=7,500
H100 80GB, bf16 (추정, train profile 기반)~3 ms~13 ms~52 ms~124 ms
Apple M-series CPU (실측, batch=2)108 ms517 ms2,488 ms6,805 ms

568M 모델이라 CPU 는 긴 seq 에서 비현실적입니다. GPU 를 쓰세요. 어댑터를 base 에 병합하면 base 와 동일한 latency 로 서빙됩니다 (PEFT inference mode 는 짧은 seq 에서 3~20% 오버헤드).

Quick Start

bash
pip install sentence-transformers peft
python
from peft import PeftModel
from sentence_transformers import SentenceTransformer

m = SentenceTransformer("nlpai-lab/KURE-v1", device="cuda")
m[0].auto_model = PeftModel.from_pretrained(m[0].auto_model, "1T/wt-kure-insurance-v1")

q = m.encode(["보험료 분할 납입 가능한가요?"], normalize_embeddings=True)
p = m.encode(["보험료는 일시납을 원칙으로 하되 필요시 분할 영수 가능합니다.",
              "보험금 청구권의 소멸시효는 3년입니다.",
              "오늘 점심 뭐 먹을까"], normalize_embeddings=True)
print(q.shape, (q @ p.T).round(3))   # (1, 1024) [[0.73 0.038 0.178]]

query prefix 는 필요 없습니다 (bge-m3 계열). 대조 학습으로 cosine 절대값 분포가 base 와 다르므로 임계값은 재캘리브레이션하세요.

vLLM (--task embed) 등 어댑터를 직접 못 읽는 런타임은 병합해서 쓰세요.

python
m[0].auto_model = m[0].auto_model.merge_and_unload()
m.save("wt-kure-insurance-v1-merged")

한계

  • —1024-dim · 568M 이라 CPU 단독 운영에는 무겁습니다. 짧은 질의 위주면 1T/wt-e5-small-ko-insurance-v1 (384-dim, CPU 13 ms) 쪽이 맞습니다.
  • —학습 query 가 LLM 합성이라 실제 사용자 발화 분포와 완전히 같지는 않습니다.
  • —어댑터만 배포합니다. tokenizer · pooling 설정은 base 를 그대로 씁니다.

인용

bibtex
@misc{wt-kure-insurance-v1,
  title  = {wt-kure-insurance-v1: a long-context Korean insurance-domain retrieval LoRA for KURE-v1},
  author = {Kim, Wontae},
  year   = {2026},
  url    = {https://huggingface.co/1T/wt-kure-insurance-v1}
}

라이선스 · 고지

어댑터 MIT (base 라이선스 승계). base nlpai-lab/KURE-v1 MIT, 그 backbone BAAI/bge-m3 MIT. 도메인 학습 데이터는 비공개이며 본 repo 에 포함되지 않습니다.