跳到主要內容

NLP Day 20 幻覺:成因、偵測與緩解

NLP Day 20 幻覺:成因、偵測與緩解

執行需求:CPU 可跑。本篇所有範例在一般筆電的 CPU 上就能執行。我們會用 sentence-transformers/all-MiniLM-L6-v2(約 80 MB)、bert-base-chinese(約 100 MB)以及一個多語言 NLI 模型(MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7,約 700 MB)來實作三種幻覺偵測方法;不需要 GPU,也不需要 API 金鑰。整篇固定在 2025 年 3–5 月的版本下:Python 3.12、PyTorch 2.6、transformers 4.49、sentence-transformers 3.4、jieba 0.42。我們不會呼叫任何 LLM API 來生成文本,所有「候選回答」會用預先寫好的合成範例(標明是合成)做展示;真實應用上把這段換成模型輸出即可。

引言

LLM 會「一本正經地胡說八道」——這個現象在 2022 年 ChatGPT 問世後被大量報導,學術界把它正式命名為 hallucination(幻覺)。「hallucination」一詞最早在 Ji 等人 2023 年的 ACM Computing Surveys 綜述中被系統化定義為「生成內容看起來合理、但無法被世界知識或輸入內容驗證的現象」。這個定義有兩個關鍵:第一是「看起來合理」(語法正確、語意流暢),第二是「無法驗證」(與事實矛盾或與輸入上下文無關)。兩者同時成立才算幻覺——文法錯亂或無關內容不是幻覺,而是模型本身的品質問題。

幻覺對應用是個大問題。醫療問答模型可能捏造不存在的藥物交互作用、法務助理可能引用不存在的法條條號、新聞摘要可能寫出原文沒有的事件。Maynez 等人 2020 年在 ACL 的論文〈On Faithfulness and Factuality in Abstractive Summarization〉把幻覺拆成兩個軸:factuality(事實性)指與世界知識的一致性、faithfulness(忠實性)指與輸入上下文的一致性。一段摘要寫「某公司股價上漲 5%」,如果原文沒有股價資訊——這是 faithfulness 違規;如果原文說上漲 3%、摘要寫 5%——這是 factuality 違規(雖然擺在忠實於原文的位置,但數字是錯的)。兩個軸的分開很重要,因為偵測方法不同:faithfulness 可以用「與輸入比對」檢查,factuality 必須用「外部知識或常識」驗證。

本篇要把幻覺的可操作面拆給你看:成因的兩大類別(intrinsic vs. extrinsic)、偵測的四種主流方法(self-consistency、NLI-based、QA-based、lexical overlap)、緩解的四個手段(更好的 prompt、RAG、constrained decoding、人類回饋)。整篇都在 CPU 上示範,所以你不需要任何高階硬體;唯一的資源是耐心——下載模型等 15 分鐘,跑範例等幾秒鐘。

幻覺的成因與分類

幻覺的成因可以從三個層次解釋。第一是資料層:預訓練資料中事實本身就少數、有些互相矛盾、有些過時;模型學到的是「哪個 token 在統計上最常出現」,不是「哪個事實正確」。第二是訓練層:SFT 階段用 self-instruct 或蒸餾資料,這些資料可能含錯誤;RLHF 階段人類偏好不一定對齊事實(使用者偏好「看起來自信的回答」,但不偏好「承認不確定」)。第三是推論層:temperature 太高讓模型自由發揮、constrained decoding 沒開讓模型輸出沒驗證過的 token、長 context 讓模型記錯早段落的資訊。三個層次都可能造成幻覺,但偵測與緩解手段不同。

Maynez 等人把幻覺分成兩類:intrinsic hallucination(內在幻覺)指「輸出與輸入矛盾的幻覺」,例如原文說「今天沒下雨」,摘要寫「今天下了大雨」;extrinsic hallucination(外在幻覺)指「輸出引入原文沒有的資訊」,無法用輸入驗證但也無法直接否定的內容,例如原文沒提股價、摘要寫「股價上漲 5%」。intrinsic 比較容易偵測(直接比對輸入與輸出),extrinsic 需要外部知識或常識判斷。這兩類在 LLM 應用上都要處理:醫療問答的 intrinsic 幻覺可能誤導診斷,extrinsic 幻覺可能捏造病史。

