jismsy commited on
Commit
b1e90d0
ยท
verified ยท
1 Parent(s): 33808c8

ko-hallucheck-v1: Korean faithfulness cross-encoder (bge-reranker-v2-m3 ft)

Browse files
Files changed (6) hide show
  1. .gitattributes +1 -0
  2. README.md +84 -0
  3. config.json +39 -0
  4. model.safetensors +3 -0
  5. tokenizer.json +3 -0
  6. tokenizer_config.json +16 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - ko
4
+ license: apache-2.0
5
+ base_model: BAAI/bge-reranker-v2-m3
6
+ pipeline_tag: text-classification
7
+ tags:
8
+ - hallucination-detection
9
+ - faithfulness
10
+ - korean
11
+ - cross-encoder
12
+ - rag
13
+ ---
14
+
15
+ # ko-hallucheck-v1 โ€” ํ•œ๊ตญ์–ด ํ™˜๊ฐ(์ถฉ์‹ค์„ฑ) ํŒ๋ณ„๊ธฐ
16
+
17
+ **(context, answer) ์Œ์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ต๋ณ€์ด ๋ฌธ๋งฅ์— ์ถฉ์‹คํ•œ์ง€(SUPPORTED) ํ™˜๊ฐ์ธ์ง€(HALLUCINATED) ํŒ๋ณ„ํ•˜๋Š” ํ•œ๊ตญ์–ด ์ „์šฉ cross-encoder์ž…๋‹ˆ๋‹ค.**
18
+ RAG ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ถœ๋ ฅ ๊ฒŒ์ดํŠธ, LLM ๋‚ฉํ’ˆ ์ธ์ˆ˜๊ฒ€์ฆ, ์ƒ์„ฑ ์ฝ˜ํ…์ธ  ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ์šฉ๋„๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
19
+
20
+ ์˜์–ด๊ถŒ์—๋Š” vectara/hallucination_evaluation_model, MiniCheck, LettuceDetect ๋“ฑ ์„ฑ์ˆ™ํ•œ ํŒ๋ณ„๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ,
21
+ ํ•œ๊ตญ์–ด ์ „์šฉ ๊ณต๊ฐœ ํŒ๋ณ„๊ธฐ๋Š” ์—†์–ด ๊ทธ ๊ณต๋ฐฑ์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
22
+
23
+ - **Base**: BAAI/bge-reranker-v2-m3 (568M, Apache-2.0) โ†’ 2-label seq-classification ํŒŒ์ธํŠœ๋‹
24
+ - **Labels**: `0 = HALLUCINATED`, `1 = SUPPORTED`
25
+ - **Max length**: 512 (context+answer, longest_first truncation)
26
+
27
+ ## ์„ฑ๋Šฅ
28
+
29
+ | ํ‰๊ฐ€์…‹ | acc | AUROC | ํ™˜๊ฐํƒ์ง€ recall (intrinsic / extrinsic) |
30
+ |---|---|---|---|
31
+ | in-dist test (์œ„ํ‚ค ๊ธฐ๋ฐ˜ ๋ฌธ์žฅํ˜•, n=1002) | 0.938 | 0.980 | 0.83 / 1.00 |
32
+ | spanํ˜• held-out (KorQuAD ์œ„ํ‚ค, n=688) | 0.988 | 0.997 | 0.99 / 1.00 |
33
+ | **cross-source OOD (KLUE-MRC ๋‰ด์Šค span, n=1500)** | **0.966** | 0.979 | 0.99 / 0.99 |
34
+
35
+ - OOD๋Š” ํ•™์Šต์— ์“ฐ์ง€ ์•Š์€ ์†Œ์Šค(๋‰ด์Šค ๋„๋ฉ”์ธ)์ด๋ฉฐ, ๊ธฐ๋ณธ ์ž„๊ณ„๊ฐ’ 0.5์—์„œ ์œ„ ์„ฑ๋Šฅ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค(๋ณ„๋„ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ถˆํ•„์š”).
36
+ - v1 ๋Œ€๋น„ ํ•ต์‹ฌ ๊ฐœ์„ : ๋ฌธ์žฅํ˜• ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ ํ•™์Šตํ•˜๋ฉด spanํ˜• ์ž…๋ ฅ์—์„œ ํŒ๋ณ„์ด ๋ถ•๊ดด(ํฌ๋งท shortcut)ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ
37
+ ๋‹คํฌ๋งท(๋ฌธ์žฅํ˜•+spanํ˜•) ํ•™์Šต์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
38
+
39
+ ## ์ •์งํ•œ ํ•œ๊ณ„ (์ฝ๊ณ  ์“ฐ์„ธ์š”)
40
+
41
+ 1. **negative(ํ™˜๊ฐ) ์ƒ˜ํ”Œ์ด LLM ์ƒ์„ฑ + ๋ฃฐ ๋ณ€ํ˜•(์ˆซ์ž/๊ฐœ์ฒด ์น˜ํ™˜, ํƒ€๋ฌธ์„œ ์ด์‹)์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.**
42
+ OOD ํ‰๊ฐ€์˜ ํ™˜๊ฐ๋„ ๊ฐ™์€ ๋ฃฐ ํŒจ๋ฐ€๋ฆฌ๋กœ ์ƒ์„ฑ๋˜์–ด, ์‹คํ™˜๊ฒฝ LLM ํ™˜๊ฐ๊ณผ ๋ถ„ํฌ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
43
+ ์‚ฌ๋žŒ ๋ผ๋ฒจ ๊ธฐ๋ฐ˜ ๋…๋ฆฝ ๋ฒค์น˜๋งˆํฌ(Ko-FaithBench)๋ฅผ ์ค€๋น„ ์ค‘์ด๋ฉฐ ๊ณต๊ฐœ ์‹œ ์—ฌ๊ธฐ์— ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
44
+ 2. ๋ฏธ๋ฌ˜ํ•œ 1๊ธ€์ž ์ˆ˜์ค€ ๋ณ€ํ˜•(intrinsic)์˜ in-dist recall์€ 0.83์œผ๋กœ, ๊ทนํžˆ ๋ฏธ์„ธํ•œ ์™œ๊ณก์€ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
45
+ 3. context 512 ํ† ํฐ ์ดˆ๊ณผ๋ถ„์€ ์ž˜๋ฆฝ๋‹ˆ๋‹ค. ๊ธด ๋ฌธ์„œ๋Š” ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ํŒ๋ณ„ํ•˜์„ธ์š”.
46
+ 4. ์‚ฌ์‹ค์„ฑ ํŒ๋ณ„์ด ์•„๋‹ˆ๋ผ **์ฃผ์–ด์ง„ context์— ๋Œ€ํ•œ ์ถฉ์‹ค์„ฑ** ํŒ๋ณ„์ž…๋‹ˆ๋‹ค. context ์ž์ฒด๊ฐ€ ํ‹€๋ฆฌ๋ฉด ์žก์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
47
+ 5. ์˜๋ฃŒยท๋ฒ•๋ฅ  ๋“ฑ ๊ณ ์œ„ํ—˜ ์šฉ๋„์—๋Š” ์‚ฌ๋žŒ ๊ฒ€ํ†  ์—†์ด ๋‹จ๋… ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.
48
+
49
+ ## ์‚ฌ์šฉ๋ฒ•
50
+
51
+ ```python
52
+ import torch
53
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
54
+
55
+ repo = "jismsy/ko-hallucheck-v1"
56
+ tok = AutoTokenizer.from_pretrained(repo)
57
+ model = AutoModelForSequenceClassification.from_pretrained(repo).eval()
58
+
59
+ context = "๋†์‹ฌ์˜ ์ฒซ ํšŒ์‚ฌ๋ช…์€ ๋กฏ๋ฐ๊ณต์—…์‚ฌ์˜€๋‹ค. 1978๋…„ ์‚ฌ๋ช…์„ ๋†์‹ฌ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค."
60
+ answer = "๋†์‹ฌ์€ 1965๋…„ ์‚ผ์–‘์‹ํ’ˆ์œผ๋กœ ์ฐฝ๋ฆฝ๋˜์—ˆ๋‹ค."
61
+
62
+ enc = tok(context, answer, truncation="longest_first", max_length=512, return_tensors="pt")
63
+ with torch.no_grad():
64
+ prob_supported = torch.softmax(model(**enc).logits, -1)[0, 1].item()
65
+ print(f"SUPPORTED ํ™•๋ฅ : {prob_supported:.3f}") # 0.5 ๋ฏธ๋งŒ โ†’ ํ™˜๊ฐ ํŒ์ •
66
+ ```
67
+
68
+ ## ํ•™์Šต ๋ฐ์ดํ„ฐ
69
+
70
+ - ํ•œ๊ตญ์–ด ์œ„ํ‚คํ”ผ๋””์•„ ๊ธฐ๋ฐ˜ ๋ฌธ์žฅํ˜• (context, answer) ~18k์Œ: LLM ์ƒ์„ฑ supported/intrinsic/extrinsic, ์ƒ˜ํ”Œ ์ˆ˜๋™ ๊ฒ€์ˆ˜(๋ผ๋ฒจ ์ •ํ™•๋„ ~90%)
71
+ - KorQuAD v1 ๊ธฐ๋ฐ˜ spanํ˜• ~5.3k์Œ: ๋ฃฐ ๊ธฐ๋ฐ˜ ์ƒ์„ฑ
72
+ - ๋ฌธ์„œ(article) ๊ทธ๋ฃน ๋‹จ์œ„ train/val/test ๋ถ„ํ• ๋กœ ๋ˆ„์ˆ˜ ์ฐจ๋‹จ
73
+ - ๋ฐ์ดํ„ฐ ์›๋ฌธ ๋ผ์ด์„ ์Šค: Korean Wikipedia(CC BY-SA), KorQuAD v1(CC BY-ND) โ€” ๋ฐ์ดํ„ฐ์…‹ ์ž์ฒด๋Š” ์žฌ๋ฐฐํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
74
+
75
+ ## Citation
76
+
77
+ ```
78
+ @misc{ko-hallucheck-2026,
79
+ title={ko-hallucheck: Korean Faithfulness / Hallucination Detection Cross-Encoder},
80
+ author={ianwoo},
81
+ year={2026},
82
+ url={https://huggingface.co/jismsy/ko-hallucheck-v1}
83
+ }
84
+ ```
config.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_cross_attention": false,
3
+ "architectures": [
4
+ "XLMRobertaForSequenceClassification"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "bos_token_id": 0,
8
+ "classifier_dropout": null,
9
+ "dtype": "float32",
10
+ "eos_token_id": 2,
11
+ "hidden_act": "gelu",
12
+ "hidden_dropout_prob": 0.1,
13
+ "hidden_size": 1024,
14
+ "initializer_range": 0.02,
15
+ "intermediate_size": 4096,
16
+ "is_decoder": false,
17
+ "layer_norm_eps": 1e-05,
18
+ "max_position_embeddings": 8194,
19
+ "model_type": "xlm-roberta",
20
+ "num_attention_heads": 16,
21
+ "num_hidden_layers": 24,
22
+ "output_past": true,
23
+ "pad_token_id": 1,
24
+ "position_embedding_type": "absolute",
25
+ "problem_type": "single_label_classification",
26
+ "tie_word_embeddings": true,
27
+ "transformers_version": "5.5.0",
28
+ "type_vocab_size": 1,
29
+ "use_cache": false,
30
+ "vocab_size": 250002,
31
+ "id2label": {
32
+ "0": "HALLUCINATED",
33
+ "1": "SUPPORTED"
34
+ },
35
+ "label2id": {
36
+ "HALLUCINATED": 0,
37
+ "SUPPORTED": 1
38
+ }
39
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3d99aae172f2ac96f8fe96f2b01b1b0dc9ce85d6fe22b69a85e303784cae7f4a
3
+ size 2271075904
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8f4ef3f81caf54d51dbbba684cfab52a71ba630b5329b24f2393a074f551539b
3
+ size 17098183
tokenizer_config.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": true,
3
+ "backend": "tokenizers",
4
+ "bos_token": "<s>",
5
+ "clean_up_tokenization_spaces": true,
6
+ "cls_token": "<s>",
7
+ "eos_token": "</s>",
8
+ "is_local": false,
9
+ "mask_token": "<mask>",
10
+ "model_max_length": 8192,
11
+ "pad_token": "<pad>",
12
+ "sep_token": "</s>",
13
+ "sp_model_kwargs": {},
14
+ "tokenizer_class": "XLMRobertaTokenizer",
15
+ "unk_token": "<unk>"
16
+ }