器實(shí)踐:難點(diǎn)不在模型,而在數(shù)據(jù)與評(píng)估)
Aletheias Quest 是我折騰過的一個(gè) AI 應(yīng)用項(xiàng)目目標(biāo)很直白用大模型和多媒體分析做一個(gè)“謊言檢測(cè)器”。一輪完整回顧做下來我的核心判斷是這個(gè)方向的難點(diǎn)根本不在模型選型也不在算力而在數(shù)據(jù)、評(píng)估和倫理邊界。下面這部分內(nèi)容寫給正在做 AI 應(yīng)用開發(fā)、想嘗試多模態(tài)分類、或者準(zhǔn)備把大模型接進(jìn)訪談分析、內(nèi)容審核、客服質(zhì)檢這類場(chǎng)景的人。我會(huì)按實(shí)際推進(jìn)順序展開先做文本再做語音和表情最后聊評(píng)估和邊界。如果你期待的是“準(zhǔn)確率 95% 的測(cè)謊神器”可以現(xiàn)在關(guān)掉頁面。這個(gè)方向上不存在那樣的產(chǎn)品硬做一個(gè)出來的效果大概率接近拋硬幣。1. 先定義清楚謊言檢測(cè)器到底在檢測(cè)什么1.1 謊言不是一個(gè)可以直接標(biāo)注的變量很多項(xiàng)目一開始就犯同一個(gè)錯(cuò)誤把“說謊”當(dāng)做一個(gè)普通分類標(biāo)簽給數(shù)據(jù)打 0/1然后丟進(jìn)模型訓(xùn)練。問題在于“說謊”是一個(gè)潛在狀態(tài)沒有直接可見的信號(hào)。我們能拿到的只有文本、語音、面部動(dòng)作、生理反應(yīng)這些外在觀測(cè)值。說謊的人可能心跳加速被冤枉的人也會(huì)心跳加速編造的故事可能細(xì)節(jié)豐富真實(shí)經(jīng)歷也可能被講得干巴巴。所以模型學(xué)的并不是“是否說謊”而是“這些特征與訓(xùn)練樣本里說謊標(biāo)簽的相關(guān)性”。這個(gè)區(qū)別決定了整個(gè)系統(tǒng)的輸出形式。正確的做法是借鑒司法心理學(xué)里已有的方法比如真實(shí)性監(jiān)控和標(biāo)準(zhǔn)內(nèi)容分析把陳述拆成“是否有感官細(xì)節(jié)”“是否有時(shí)間空間信息”“是否邏輯一致”“是否有回避”等維度再基于維度給出結(jié)論。這比直接輸出一個(gè)“l(fā)iar”要科學(xué)得多也更容易向用戶解釋。1.2 不同模態(tài)能提供什么信號(hào)我一開始也想直接上多模態(tài)后來發(fā)現(xiàn)每個(gè)模態(tài)的數(shù)據(jù)管線、出錯(cuò)方式和評(píng)估標(biāo)準(zhǔn)都不一樣必須拆開設(shè)計(jì)。下面是我整理過的一張對(duì)比表基本決定了我后面每一步的優(yōu)先級(jí)模態(tài)獲取難度可用特征可靠性落地成本文本低內(nèi)容矛盾、細(xì)節(jié)量、回避話術(shù)、時(shí)態(tài)一致性中低語音中停頓長度、語速、音高、能量中低中面部/視頻高動(dòng)作單元、注視方向、頭部姿態(tài)低到中高生理信號(hào)很高皮電、心率、瞳孔中僅限實(shí)驗(yàn)室很高這張表的核心判斷是不同模態(tài)的可靠性差異很大。尤其要提醒一點(diǎn)很多商用工具天天宣傳微表情識(shí)別但微表情在受控實(shí)驗(yàn)里都不穩(wěn)定放到真實(shí)攝像頭、弱光、遮擋、低幀率的條件下基本當(dāng)不了決策依據(jù)。所以我在項(xiàng)目里把視頻和生理信號(hào)都放在“實(shí)驗(yàn)室可選”的位置產(chǎn)品主線始終是文本。2. 踩得最深的一個(gè)坑沒有標(biāo)準(zhǔn)答案就沒有訓(xùn)練目標(biāo)2.1 真實(shí)謊言數(shù)據(jù)為什么難拿做謊言檢測(cè)最核心的原料是“確定某人說了謊”的標(biāo)注數(shù)據(jù)。但真實(shí)世界里謊言的確定非常困難。法庭宣判一個(gè)人敗訴不代表他說謊伴侶承認(rèn)出軌但之前的否認(rèn)才是謊言而這個(gè)“否認(rèn)”通常沒有錄音。公開研究里常用的數(shù)據(jù)來源大致有幾種模擬犯罪場(chǎng)景讓被試假裝偷東西再接受詢問、招募被試講真話和編造自述、法庭或新聞發(fā)布會(huì)的公開陳述。每種數(shù)據(jù)都有明顯的分布偏差模擬犯罪的謊言風(fēng)險(xiǎn)低被試沒有真實(shí)壓力法庭陳述又混雜了法律策略和律師指導(dǎo)。我自己做過一次粗糙的樣本統(tǒng)計(jì)數(shù)量不大只用來判斷方向公開可用的謊言文本數(shù)據(jù)絕大多數(shù)屬于“低風(fēng)險(xiǎn)、被指示、表演性質(zhì)”的謊言。用這種數(shù)據(jù)訓(xùn)練出來的模型學(xué)到的是“人們?cè)诒硌菡f謊時(shí)的文本模式”而不是“人在真實(shí)壓力下試圖欺騙時(shí)的模式”。這兩者的特征分布可能完全不同。2.2 低風(fēng)險(xiǎn)表演謊言會(huì)把模型帶偏這個(gè)問題在學(xué)術(shù)里叫標(biāo)簽構(gòu)造偏差。你讓被試“請(qǐng)編一個(gè)假期故事我們會(huì)通過攝像頭看你”被試知道這是實(shí)驗(yàn)沒有真實(shí)后果撒謊時(shí)的動(dòng)機(jī)、情緒、策略都不一樣。更要命的是很多數(shù)據(jù)集的標(biāo)簽只有“真/假”沒有細(xì)化到“這句話內(nèi)部的哪個(gè)事實(shí)是假的”。結(jié)果模型只能學(xué)到整體分布差異一旦輸入換一個(gè)場(chǎng)景準(zhǔn)確率立刻掉下來。所以后來我不再追求“真實(shí)大謊言數(shù)據(jù)集”那個(gè)東西短期拿不到。我換了一個(gè)思路不檢測(cè)“這個(gè)人是否在撒謊”而是檢測(cè)“這句話是否與可驗(yàn)證事實(shí)矛盾”。這是一個(gè)窄得多的任務(wù)但它有明確的監(jiān)督信號(hào)比如已知事實(shí)庫、時(shí)間線、合同條款、客服工單記錄。有了這些我就可以標(biāo)注“矛盾/一致/無法驗(yàn)證”三類模型的目標(biāo)變得可定義評(píng)估也變得可重復(fù)。2.3 我建議的最小數(shù)據(jù)驗(yàn)證方案給同樣被困在數(shù)據(jù)問題里的人一個(gè)最小方案把任務(wù)限定在一個(gè)具體場(chǎng)景例如“客服對(duì)話中用戶對(duì)訂單狀態(tài)的描述是否與系統(tǒng)記錄一致”。準(zhǔn)備 100 到 200 條對(duì)話樣本只標(biāo)三類一致、矛盾、無法驗(yàn)證。先不微調(diào)直接用大模型做零樣本提示看基線表現(xiàn)。人工抽查 20 條錯(cuò)誤樣本找到模型最常見的失敗模式再?zèng)Q定是改提示詞、加檢索還是微調(diào)。這個(gè)方案的核心是“收窄任務(wù)”。不要在第一個(gè)版本就做通用測(cè)謊通用測(cè)謊沒有監(jiān)督信號(hào)做出來只能靠感覺。注意先跑 20 條小樣本再上全量主要看輸出格式是否穩(wěn)定而不是看準(zhǔn)確率。3. 第一版原型從文本和結(jié)構(gòu)化輸出開始3.1 為什么先做文本原因有三條。第一文本是最容易標(biāo)準(zhǔn)化的輸入不需要考慮攝像頭、麥克風(fēng)、采樣率、光照第二大模型對(duì)文本矛盾、回避、含糊的表達(dá)非常敏感零樣本能力已經(jīng)夠做一個(gè)不錯(cuò)的基線第三實(shí)際場(chǎng)景里文本最通用無論是聊天記錄、訪談轉(zhuǎn)寫還是客服工單都是文本。語音和視頻想好了可以往管道里加但不會(huì)影響核心流程。順帶說一個(gè)觀察現(xiàn)在檢測(cè)“AI 生成文本”已經(jīng)不算難因?yàn)樯善鲿?huì)留下統(tǒng)計(jì)痕跡但檢測(cè)人類謊言幾乎沒有任何穩(wěn)定的“謊言痕跡”。文本里能用的更多是“事實(shí)核驗(yàn)”和“陳述邏輯”而不是夸大語言特征的作用。3.2 從“判斷真假”改成“提取可驗(yàn)證聲明”第一版提示詞我寫得非常簡單直接問“這個(gè)人是不是在撒謊”。后來發(fā)現(xiàn)輸出很不穩(wěn)定同一個(gè)問題換個(gè)說法答案就變。原因是大模型對(duì)“撒謊”這種抽象判斷沒有統(tǒng)一標(biāo)準(zhǔn)它會(huì)在“可能是”“基本是”“不是”之間隨機(jī)漂移。我改成讓模型先做結(jié)構(gòu)化提取不給整體判斷。具體來說從每一段回答里抽取出若干“可驗(yàn)證聲明”每個(gè)聲明對(duì)應(yīng)一個(gè)事實(shí)狀態(tài)最后再匯總。這樣模型的任務(wù)從“主觀定案”變成了“抽出證據(jù)”哪一步錯(cuò)了都能溯源。3.3 提示詞模板參考下面是我后來一直在用的提示詞結(jié)構(gòu)你可以復(fù)制改寫成自己的場(chǎng)景。這里刻意做了泛化沒有綁定任何具體業(yè)務(wù)你是一位陳述分析助手。你的任務(wù)不是判斷對(duì)方是否說謊而是對(duì)一段陳述做結(jié)構(gòu)化拆解。 請(qǐng)完成以下步驟 1. 提取陳述中所有“可驗(yàn)證的事實(shí)聲明”例如時(shí)間、地點(diǎn)、金額、動(dòng)作、狀態(tài)、因果推斷。 2. 對(duì)每個(gè)聲明結(jié)合給定的背景事實(shí)或知識(shí)基線給出狀態(tài) - supported與背景事實(shí)一致 - refuted與背景事實(shí)矛盾 - unverifiable無法從背景事實(shí)或常識(shí)判斷 3. 單獨(dú)標(biāo)注“回避”現(xiàn)象例如直接跳過問題、使用過于寬泛的表述、轉(zhuǎn)移話題。 4. 輸出 JSON不要輸出額外解釋。 請(qǐng)確保每個(gè)聲明的狀態(tài)都有依據(jù)寧可給 unverifiable也不要強(qiáng)行判斷。這個(gè)提示詞的關(guān)鍵點(diǎn)有三個(gè)把“整體真假”換成“逐條聲明”給三種狀態(tài)而不是兩種明確要求寧可無法驗(yàn)證也不要強(qiáng)行判斷。這樣的輸出才能被下游規(guī)則引擎和人工復(fù)核使用。3.4 輸出怎么用置信度、第三狀態(tài)和閾值模型給出 JSON 之后我在業(yè)務(wù)層加了一層規(guī)則而不是直接信任模型的 token 概率。具體做法把溫度設(shè)為 0同一輸入跑 3 到 5 次觀察關(guān)鍵字段是否穩(wěn)定。自洽性比單次輸出重要。當(dāng)出現(xiàn) refuted 聲明時(shí)才算“高風(fēng)險(xiǎn)信號(hào)”只有 unverifiable 不算只能算“需要更多信息”。最終展示給用戶的不可能是“ta 在說謊”而是“這些聲明與已知事實(shí)矛盾……”。是否升級(jí)為人工復(fù)核由業(yè)務(wù)規(guī)則決定。這樣做的理由是大模型的置信度不可靠但它提取出的具體聲明可以被人快速核對(duì)。系統(tǒng)越往后做越像一個(gè)“證據(jù)整理器”而不是測(cè)謊儀。4. 第二版探索語音、面部和生理信號(hào)哪些能用4.1 語音停頓和音高只能做輔助信號(hào)我第二版加了語音特征用通用的音頻特征提取工具處理訪談錄音得到停頓時(shí)長、語速、音高變化和能量包絡(luò)再和文本特征拼在一起。初步結(jié)論是語音信號(hào)在“問答輪次”粒度上能提供一點(diǎn)輔助信息但在“單句”粒度上噪聲非常大。一個(gè)人語速突然變慢可能是因?yàn)榫o張也可能是因?yàn)樘鞖饫?、信?hào)差、或者剛才沒聽清問題。語音情緒識(shí)別在干凈數(shù)據(jù)上表現(xiàn)尚可一旦錄音里混著背景音樂、多人說話、電話壓縮失真特征就亂了。另外一個(gè)現(xiàn)實(shí)問題是疲勞和個(gè)體差異。有人撒謊時(shí)音高上升有人撒謊時(shí)反而壓低聲線同一套規(guī)則換個(gè)人就可能失效。所以我把語音的輸出質(zhì)量定成“可以支持優(yōu)先級(jí)排序不能單獨(dú)定案”。4.2 面部動(dòng)作和“微表情”沒那么可靠面部這一塊我也試過。用開源工具提取動(dòng)作單元和注視方向然后看哪些動(dòng)作單元在真假陳述里出現(xiàn)頻率更高。結(jié)果比較讓人清醒在有遮擋、光線不均、頭部轉(zhuǎn)動(dòng)的視頻里動(dòng)作單元的提取本身就會(huì)大規(guī)模出錯(cuò)最典型的是把皺眉識(shí)別成挑眉、把瞇眼識(shí)別成閉眼。微表情那條路更麻煩真正的微表情持續(xù)只有幾幀普通視頻的幀率和壓縮率根本捕捉不到。如果一定要用視頻信息我建議把它當(dāng)作“行為描述”而不是“說謊指標(biāo)”。比如記錄這段回答里注視偏移了幾次、雙手有沒有頻繁觸碰面部這些描述可以提高人工復(fù)核的效率但不能自動(dòng)給人下結(jié)論。4.3 生理信號(hào)實(shí)驗(yàn)室里的效果工程場(chǎng)景難復(fù)制最后是皮電、心率、瞳孔這類生理信號(hào)。研究文獻(xiàn)里它們和“喚醒度”確實(shí)相關(guān)但喚醒度不等于欺騙。一個(gè)被冤枉的申請(qǐng)者在被追問時(shí)心跳也可以很高。而且生理信號(hào)需要穿戴設(shè)備或?qū)S脭z像頭需要靜息基線需要控制環(huán)境噪音這些條件在真實(shí)業(yè)務(wù)里幾乎不具備。我做了一版?zhèn)鞲衅髟秃蠓艞壛司€上化只在受控的訪談實(shí)驗(yàn)里繼續(xù)收集數(shù)據(jù)。綜合看多模態(tài)的正確打開方式不是我一開始想的那種“所有信號(hào)一起上”而是“文本做主判決語音和視頻做排序生理信號(hào)做實(shí)驗(yàn)室研究”。每加一個(gè)模態(tài)都要先回答一個(gè)問題這個(gè)信號(hào)的噪聲會(huì)不會(huì)把原本就模糊的判斷變得更模糊5. 評(píng)估是整個(gè)項(xiàng)目的分水嶺5.1 準(zhǔn)確率在兩分類任務(wù)里最容易騙人第一個(gè)模型我報(bào)過 85% 的準(zhǔn)確率后來發(fā)現(xiàn)沒意義。因?yàn)樵u(píng)估集里真話樣本占了大頭模型只要一直輸出“真話”準(zhǔn)確率就能到 80% 以上。真正要看的是混淆矩陣哪些真的謊言被漏掉了哪些真話被誤判成謊言。在謊言檢測(cè)這種場(chǎng)景里誤判真話的代價(jià)往往比漏掉謊言更大所以精確率通常比召回率更優(yōu)先至少在“避免冤枉人”的方向上是這樣。如果你的業(yè)務(wù)目標(biāo)是“不冤枉人”就應(yīng)該把精確率做高允許召回率低一點(diǎn)如果目標(biāo)是“不放過可疑點(diǎn)”才需要把召回率提上去但這樣用戶會(huì)收到大量虛假警報(bào)。沒有先想清楚業(yè)務(wù)代價(jià)就直接調(diào)模型等于閉著眼睛開車。5.2 低基率下的數(shù)學(xué)一個(gè)必須知道的例子這里給一個(gè)簡單的貝葉斯計(jì)算不涉及具體模型只說明問題。假設(shè)場(chǎng)景里有 10% 的人真的在撒謊模型對(duì)謊言的檢出率有 90%對(duì)真話的正確率也有 90%也就是誤報(bào)率 10%。那么當(dāng)模型說“這個(gè)人在撒謊”時(shí)實(shí)際為假的概率是多少# 假設(shè) 1000 人 liars 100 # 10% 真的在撒謊 truth_tellers 900 # 90% 說的是真話 # 模型表現(xiàn) detected_liars liars * 0.9 # 90 個(gè)被正確抓住 false_alarms truth_tellers * 0.1 # 90 個(gè)真話被誤判 # 模型報(bào)警后真的在撒謊的概率 precision detected_liars / (detected_liars false_alarms) print(precision) # 0.5看到?jīng)]有即使一個(gè)模型看起來已經(jīng)很不錯(cuò)報(bào)警里也有一半是冤枉人的。低基率場(chǎng)景下的分類器就是這種數(shù)學(xué)現(xiàn)實(shí)。所以工程上不能只看建模指標(biāo)還要看業(yè)務(wù)閾值怎么設(shè)以及報(bào)警后的復(fù)核流程怎么走。這個(gè)例子說明在低基率場(chǎng)景里模型本身的精度遠(yuǎn)沒有“閾值 復(fù)核流程”重要。5.3 校準(zhǔn)和人工復(fù)核我的做法是給系統(tǒng)加了三檔輸出無法判斷、需要更多信息、存在矛盾。只有最后一種才允許觸發(fā)“優(yōu)先級(jí)高”的標(biāo)記而且所有自動(dòng)標(biāo)記都必須落到人工復(fù)核界面。復(fù)核人員能看到原始陳述、被提取的聲明、以及判定狀態(tài)的依據(jù)。同時(shí)我把每次提示詞輸入和模型輸出都存到日志里定期抽一批日志做校準(zhǔn)看模型說“refuted”的時(shí)候人工復(fù)核同意的比例是多少。這個(gè)比例才是系統(tǒng)真正該追求的核心指標(biāo)而不是訓(xùn)練集上的準(zhǔn)確率。6. 倫理邊界這個(gè)系統(tǒng)不能變成一把失控的尺子6.1 錯(cuò)誤成本是不對(duì)稱的謊言檢測(cè)最危險(xiǎn)的地方是錯(cuò)誤成本不對(duì)稱。如果系統(tǒng)把一句真話判成謊言輕則讓一個(gè)人失去面試機(jī)會(huì)重則讓一個(gè)人被長期懷疑反過來系統(tǒng)漏掉一句謊言雖然也可能造成損失但至少不會(huì)直接傷害一個(gè)無辜的人。所以在設(shè)計(jì)上我堅(jiān)持“誤報(bào)優(yōu)先避免”。這不是技術(shù)決策而是產(chǎn)品決策。任何把“有風(fēng)險(xiǎn)”說成“確定在撒謊”的界面都是把判斷責(zé)任推給了模型。如果這個(gè)系統(tǒng)用在招聘、客服質(zhì)檢、投訴處理這些場(chǎng)景還要額外考慮被分析的人知不知道自己的語音、文本正在被分析。很多“AI 測(cè)謊”宣傳都沒提這個(gè)前提這是有問題的。6.2 隱私、同意和記錄