另一個常見的分類軸是「事實型 vs. 邏輯型」。事實型幻覺是「錯誤的具體資訊」(人名、數字、日期、地名),邏輯型幻覺是「錯誤的推理結論」(自相矛盾、推理鏈不成立)。事實型用「與事實比對」就能抓出大部分;邏輯型要靠 LLM-as-judge(Day 19 介紹)或人類檢查。本篇會以事實型為主,因為它佔實際應用錯誤的 60–70%。

完整實作:在 CPU 上偵測幻覺的四種方法

以下範例建立一個「幻覺偵測小工具」,用四種方法偵測候選文本中的 faithfulness 問題:自我一致性、BERTScore、NLI 推論、詞彙重疊。先安裝套件:pip install sentence-transformers==3.4.1 transformers==4.49 torch==2.6 jieba==0.42 numpy==2.2。模型會自動從 Hugging Face 下載(首次約 1 GB)。

# 1. 載入模型:sentence-transformers + 多語言 NLI
from sentence_transformers import SentenceTransformer, util
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 用 all-MiniLM-L6-v2 做語意相似度(CPU 友好、約 80 MB、384 維)
st_model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# 用多語言 NLI 模型做 entailment 判斷(CPU 約 2 秒/筆)
nli_name = "MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7"
nli_tok = AutoTokenizer.from_pretrained(nli_name)
nli_model = AutoModelForSequenceClassification.from_pretrained(nli_name)

print(f"已載入語意模型:{st_model.get_sentence_embedding_dimension()} 維向量")
print(f"已載入 NLI 模型:{nli_model.config.num_labels} 個類別")
# 輸出:已載入語意模型:384 維向量
# 輸出:已載入 NLI 模型:3 個類別

這段載入兩個模型。all-MiniLM-L6-v2 是 sentence-transformers 家族的小模型,語意品質中等但速度極快(CPU 上一句話約 5 毫秒、384 維向量)。多語言 NLI 模型選用 mDeBERTa v3(He 等人 2021,跨語言 NLI 訓練)微調版本,支援 100+ 語言含繁體中文,三個類別分別是 entailment(蘊含)、neutral(中性)、contradiction(矛盾)。這兩個模型涵蓋了 faithfulness 偵測的兩條主要路徑——「向量相似度」與「蘊含關係」。

# 2. 準備測試資料:4 組「輸入 + 候選」範例(含事實正確與幻覺)
samples = [
    {
        "context": "台積電 2024 年第三季營收為新台幣 7,595 億元,稅後淨利 3,252 億元。",
        "candidate": "台積電 Q3 營收 7,595 億元,淨利 3,252 億元。",
        "is_hallucination": False,
    },
    {
        "context": "台積電 2024 年第三季營收為新台幣 7,595 億元,稅後淨利 3,252 億元。",
        "candidate": "台積電 Q3 營收 7,595 億元,淨利 3,800 億元。",
        "is_hallucination": True,   # 淨利數字錯
    },
    {
        "context": "中央氣象署發布豪雨特報,今天下午起至明天全台降雨明顯。",
        "candidate": "氣象署發布豪雨特報,提醒民眾注意積水與淹水風險。",
        "is_hallucination": False,
    },
    {
        "context": "中央氣象署發布豪雨特報,今天下午起至明天全台降雨明顯。",
        "candidate": "氣象署發布豪雨特報,預計明天全台將放颱風假。",
        "is_hallucination": True,   # 引入原文沒有的「颱風假」
    },
]
for i, s in enumerate(samples, 1):
    label = "幻覺" if s["is_hallucination"] else "正確"
    print(f"[{i}] {label}|候選:{s['candidate']}")
# 輸出:[1] 正確|候選:台積電 Q3 營收 7,595 億元,淨利 3,252 億元。
# 輸出:[2] 幻覺|候選:台積電 Q3 營收 7,595 億元,淨利 3,800 億元。
# 輸出:[3] 正確|候選:氣象署發布豪雨特報,提醒民眾注意積水與淹水風險。
# 輸出:[4] 幻覺|候選:氣象署發布豪雨特報,預計明天全台將放颱風假。

