測(cè)與可觀測(cè)實(shí)戰(zhàn)(2):golden dataset 構(gòu)建:線上數(shù)據(jù)的采樣與標(biāo)注流程)
問(wèn)題背景上一篇用兩組模擬數(shù)據(jù)說(shuō)明了一把太小的尺子如何讓 47% 的正確結(jié)論被判反結(jié)論是評(píng)測(cè)集必須存在、規(guī)模要按可分辨差距倒推。這一篇解決尺子上的刻度從哪來(lái)一個(gè)跑了三個(gè)月的客服 RAG 機(jī)器人日志里躺著八萬(wàn)多條真實(shí)會(huì)話怎么從中提煉出三百來(lái)?xiàng)l能代表線上真實(shí)分布、標(biāo)注質(zhì)量可復(fù)核的金標(biāo)準(zhǔn)數(shù)據(jù)集golden dataset。直接照抄線上問(wèn)題會(huì)踩兩個(gè)坑一是頭部意圖吃掉八成流量隨機(jī)抽出來(lái)評(píng)測(cè)集全是退款多久到賬越界拒答、多輪追問(wèn)這些恰恰最容易出事故的長(zhǎng)尾一條沒(méi)有二是線上原話本身是臟的——錯(cuò)別字、半截話、夾帶訂單號(hào)的隱私串不清洗不能用。本篇把整條流水線拆成四段分層采樣、隱私脫敏、近重復(fù)去重、雙人標(biāo)注加一致性仲裁每段給出可操作的判據(jù)。核心原理**采樣的第一原則是按業(yè)務(wù)意圖分層而不是按流量均勻。**均勻隨機(jī)抽樣的方差與層內(nèi)樣本量成反比而流量分布天然頭重腳輕占比 3% 的多輪追問(wèn)意圖在 300 條均勻樣本里平均只有 9 條單這一層的通過(guò)率估計(jì)誤差就逼近 ±30 個(gè)百分點(diǎn)——等于這層沒(méi)測(cè)。工程解法是帶下限的分層抽樣stratified sampling with floor大層按流量占比分配配額小層強(qiáng)制保底比如每層不少于 25 條代價(jià)是評(píng)測(cè)集分布與線上分布有意的偏離收益是每層都有最低可用分辨率。要注意這個(gè)偏離必須在報(bào)告里寫(xiě)明分層評(píng)測(cè)的總分不再是線上期望表現(xiàn)的無(wú)偏估計(jì)它是各層分?jǐn)?shù)的加權(quán)平均權(quán)重由你聲明而不是流量決定。**標(biāo)注對(duì)象不是正確答案而是判分合同。**golden dataset 里每條用例的真正資產(chǎn)是它的評(píng)分契約參考回答要點(diǎn)必須出現(xiàn)哪些事實(shí)、負(fù)向約束出現(xiàn)哪些內(nèi)容直接判錯(cuò)比如承諾具體到賬日期、以及分類標(biāo)簽該條屬于哪個(gè)意圖、難度、是否含陷阱。三個(gè)人獨(dú)立對(duì)同一批 50 條寫(xiě)要點(diǎn)交集部分就是可自動(dòng)化的硬規(guī)則差集部分暴露的是需求理解分歧——標(biāo)注流程順帶產(chǎn)出的這份分歧清單往往比數(shù)據(jù)集本身更有價(jià)值。**一致性用雙標(biāo) 仲裁閉環(huán)控制。**每條用例至少兩人獨(dú)立標(biāo)注不一致的進(jìn)仲裁批次級(jí)別跟蹤標(biāo)注者間一致性下一篇會(huì)用 Cohen’s kappa 給出算法。經(jīng)驗(yàn)閾值原始一致率低于 80% 的批次整批返工因?yàn)檫@說(shuō)明標(biāo)注指南本身有洞修補(bǔ)指南比返工標(biāo)注便宜。**去重要發(fā)生在標(biāo)注之前。**近重復(fù)問(wèn)題“退款多久到賬與退款大概幾天能到呢”不僅浪費(fèi)標(biāo)注預(yù)算還會(huì)讓評(píng)測(cè)集對(duì)某個(gè)高頻措辭隱性過(guò)采樣。字符級(jí) n-gram 的 Jaccard 相似度在中文短query上簡(jiǎn)單有效閾值 0.8 上下能把同一政策的換皮問(wèn)法并進(jìn)一個(gè)簇每簇只標(biāo)一條。實(shí)驗(yàn)一分層抽樣 vs 均勻隨機(jī)長(zhǎng)尾層的分辨率差多少本機(jī)以確定性模擬演示采樣機(jī)制固定種子生產(chǎn)用真實(shí)日志與抽樣腳本。importrandom INTENTS{policy_qa:0.42,# 售后政策問(wèn)答order_query:0.28,# 訂單/物流查詢complaint:0.12,# 投訴安撫chitchat:0.09,# 閑聊跑題edge_reject:0.06,# 應(yīng)拒答的越界問(wèn)題multiturn_followup:0.03,# 多輪追問(wèn)改寫(xiě)}FLOOR25# 每層最低樣本量(小意圖保底)TARGET300# 評(píng)測(cè)集目標(biāo)規(guī)模pool[]rngrandom.Random(7)forintent,shareinINTENTS.items():for_inrange(int(5000*share)):pool.append((intent,q_%s_%04d%(intent,len(pool))))defstratified(pool,target,floor,seed):rngrandom.Random(seed)by_intent{}foriteminpool:by_intent.setdefault(item[0],[]).append(item)picked[]forintent,itemsinsorted(by_intent.items()):quotamax(floor,round(target*len(items)/len(pool)))pickedrng.sample(items,min(quota,len(items)))returnpickeddefnaive(pool,target,seed):rngrandom.Random(seed)returnrng.sample(pool,target)stratstratified(pool,TARGET,FLOOR,seed11)naive_setnaive(pool,TARGET,seed11)defdist(sample):c{}forintent,_insample:c[intent]c.get(intent,0)1returncprint(意圖 | 線上占比 | 分層抽樣 | 均勻隨機(jī)抽樣)ds,dndist(strat),dist(naive_set)forintent,shareinINTENTS.items():print(%-20s | %6.1f%% | %7d | %7d%(intent,share*100,ds.get(intent,0),dn.get(intent,0)))print(分層抽樣總數(shù) %d, 均勻隨機(jī)總數(shù) %d%(len(strat),len(naive_set)))運(yùn)行輸出意圖 | 線上占比 | 分層抽樣 | 均勻隨機(jī)抽樣 policy_qa | 42.0% | 126 | 139 order_query | 28.0% | 84 | 75 complaint | 12.0% | 36 | 40 chitchat | 9.0% | 27 | 19 edge_reject | 6.0% | 25 | 17 multiturn_followup | 3.0% | 25 | 10 分層抽樣總數(shù) 323, 均勻隨機(jī)總數(shù) 300對(duì)比最后兩行均勻隨機(jī)下多輪追問(wèn)層只有 10 條上一篇的置信區(qū)間表告訴我們這個(gè)規(guī)模的通過(guò)率半寬超過(guò) ±28 個(gè)百分點(diǎn)純屬裝飾越界拒答層 17 條同樣不夠看分層保底后兩層各 25 條總數(shù)只多花 23 條預(yù)算長(zhǎng)尾分辨率卻從不存在變成可用。另一個(gè)細(xì)節(jié)是總數(shù) 323 300下限配額會(huì)讓總量微超目標(biāo)工程上接受這個(gè)超支或者從最大層里扣回——但絕不為湊整數(shù)砍掉小層。實(shí)驗(yàn)二標(biāo)注前去重把同一政策的換皮問(wèn)法并進(jìn)一簇importrandom BASE_QUERIES[七天無(wú)理由退貨怎么操作,退款多久能到賬,訂單什么時(shí)候發(fā)貨,發(fā)票開(kāi)錯(cuò)了能重開(kāi)嗎,會(huì)員積分怎么兌換,跨境商品支持退換貨嗎,商品價(jià)格保價(jià)規(guī)則是什么,客服人工電話是多少,]SUFFIXES[,呢,啊,急,謝謝,麻煩告訴我,在線等]rngrandom.Random(5)candidates[]forqinBASE_QUERIES:candidates.append(q)forsuffixinrng.sample(SUFFIXES,3):mutatedqsuffixifrng.random()0.4:# 再抖掉一兩個(gè)字制造臟變體posrng.randrange(len(mutated)-1)mutatedmutated[:pos]mutated[pos1:]candidates.append(mutated)extrarng.randrange(len(BASE_QUERIES))# 另一主題的干凈樣本candidates.append(BASE_QUERIES[extra][:-2])defshingles(s,k3):return{s[i:ik]foriinrange(max(len(s)-k1,1))}defjaccard(a,b):returnlen(ab)/len(a|b)if(a|b)else0.0threshold0.8clusters[]# 每簇保留第一個(gè)成員作為代表shingle_cache[shingles(q)forqincandidates]foridx,qinenumerate(candidates):placedFalseforclusterinclusters:ifjaccard(shingle_cache[cluster[0]],shingle_cache[idx])threshold:cluster.append(idx)placedTruebreakifnotplaced:clusters.append([idx])kept[clusters[c][0]forcinrange(len(clusters))]print(候選 %d 條 - 去重后保留 %d 條(閾值 Jaccard%.1f)%(len(candidates),len(kept),threshold))sizessorted((len(c)forcinclusters),reverseTrue)print(簇大小分布 Top5:,sizes[:5])print(示例簇(代表 | 被合并的近似重復(fù)):)biggestmax(clusters,keylen)print( 保留:,candidates[biggest[0]])forminbiggest[1:]:print( 合并:,candidates[m])運(yùn)行輸出候選 40 條 - 去重后保留 27 條(閾值 Jaccard0.8) 簇大小分布 Top5: [4, 3, 3, 2, 2] 示例簇(代表 | 被合并的近似重復(fù)): 保留: 跨境商品支持退換貨嗎 合并: 跨境商品支持退換貨嗎啊 合并: 跨境商品支持退換貨嗎呢 合并: 跨境商品支持退換貨嗎謝40 條候選壓成 27 條三成預(yù)算省下來(lái)了更重要的是簇大小分布本身就是流量結(jié)構(gòu)的信息——跨境退換貨聚成 4 條簇說(shuō)明該政策有歧義、用戶變著法問(wèn)這反而是提示該層要加權(quán)采樣的信號(hào)。兩點(diǎn)實(shí)操提醒真實(shí)日志里 Jaccard 閾值建議從 0.8 起調(diào)人工抽檢 50 個(gè)合并決策再定中文短文本對(duì) 3-gram 敏感0.7 以下開(kāi)始誤傷同主題不同意圖的問(wèn)句數(shù)據(jù)量上萬(wàn)后逐對(duì)比較是平方復(fù)雜度換 MinHash 或倒排塊blocking做候選對(duì)生成。流水線落地四步第一步導(dǎo)出與脫敏先于行日志落地評(píng)測(cè)工作區(qū)之前過(guò)一遍正則加實(shí)體識(shí)別手機(jī)號(hào)、地址、訂單號(hào)一律替換為保留格式的假值138****0001這類脫敏規(guī)則本身要 review——“幫我查訂單 20240713xxxx里的日期串經(jīng)常被漏掉但它能關(guān)聯(lián)到真人。第二步分層配額表評(píng)審業(yè)務(wù)方、標(biāo)注方、算法方對(duì)每張意圖層的配額和目標(biāo)占比簽字避免出分后爭(zhēng)論為什么閑聊占一成”。第三步標(biāo)注平臺(tái)留痕跡每條用例記錄標(biāo)注人、時(shí)長(zhǎng)、修改輪次純秒標(biāo)與十分鐘標(biāo)的可信度不是一個(gè)量級(jí)事后質(zhì)檢按這個(gè)元數(shù)據(jù)抽查。第四步季度滾動(dòng)更新每季度從線上新意圖里補(bǔ) 20% 新樣本、同時(shí)把過(guò)時(shí)的樣本降級(jí)為歸檔可見(jiàn)、不進(jìn)總分防止評(píng)測(cè)集老化成2024 年的互聯(lián)網(wǎng)。常見(jiàn)陷阱其一標(biāo)注指南用形容詞“回答有幫助沒(méi)有可操作性指南必須寫(xiě)成若回答包含 X 且未包含 Y 則判通過(guò)級(jí)別。其二讓最懂業(yè)務(wù)的人單干標(biāo)注專家標(biāo)注最準(zhǔn)但單點(diǎn)不可復(fù)核、進(jìn)度是瓶頸且專家腦中的標(biāo)準(zhǔn)沒(méi)寫(xiě)進(jìn)指南就永遠(yuǎn)是黑箱——雙標(biāo)的意義一半在質(zhì)量一半在逼專家把知識(shí)外化。其三評(píng)測(cè)集里保留隱私原話以便還原現(xiàn)場(chǎng)”金標(biāo)準(zhǔn)數(shù)據(jù)集會(huì)被很多工具和很多人訪問(wèn)脫不干凈的樣本直接不進(jìn)集。其四把失敗案例只修不存處理完一個(gè)線上投訴就刪掉現(xiàn)場(chǎng)等于每個(gè) bug 只付一次學(xué)費(fèi)正確動(dòng)作是清洗后進(jìn)評(píng)測(cè)集。其五去重用力過(guò)猛把支持退換貨嗎與退換貨要多久并成一簇兩個(gè)意圖被一個(gè)合并決策吃掉所以合并必須抽檢。落地清單按意圖分層設(shè)配額并給小層保底≥25 條報(bào)告里聲明加權(quán)方式全量脫敏先于一切規(guī)則評(píng)審覆蓋能關(guān)聯(lián)到真人的組合字段每條用例寫(xiě)判分合同必含要點(diǎn) 負(fù)向約束 意圖/難度標(biāo)簽雙人獨(dú)立標(biāo)注批次一致率 80% 整批返工并修指南標(biāo)注前 n-gram Jaccard 去重0.8 起步人工抽檢合并決策季度補(bǔ)樣 20%線上壞案例清洗后入集數(shù)據(jù)集有了接下來(lái)的瓶頸立刻轉(zhuǎn)移到打分三百條用例每次變更都跑一遍誰(shuí)來(lái)判每一條的好壞人判太快就糙、太準(zhǔn)就貴。下一篇《LLM Ops 評(píng)測(cè)與可觀測(cè)實(shí)戰(zhàn)3自動(dòng)打分規(guī)則評(píng)分、LLM-as-judge 與一致性校驗(yàn)》給出三層打分器架構(gòu)以及怎么證明你的自動(dòng)打分器不是在瞎打分。參考來(lái)源WikipediaStratified samplinghttps://en.wikipedia.org/wiki/Stratified_samplingWikipediaJaccard indexhttps://en.wikipedia.org/wiki/Jaccard_indexWikipediaMinHashhttps://en.wikipedia.org/wiki/MinHashWikipediaInter-rater reliabilityhttps://en.wikipedia.org/wiki/Inter-rater_reliabilityLangSmith 評(píng)測(cè)與數(shù)據(jù)集文檔https://docs.smith.langchain.com/