據(jù)源、邏輯假設(shè)與邊界條件)
1. 為什么“再完整”的答案也值得二次檢查1.1 一個讓我吃過虧的真實場景前陣子幫一個做電商的朋友處理訂單數(shù)據(jù)對賬的問題。他們每天要從三個渠道導(dǎo)出訂單明細字段格式各不相同人工核對一次要花兩個多小時。我順手把需求丟給AI讓它生成一段Python腳本做自動匹配。AI給回來的代碼結(jié)構(gòu)清晰、注釋完整、邏輯看起來無懈可擊連異常處理都寫了。我掃了一眼覺得沒問題直接跑了一遍結(jié)果匹配率只有六成多。問題出在哪AI默認把三個渠道的訂單號都當(dāng)成了純數(shù)字字符串去比對但其中一個渠道的訂單號帶字母前綴另一個渠道的訂單號在導(dǎo)出時被表格軟件自動轉(zhuǎn)成了科學(xué)計數(shù)法。AI不知道這些“臟數(shù)據(jù)”的存在它給出的答案在邏輯層面是完整的但在現(xiàn)實層面是殘缺的。這件事之后我給自己定了一條規(guī)矩AI給的答案再完整也必須先檢查三處——數(shù)據(jù)源的真實狀態(tài)、邏輯鏈條的隱含假設(shè)、邊界條件的覆蓋程度。這三處檢查花不了幾分鐘但能擋掉絕大多數(shù)“看起來對、跑起來錯”的坑。1.2 這三處檢查分別針對什么問題很多人用AI輔助工作習(xí)慣是“提問—復(fù)制—粘貼—運行”中間缺少一個“審”的環(huán)節(jié)。不是不想審是不知道審什么。面對一段結(jié)構(gòu)完整、排版漂亮的答案很容易產(chǎn)生“它都寫這么全了應(yīng)該沒問題”的心理暗示。我把這三處檢查拆開說第一處數(shù)據(jù)源的真實狀態(tài)。AI只能基于你描述的數(shù)據(jù)特征來推理它看不到你本地文件里那些空值、編碼錯誤、格式混亂、隱藏字符。所以任何涉及數(shù)據(jù)處理的答案第一步永遠是拿真實數(shù)據(jù)去驗證輸入假設(shè)。第二處邏輯鏈條的隱含假設(shè)。AI在生成答案時會“腦補”很多它認為理所當(dāng)然的前提。比如你問它怎么做用戶留存分析它默認你的用戶ID是唯一的、默認時間字段是標準格式、默認沒有跨天會話。這些假設(shè)不成立整個分析就是空中樓閣。第三處邊界條件的覆蓋程度。正常流程跑通不代表沒問題真正容易翻車的是空輸入、超大輸入、并發(fā)沖突、網(wǎng)絡(luò)超時這些邊界場景。AI通常會把主流程寫得很漂亮但邊界處理往往一筆帶過甚至完全忽略。這三處檢查不是對AI的不信任而是對實際業(yè)務(wù)復(fù)雜度的尊重。下面我逐個展開把每一處檢查的具體操作方法、常見坑點和實操心得講透。2. 第一處檢查數(shù)據(jù)源的真實狀態(tài)2.1 為什么AI看不到你的“臟數(shù)據(jù)”AI在回答問題時只能依據(jù)你在對話中提供的信息。你告訴它“我有一個包含訂單號、金額、時間的表格”它就會按照標準表格的結(jié)構(gòu)去設(shè)計處理邏輯。但現(xiàn)實中的表格往往長這樣訂單號列里混著文本和數(shù)字兩種格式金額列里有“待確認”這樣的中文描述時間列里既有“2024-01-15”也有“2024/1/15”還有“Jan 15, 2024”。這些細節(jié)你不說AI就不知道。它給出的代碼或方案是在“理想數(shù)據(jù)”假設(shè)下成立的。所以第一處檢查的核心動作就是在把AI的答案應(yīng)用到真實數(shù)據(jù)之前先做一輪數(shù)據(jù)摸底。具體怎么做我通常分三步走。第一步看數(shù)據(jù)的基本輪廓。用最簡單的命令快速了解數(shù)據(jù)規(guī)模、字段類型、空值比例。比如處理表格數(shù)據(jù)時我會先跑一遍import pandas as pd df pd.read_csv(orders.csv) print(df.shape) # 行列數(shù) print(df.dtypes) # 字段類型 print(df.isnull().sum()) # 空值統(tǒng)計 print(df.head(10)) # 前10行樣本這四行輸出能讓我在30秒內(nèi)判斷出AI的答案是否建立在錯誤的數(shù)據(jù)假設(shè)上。如果AI假設(shè)訂單號是整數(shù)但實際讀進來是object類型那就說明里面有非數(shù)字字符需要先清洗。第二步看字段的實際取值分布。這一步很多人會跳過但它恰恰是最容易發(fā)現(xiàn)問題的地方。比如AI寫了一個按省份分組統(tǒng)計的邏輯你跑一下df[province].value_counts()可能會發(fā)現(xiàn)“廣東省”和“廣東”同時存在“北京市”和“北京”混著用。這種問題不提前發(fā)現(xiàn)分組結(jié)果就是錯的。第三步看時間字段和數(shù)值字段的邊界。時間字段要檢查最早和最晚日期是否在合理范圍內(nèi)有沒有未來日期或1970年的異常值。數(shù)值字段要檢查最大值、最小值、均值、中位數(shù)看看有沒有明顯離譜的數(shù)字。我見過最夸張的一次金額列里有一個值是99999999后來查出來是測試數(shù)據(jù)沒清干凈。2.2 常見的數(shù)據(jù)陷阱與排查清單做了這么多年數(shù)據(jù)處理我總結(jié)了一份“數(shù)據(jù)摸底排查清單”每次拿到新數(shù)據(jù)源都會過一遍。這份清單也適用于檢查AI答案的數(shù)據(jù)假設(shè)是否成立。檢查項常見問題快速排查方法字段類型數(shù)字存成文本、日期存成字符串df.dtypes看類型空值空字符串、NULL、NaN混用df.isnull().sum()重復(fù)值主鍵重復(fù)、整行重復(fù)df.duplicated().sum()格式不一致日期格式多樣、大小寫混用取樣查看value_counts()隱藏字符空格、換行符、制表符df[col].str.strip()前后對比編碼問題中文亂碼、特殊符號讀取時指定encoding試數(shù)值異常負數(shù)、超大值、精度丟失df.describe()看分布時間異常未來日期、時區(qū)混亂排序后看首尾這張表里的每一項我都實際踩過坑。說一個最隱蔽的隱藏字符。有一次AI生成的匹配邏輯怎么跑都對不上我查了兩個小時最后發(fā)現(xiàn)是其中一個數(shù)據(jù)源的訂單號末尾帶了一個不可見的換行符。用strip()處理一下就好了但如果不做數(shù)據(jù)摸底這種問題能讓人崩潰。注意數(shù)據(jù)摸底不是一次性的工作。每次數(shù)據(jù)源更新、每次換一批文件都要重新跑一遍。我習(xí)慣把摸底代碼封裝成一個函數(shù)每次新數(shù)據(jù)進來先調(diào)用它輸出一份“數(shù)據(jù)體檢報告”。2.3 把數(shù)據(jù)檢查變成肌肉記憶剛開始做數(shù)據(jù)檢查會覺得麻煩覺得耽誤時間。但算一筆賬就明白了花5分鐘做數(shù)據(jù)摸底可能省掉2小時的debug。而且隨著經(jīng)驗積累很多檢查可以并行完成實際耗時更短。我的做法是把常用檢查寫成腳本模板新項目直接改路徑就能用。比如下面這個函數(shù)輸入一個DataFrame自動輸出關(guān)鍵檢查結(jié)果def data_health_check(df, namedataset): print(f {name} 數(shù)據(jù)體檢報告 ) print(f行列數(shù): {df.shape}) print(f重復(fù)行: {df.duplicated().sum()}) print(f空值統(tǒng)計:\n{df.isnull().sum()}) print(f字段類型:\n{df.dtypes}) for col in df.select_dtypes(includeobject).columns: sample df[col].dropna().head(3).tolist() print(f字段 {col} 樣本值: {sample}) print(f數(shù)值字段描述:\n{df.describe()})這個函數(shù)不復(fù)雜但能覆蓋八成以上的常見問題。每次AI給出數(shù)據(jù)處理方案后我先跑這個函數(shù)確認數(shù)據(jù)狀態(tài)和AI的假設(shè)一致再往下走。3. 第二處檢查邏輯鏈條的隱含假設(shè)3.1 AI最愛“腦補”的幾類假設(shè)AI生成答案時會基于訓(xùn)練數(shù)據(jù)中的常見模式來補全信息。這在大多數(shù)時候是好事能幫你省去很多描述成本。但在實際業(yè)務(wù)場景中這些“腦補”出來的假設(shè)往往是錯誤的源頭。我梳理了一下AI最常腦補的假設(shè)集中在幾個方面唯一性假設(shè)。AI默認你給的ID字段是唯一的、不重復(fù)的。但現(xiàn)實中一個用戶可能有多個賬號一個訂單號可能在退款后重新生成一個設(shè)備ID可能被多人共用。如果AI的邏輯依賴唯一性而實際數(shù)據(jù)不滿足結(jié)果就會重復(fù)計算或漏算。時序假設(shè)。AI默認數(shù)據(jù)是按時間順序排列的默認沒有跨天、跨月、跨年的邊界問題。但實際數(shù)據(jù)可能是亂序的可能有時區(qū)差異可能有夏令時切換。我處理過一個跨時區(qū)的日志分析AI給的方案默認所有時間都是UTC但實際數(shù)據(jù)里混著三個時區(qū)的時間戳直接算出來的會話時長全是錯的。完整性假設(shè)。AI默認你給的數(shù)據(jù)是完整的沒有缺失關(guān)鍵字段。但現(xiàn)實中用戶可能沒填手機號、訂單可能沒有收貨地址、日志可能丟了幾條。AI的方案如果沒有考慮缺失值處理跑起來就會報錯或者產(chǎn)生誤導(dǎo)性結(jié)果。獨立性假設(shè)。AI默認各個字段之間是獨立的但現(xiàn)實中字段之間往往有關(guān)聯(lián)。比如“訂單狀態(tài)”和“支付時間”是聯(lián)動的——已支付的訂單一定有支付時間未支付的訂單支付時間應(yīng)該為空。如果AI分別處理這兩個字段就可能出現(xiàn)邏輯矛盾。3.2 如何快速定位關(guān)鍵假設(shè)檢查邏輯假設(shè)不需要逐行讀代碼那樣太慢。我的方法是反向驗證不看AI寫了什么而是問自己“這個方案在什么情況下會出錯”。具體操作分三步第一步找出方案中的關(guān)鍵判斷節(jié)點。任何涉及條件判斷、數(shù)據(jù)關(guān)聯(lián)、聚合計算的地方都是假設(shè)集中的地方。比如if status paid這個判斷隱含假設(shè)是status字段的取值只有paid和not paid兩種但實際可能有pending、cancelled、refunded等多種狀態(tài)。第二步針對每個判斷節(jié)點列出所有可能的取值和邊界情況。這一步可以借助AI本身來完成——我會問它“這個判斷如果遇到空值會怎樣如果遇到大小寫不一致會怎樣如果遇到中文描述會怎樣”讓AI自己列出潛在問題往往能發(fā)現(xiàn)它第一遍回答時忽略的細節(jié)。第三步用真實數(shù)據(jù)做小樣本驗證。不要等全量跑完再看結(jié)果先取100條數(shù)據(jù)跑一遍人工核對輸出是否符合預(yù)期。這一步能快速暴露假設(shè)錯誤而且成本極低。3.3 一個典型的假設(shè)翻車案例說一個我印象深刻的案例。有個朋友讓我?guī)兔匆粋€用戶活躍度分析的腳本AI生成的邏輯是按用戶ID分組統(tǒng)計每個用戶的操作次數(shù)然后按次數(shù)排序取前20%作為活躍用戶。邏輯看起來很清晰對吧但實際跑出來的結(jié)果里有幾個用戶的操