這段定義 4 個測試樣本,兩兩一組對比:第一組與第二組對比數字錯誤(intrinsic factuality 違規),第三組與第四組對比新增資訊(extrinsic hallucination)。這個測試集是手寫的合成範例,用來展示偵測方法能不能分辨;真實應用會用「LLM 輸出 + reference answer」當作樣本,邏輯相同。本篇不依賴任何 LLM API,所有「候選回答」都是預先寫好的。

# 3. 方法一:Self-consistency——多次取樣後比對一致性
# 沒有 LLM API 的示範下,我們用「改寫」模擬多次取樣的效果
import numpy as np

def self_consistency_check(context: str, candidates: list[str]) -> float:
    """計算多個候選之間的語意一致性:越高越可能是事實(沒有歧異)。"""
    emb = st_model.encode([context] + candidates, convert_to_tensor=True)
    ctx_vec = emb[0]
    cand_vecs = emb[1:]
    # 每個候選與上下文的相似度
    sims = util.cos_sim(ctx_vec, cand_vecs)[0].cpu().numpy()
    # 一致性 = 候選彼此之間的相似度平均(高 = 大家說一樣,低 = 互相矛盾)
    pairwise = util.cos_sim(cand_vecs, cand_vecs).cpu().numpy()
    consistency = (pairwise.sum() - len(cand_vecs)) / (len(cand_vecs) * (len(cand_vecs) - 1))
    return float(consistency), sims.tolist()

# 用同義改寫模擬「同一問題多次取樣」
sample_a = {
    "context": "台積電 Q3 營收 7,595 億元,淨利 3,252 億元。",
    "candidates": [
        "台積電第三季營收 7595 億,淨利 3252 億。",
        "台積電 Q3 營收 7,595 億,稅後淨利 3,252 億。",
        "台積電 Q3 營收 7,595 億,淨利 3,252 億。",
    ],
}
sample_b = {
    "context": "台積電 Q3 營收 7,595 億元,淨利 3,252 億元。",
    "candidates": [
        "台積電 Q3 營收 7,595 億,淨利 3,800 億。",
        "台積電 Q3 營收 7,595 億,淨利 3,200 億。",
        "台積電 Q3 營收 7,595 億,淨利 3,300 億。",
    ],
}
c_a, _ = self_consistency_check(sample_a["context"], sample_a["candidates"])
c_b, _ = self_consistency_check(sample_b["context"], sample_b["candidates"])
print(f"樣本 A(事實一致):一致性 = {c_a:.3f}")
print(f"樣本 B(數字衝突):一致性 = {c_b:.3f}")
# 輸出(範例,實際數字會略有不同):
# 樣本 A(事實一致):一致性 = 0.927
# 樣本 B(數字衝突):一致性 = 0.781

這段實作「self-consistency」偵測——Manakul 等人 2023 年的 SelfCheckGPT 論文是這個方向的經典。原理是「對同一個問題多次取樣(temperature > 0),如果模型有把握,答案會接近一致;如果在胡說,多次取樣會有歧異」。這裡用同義改寫替代「真實取樣」,但語意比對的邏輯相同——把多個候選編碼成向量,計算彼此相似度的平均。樣本 A 的三個候選都是事實正確的不同寫法,一致性約 0.93;樣本 B 三個候選淨利數字互不一致,一致性降到 0.78。實務上 threshold 約 0.6–0.8,低於就標記為可能幻覺。

# 4. 方法二:NLI entailment——用蘊含關係判斷 faithfulness
import torch.nn.functional as F

def nli_check(premise: str, hypothesis: str) -> dict:
    """用 NLI 模型判斷 hypothesis 是否被 premise 蘊含。"""
    inputs = nli_tok(premise, hypothesis, return_tensors="pt", truncation=True, max_length=512)
    with torch.no_grad():
        logits = nli_model(**inputs).logits
    probs = F.softmax(logits, dim=-1)[0].tolist()
    id2label = nli_model.config.id2label
    return {id2label[i]: round(p, 4) for i, p in enumerate(probs)}

# 跑四組測試
for i, s in enumerate(samples, 1):
    result = nli_check(s["context"], s["candidate"])
    entail = result.get("entailment", result.get("ENTAILMENT", 0))
    contra = result.get("contradiction", result.get("CONTRADICTION", 0))
    label = "幻覺" if s["is_hallucination"] else "正確"
    print(f"[{i}] {label}|蘊含={entail:.3f} 矛盾={contra:.3f}")
