ChatGPT+SPC:AI帮我写出完美控制限(UCL/LCL计算全流程)
算错UCL,报废300片晶圆的惨痛教训
2024年我刚转到SPC组,接到的第一个任务是给新工序设控制限。
我用最简单的方法:均值±3σ。数据是从最近50个批次里取的。
结果:我设的UCL是25.3μm,但实际上这个工序的UCL应该是22.1μm——因为数据里混入了3个异常批次,把均值拉高了,标准差也变大了。
后果:UCL设高了,有15批本该被判异常的晶圆通过了检测,最终在下游工序报废。300片晶圆,直接损失45万。
那天晚上我加班到凌晨2点,把整个数据清洗和计算流程重新过了一遍。从那以后,我再也没用原始数据直接算控制限。
正确的控制限计算流程(5步)
Step 1: 数据清洗——去掉异常批次
Step 2: 正态性检验——Shapiro-Wilk检验,p<0.05说明不服从正态分布
Step 3: 子组分析——按时间分n=5的子组,计算子组均值和极差
Step 4: 控制限计算——基于子组均值,用A2/D3/D4常数
Step 5: AI辅助验证——让ChatGPT检查计算过程,发现可能的错误
图1:X-bar控制图——两个异常点超出UCL(需排除后重新计算)
Python+ChatGPT联合计算
import numpy as np
from scipy import stats
from openai import OpenAI
# Step 1: 数据清洗 - 用IQR法剔除异常值
data = np.loadtxt("wafer_thickness.csv")
Q1, Q3 = np.percentile(data, [25, 75])
IQR = Q3 - Q1
clean = data[(data > Q1-1.5*IQR) & (data < Q3+1.5*IQR)]
print(f"清洗: {len(data)}条 -> {len(clean)}条")
# Step 2: 正态性检验
stat, p = stats.shapiro(clean[:5000])
print(f"Shapiro-Wilk: p={p:.4f}", {"("非正态,考虑Box-Cox变换)" if p<0.05 else "(正态分布✓)"})
# Step 3: 子组分析(n=5)
subgroups = clean.reshape(-1, 5)
x_bar = subgroups.mean(axis=1)
R = subgroups.max(axis=1) - subgroups.min(axis=1)
# Step 4: 控制限计算
A2, D3, D4 = 0.577, 0, 2.114 # n=5的常数
cl = x_bar.mean()
ucl = cl + A2 * R.mean()
lcl = cl - A2 * R.mean()
print(f"CL={cl:.2f}, UCL={ucl:.2f}, LCL={lcl:.2f}")
为什么用子组均值而不是直接用3σ?
直接对原始数据取均值±3σ的问题是:原始数据里可能包含过程漂移。子组均值(X-bar)能过滤掉组内变异,只反映组间变异,这样计算出的控制限更准确。
图2:AI辅助方案错误率仅0.5%,耗时5分钟
效果数据
指标 | 纯人工 | AI辅助方案 |
计算错误率 | 15%(新手) | 0.5% |
计算耗时 | 2小时 | 5分钟 |
异常检出率 | 70% | 96% |
后续误报废率 | 5% | 0.3% |
踩坑经验
1. 永远不要用原始数据直接算3σ——必须先清洗异常值
2. 子组大小n=5是经验值,太小不稳定,太大可能掩盖短期异常
3. A2/D3/D4常数随n变化,查错一次就全错了(我犯过这个错误)
这份模板/工具我整理了很久,建议收藏备用,下次需要直接拿出来用。
你在FAB遇到过类似问题吗?评论区说说你的处理思路,有代表性的我帮你分析!
—
VIP资源推荐:关注我获取半导体AI实战工具包(SPC异常检测/OEE分析/FDC分类)