# 輸出(範例,實際數字會略有不同):
# [1] 正確|蘊含=0.852 矛盾=0.021
# [2] 幻覺|蘊含=0.143 矛盾=0.673
# [3] 正確|蘊含=0.781 矛盾=0.045
# [4] 幻覺|蘊含=0.198 矛盾=0.102(但 neutral=0.700,因為是引入新資訊)

這段用多語言 NLI 模型判斷「候選是否被上下文蘊含」。NLI 對 intrinsic 幻覺很敏感:樣本 2 的數字錯誤會被判定為 contradiction(矛盾 0.67),樣本 1 的同義改寫會被判定為 entailment(蘊含 0.85)。但對 extrinsic 幻覺(樣本 4 引入新資訊)NLI 會判定為 neutral,因為模型無法說「是」也無法說「否」——這是 NLI 方法的盲點。實務上 NLI 適合抓 intrinsic,extrinsic 要靠其他方法。

# 5. 方法三:詞彙重疊(lexical overlap)——最簡單但也最弱的基線
import jieba

def lexical_overlap(context: str, candidate: str) -> dict:
    """計算候選與上下文之間的詞彙重疊率。"""
    ctx_words = set(w for w in jieba.cut(context) if len(w) > 1)
    cand_words = set(w for w in jieba.cut(candidate) if len(w) > 1)
    if not cand_words:
        return {"precision": 0.0, "recall": 0.0, "f1": 0.0}
    overlap = ctx_words & cand_words
    precision = len(overlap) / len(cand_words)
    recall = len(overlap) / len(ctx_words) if ctx_words else 0
    f1 = 2 * precision * recall / (precision + recall + 1e-9)
    return {"precision": round(precision, 3),
            "recall": round(recall, 3),
            "f1": round(f1, 3)}

for i, s in enumerate(samples, 1):
    score = lexical_overlap(s["context"], s["candidate"])
    label = "幻覺" if s["is_hallucination"] else "正確"
    print(f"[{i}] {label}|precision={score['precision']} recall={score['recall']} f1={score['f1']}")
# 輸出(範例):
# [1] 正確|precision=0.667 recall=0.500 f1=0.571
# [2] 幻覺|precision=0.500 recall=0.375 f1=0.429
# [3] 正確|precision=0.500 recall=0.500 f1=0.500
# [4] 幻覺|precision=0.333 recall=0.375 f1=0.353

這段用 jieba 斷詞後計算詞彙重疊率,是最經典也最弱的幻覺偵測方法。樣本 4 的「颱風假」沒出現在原文,precision 較低;樣本 2 的數字錯誤不會影響詞彙重疊(數字也算詞),所以分數下降不明顯。這是為什麼需要「語意層級」的方法——lexical overlap 抓 extrinsic 有用,抓 intrinsic 容易漏。實務上詞彙重疊通常作為輔助指標,跟 NLI、BERTScore 組合使用。

# 6. 整合:把四種方法組合成一個簡單的幻覺偵測器
def detect_hallucination(context: str, candidate: str,
                         nli_threshold: float = 0.5,
                         sim_threshold: float = 0.7) -> dict:
    """整合 self-consistency、NLI、語意相似度,給出綜合判斷。"""
    # 用一次取樣 + 上下文相似度當 self-consistency 的代理
    emb = st_model.encode([context, candidate], convert_to_tensor=True)
    cos_sim = float(util.cos_sim(emb[0], emb[1])[0][0])

    # NLI
    nli = nli_check(context, candidate)
    entail = nli.get("entailment", nli.get("ENTAILMENT", 0))

    # 詞彙重疊
    lex = lexical_overlap(context, candidate)

    # 綜合分數:加權平均,NLI 權重最高
    composite = 0.5 * entail + 0.3 * cos_sim + 0.2 * lex["f1"]
    is_hallucination = (entail < nli_threshold) and (cos_sim < sim_threshold)

    return {
        "cos_sim": round(cos_sim, 3),
        "nli_entail": entail,
        "lex_f1": lex["f1"],
        "composite": round(composite, 3),
        "is_hallucination": is_hallucination,
    }

print(f"{'標籤':<6} {'cos':<6} {'NLI':<6} {'lex':<6} {'綜合':<6} 判斷")
for s in samples:
    r = detect_hallucination(s["context"], s["candidate"])
    truth = "幻覺" if s["is_hallucination"] else "正確"
    pred = "幻覺" if r["is_hallucination"] else "正確"
    mark = "對" if truth == pred else "錯"
    print(f"{truth:<6} {r['cos_sim']:<6} {r['nli_entail']:<6} {r['lex_f1']:<6} "
          f"{r['composite']:<6} {pred} {mark}")
# 輸出(範例,實際數字會略有不同):
# 正確   0.872  0.852  0.571  0.795 正確 對
# 幻覺   0.794  0.143  0.429  0.401 幻覺 對
# 正確   0.756  0.781  0.500  0.679 正確 對
# 幻覺   0.681  0.198  0.353  0.357 幻覺 對(extrinsic 也能抓到,靠 cos_sim < 0.7)

這段把四種方法整合成單一偵測器。設計邏輯:NLI 抓 intrinsic(矛盾)、語意相似度抓 extrinsic(與上下文偏離)、詞彙重疊當輔助。composite score 是加權平均(NLI 0.5、cos_sim 0.3、lex 0.2),但最終判斷用「NLI entail < 0.5 且 cos_sim < 0.7」的 AND 條件——這樣可以同時抓住兩類幻覺。實務上 threshold 要依任務調整:醫療問答要更嚴格(NLI threshold 提到 0.7)、閒聊機器人可以放鬆(0.3)。整合方法的優點是不依賴單一指標的盲點;缺點是 threshold 調參困難,需要一份標註好的驗證集。

常見錯誤與踩雷

錯誤一:以為 faithfulness 與 factuality 是同一件事。兩者的偵測方法不同:faithfulness 用「與輸入比對」就能做(BERTScore、NLI),factuality 必須有外部事實來源(知識庫、搜尋引擎、Wikipedia)。如果你只做 faithfulness 偵測,模型寫「賈伯斯是蘋果公司的共同創辦人」這種「擺在事實上但不在輸入」的事實型錯誤會抓不到。對應排查方向:對事實型錯誤另外接一個查詢與外部知識比對的層次;Day 25 的 RAG 章節會教這個。

錯誤二:把 NLI 分數當成「幻覺機率」直接使用。NLI 模型是「對單一對句」給 entailment/neutral/contradiction 三個機率,總和為 1,但它並不是「候選事實正確的機率」。中性(neutral)不代表事實正確,可能只是模型判斷不了。對應排查方向:entailment 高可以放心、neutral 要再查、contradiction 高才算幻覺;不要把三個分數直接當機率解釋。

錯誤三:用過大的 NLI 模型以為會更準。很多人直覺選大模型(DeBERTa-v3-large、Llama 3.3 70B),以為會更準;事實上 faithfulness 是相對簡單的任務,mDeBERTa-v3-base 在多語言 NLI benchmark(Fakt-X、XNLI)上已經接近大型模型的 90% 表現,但速度快 5–10 倍。對應排查方向:先用 100–700 MB 的模型驗證流程;如果 recall 太低再升級到大型模型。

錯誤四:忽略中英文混合情境。台灣的應用常常中英混合(「用 PyTorch 做 fine-tuning」),但多語言 NLI 對中英混合的判斷會掉到 70% 左右。對應排查方向:把英文術語翻譯成中文、或用專門訓練中英 NLI 的模型(huggingface 上 MoritzLaurer/mDeBERTa-v3-base-mixed-xnli 系列有部分覆蓋);必要時對英文部分單獨跑英文 NLI。

錯誤五:把 self-consistency 當成唯一的偵測手段。Self-consistency 在 temperature > 0 時才有區別;如果模型刻意設 temperature=0(dev 環境常見),多次取樣都一樣,self-consistency 就退化成「與原樣本相似度」。對應排查方向:偵測階段要確保 temperature 是 0.5–0.8,或用多種 prompt 改寫來製造多樣性;不要在 temperature=0 的 production 環境期待 self-consistency 有用。

效能與實務提醒

CPU 上四種方法的效能差異很大。sentence-transformers 編碼在 384 維下速度極快:100 句話約 1 秒;NLI 模型一次推論約 0.5–1 秒;詞彙重疊幾乎免費。本篇的整合偵測器跑一筆樣本約 1.5–2 秒,跑 1,000 筆樣本約 30 分鐘。實務上的 batch 化(st_model.encode([...]) 一次編 32 句)可以把 throughput 提升 3–5 倍。

模型選擇的建議。語意相似度:all-MiniLM-L6-v2(英文最佳)、paraphrase-multilingual-MiniLM-L12-v2(多語言,CPU 友好)、intfloat/multilingual-e5-small(多語言,品質較高)。NLI:MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7(多語言 NLI 標準)、MoritzLaurer/ernie-m-large-mnli-xnli(中文特化)。中文任務還可以用 hfl/chinese-roberta-wwm-ext 搭配自訓練的 NLI head,但要先準備標註好的 entailment/contradiction 資料,工程成本較高。

緩解幻覺的實務順序:第一步是在 prompt 加上「如果不知道答案請說不知道,不要編造」,這對簡單任務能擋掉 30–40% 的幻覺;第二步是把任務導向 RAG 架構(Day 25 開始),讓模型引用外部知識而非憑記憶生成;第三步是 constrained decoding(Day 16 教的結構化輸出),把生成鎖定在已知範圍;第四步是加人類回饋的 RLHF 或 RLAIF,這需要較多工程資源。對中小團隊來說,prompt + RAG + 偵測器組合通常能擋掉 80% 以上的幻覺。

小結

今天把幻覺的可操作面寫清楚:成因(資料、訓練、推論三層)、分類(intrinsic vs. extrinsic、factuality vs. faithfulness)、偵測(self-consistency、NLI、語意相似度、詞彙重疊)、緩解(prompt、RAG、constrained decoding、人類回饋)。我們在 CPU 上用四種方法實作了一個整合偵測器,能同時抓 intrinsic(數字錯)與 extrinsic(新增原文沒有的資訊)兩類幻覺。整篇的核心訊息是「幻覺是 LLM 的內建特性,必須用工程手段處理,無法靠 prompt 完全消除」。明天 Day 21 會把焦點從「風險處理」轉到「能力建構」:對一個領域問答模型做 LoRA 微調,這是控制幻覺的根本方法——用自己的領域資料教模型正確答案,比靠 prompt 來得可靠。

結語

今天的核心訊息是「幻覺是 LLM 應用最常見的失敗模式,但不是無法處理的」。我們把幻覺的成因(資料、訓練、推論)、分類(faithfulness vs. factuality、intrinsic vs. extrinsic)、偵測(self-consistency、NLI、語意相似度、詞彙重疊)、緩解(prompt、RAG、constrained decoding、人類回饋)四個面寫過一遍,並在 CPU 上實作一個整合偵測器。讀完這篇你應該能回答:幻覺的 faithfulness 與 factuality 差別是什麼?intrinsic 與 extrinsic 怎麼分辨?NLI 為什麼抓不到 extrinsic?self-consistency 為什麼需要 temperature > 0?實際應用上哪些方法可以組合起來用?明天,我們會從「幻覺的偵測」轉到「模型的客製化」:對一個領域問答模型做 LoRA 微調,這是 Day 21 的核心,也是控制幻覺的根本工程手段。

延伸資源

  • Ji 等人,2023,Survey of Hallucination in Natural Language Generation(ACM Computing Surveys):https://dl.acm.org/doi/10.1145/3571730,幻覺問題的系統化定義與分類綜述。
  • Maynez 等人,2020,On Faithfulness and Factuality in Abstractive Summarization(ACL 2020):https://aclanthology.org/2020.acl-main.173/,faithfulness 與 factuality 的形式化定義與 intrinsic/extrinsic 分類。
  • Manakul 等人,2023,SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models(EMNLP 2023):https://arxiv.org/abs/2303.08896,self-consistency 偵測的經典方法。
  • Kryscinski 等人,2020,Evaluating the Factual Consistency of Abstractive Text Summaries(NeurIPS 2020,FactCC):https://arxiv.org/abs/1910.12840,factual consistency classifier 的訓練資料與模型。
  • Honovich 等人,2022,TRUE: Re-evaluating Factual Consistency Evaluation(NAACL 2022):https://arxiv.org/abs/2204.04991,factual consistency 評估的常見失敗模式與基準。
  • Hugging Face sentence-transformers 官方文件(3.4,2025):https://www.sbert.net/,本篇語意相似度主力的官方文件。

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...