WBlog

wangzhiwei blog

0%

scikit-learn

分类与回归

分类 = 预测”是什么”(类别)
回归 = 预测”是多少”(数值)

场景 分类问题(选标签) 回归问题(算数值)
房价 这房子贵/便宜?(二分类) 这房子具体多少钱?580万
天气 明天晴/雨?(分类) 明天温度多少度?26.5°C
股票 明天涨/跌?(分类) 明天收盘价多少?158.3元
外卖 这单会超时/准时?(分类) 这单预计多少分钟送达?32分钟
学生成绩 及格/不及格?(分类) 具体考多少分?87.5分

有监督和无监督学习

有监督:像考试有答案,对答案改错,追求”预测准不准”

需要大量标注数据(人工打标签成本高)

无监督:像探险没地图,自己摸索,追求”发现新东西”

数据不用标注,但结果需要人解读(这堆是什么?)

场景 有监督学习 无监督学习
邮件处理 这是垃圾邮件/正常邮件?(已知标签训练) 自动把邮件分成几类(工作/社交/广告),不知道类别名
看病 根据症状预测患什么病(历史病例有确诊结果) 根据症状把病人分组,发现潜在病型(未知疾病模式)
客户分析 预测客户会不会流失(有历史流失记录) 把客户分成不同群体,发现”高消费夜猫子族”等
图片处理 识别图中是猫还是狗(图片已标注) 自动把相似图片聚到一起,不知道是什么
房价预测 预测这套房卖多少钱(有历史成交价) 发现哪些房子是一类(学区房/豪宅/老破小)

半监督学习(Bonus)

现实中还有一种:半监督学习

情况:10000张图片,只有100张标注了(猫/狗),9900张没标注
做法:用100张有标签的学个大概,再去”猜”那9900张,逐步优化
有监督 = 有人教,学对错
无监督 = 没人教,自己悟

Q1: 用过 Scikit-learn 哪些功能?

主要用来做数据预处理和传统机器学习模型。
1、比如用 StandardScaler 做数据标准化,
2、用 train_test_split 切分数据集,
3、用 LogisticRegression、RandomForest 做分类预测,
4、还有用 GridSearchCV 调参数。

StandardScaler

例子1:相亲数据(用StandardScaler)

特征 原始值 标准化后
身高 180cm +1.5(很高)
收入 5000元 -0.8(偏低)
年龄 30岁 0(平均)

例子2:文章关键词(用Normalizer)

文章 关键词A出现次数 关键词B出现次数 归一化后
文章1(长文) 100次 50次 [0.89, 0.45]
文章2(短文) 10次 5次 [0.89, 0.45]
核心记忆点
StandardScaler 为单位,消掉单位差异,让特征公平PK
Normalizer 为单位,消掉总量差异,保留内部比例

数据预处理用StandardScaler还是Normalizer?
看场景:
样本之间比特征(如分类、聚类)→ StandardScaler
样本内部比比例(如文本相似度)→ Normalizer
实际中StandardScaler更常用,因为特征单位不同是常态

train_test_split

的核心目的:公平评估模型真实水平

问题 后果
用全部数据训练,再用全部数据测试 数据泄露,模型见过答案,分数虚高
训练集和测试集分布不一致 学的东西和考的东西不一样,泛化能力差

四、分类问题必用:分层抽样(stratify)
问题场景: 100个样本里,90个正例、10个负例(不平衡数据)

不用 stratify stratify=y
随机切可能把10个负例全切到训练集 训练集:72正例+8负例(9:1)
测试集全是正例,测不出模型对负例的能力 测试集:18正例+2负例(9:1)
测试集标签分布失真 保持原数据比例,评估更准

六、常见错误(面试考点)

错误做法 后果 正确做法
先标准化,再切分 测试集信息泄露到训练过程(用了全量数据的均值/方差) 先切分,再标准化
分类问题不用stratify 标签分布不均,评估偏差 分类必用stratify=y
不用random_state 每次运行结果不同,无法复现 固定random_state
测试集比例太小(如5%) 评估不稳定,波动大 一般20%-30%

LogisticRegression、RandomForest 做分类预测

一、LogisticRegression(逻辑回归)
不是”回归”,是分类!用一条线(或一个平面)把数据分成两类,输出的是”属于某类的概率”。

特点 说明
线性模型 假设特征和结果之间是线性关系
输出概率 输出0-1之间的概率值,>0.5判为正类
可解释强 每个特征有个”权重”,正负代表影响方向
速度快 训练快,预测快,适合大数据
需要标准化 对特征尺度敏感,必须做StandardScaler

适用场景
特征和结果关系接近线性
需要解释模型为什么这样判(如金融风控,要告诉客户拒绝原因)
数据量大,要求速度快

二、RandomForest(随机森林)

一群决策树投票决定结果。每棵树看数据的一部分、特征的一部分,最后少数服从多数。

特点 说明
集成学习 多棵树集成,降低单棵树过拟合风险
非线性 能捕捉复杂的特征组合关系
抗干扰 对异常值、缺失值不敏感
不用标准化 基于分裂点,不在乎数值范围
特征重要性 能输出哪个特征更重要

适用场景
特征之间关系复杂,非线性
数据有噪声、异常值
追求准确率,不太在意解释性
特征有缺失值(树模型能处理)

直观对比

LogisticRegression RandomForest
模型类型 线性模型 树集成(非线性)
是否需要标准化 必须 不需要
训练速度 较慢(树多)
预测速度 极快
可解释性 强(看权重正负大小) 中等(看特征重要性排名)
处理复杂关系 弱(只能学线性) 强(自动组合特征)
过拟合风险 低(模型简单) 中(要调max_depth控制)
默认表现 baseline,稳定 通常更强,但可能过拟合

GridSearchCV

GridSearchCV 是 Scikit-learn 里的自动调参神器,大白话讲就是:你告诉它要试哪些参数组合,它帮你全部试一遍,选出最好的。

手动调参问题 GridSearchCV解决
试10组参数,要改10次代码、跑10次 一次配置,自动遍历所有组合
不知道哪组最好,凭感觉选 交叉验证评分,用数据说话
容易过拟合(在测试集上调参) 内置交叉验证,评估更稳

你想试的参数:

  • n_estimators: [50, 100, 200] ← 3种
  • max_depth: [3, 5, 10, None] ← 4种

GridSearchCV 自动试:3 × 4 = 12 种组合
每种组合用 5折交叉验证 评估
总共训练:12 × 5 = 60 次模型
最后告诉你哪组最好

GridSearchCV和RandomizedSearchCV选哪个?
参数少、算力够 → GridSearchCV(穷举,找最优)
参数多、算力紧 → RandomizedSearchCV(随机采样,快且准)

cv=5是什么意思?能改成3吗?
5折交叉验证:数据分5份,轮流拿1份测试、4份训练,测5次取平均。
数据多→cv=3或5(快);数据少→cv=10(稳);数据极少→用StratifiedKFold分层。

scoring=’f1’什么时候用?
分类不平衡时(如100个正例、10个负例),accuracy会骗人,f1更稳。二分类用f1,多分类用f1_macro或f1_weighted

scoring=’f1’ 就是用 F1分数 来评估模型好坏,专门解决精确率和召回率的矛盾。

场景 问题
只看 Accuracy(准确率) 数据不平衡时会骗人(99%都是正例,全猜正也有99%准确)
只看 Precision(精确率) 太保守,宁可错杀不放过,漏掉很多真的
只看 Recall(召回率) 太激进,宁可放过不错杀,误杀很多假的

F1 = 2 × (Precision × Recall) / (Precision + Recall)

fit、transform、fit_transform 的区别?

方法 口诀 对谁用
fit 只看不改,学规律 训练集(单独用很少)
transform 只改不看,用老规律 训练集+测试集
fit_transform 边看边改,一步搞定 训练集(最常用)
测试集禁止fit 偷看测试集=作弊 切记!

假设你在北京训练模型,要去上海预测:

做法 结果
北京数据 fit,北京数据 transform ✅ 正确,北京规律用于北京
北京数据 fit,上海数据 transform ✅ 正确,用北京规律预测上海(模拟真实场景)
上海数据 fit,上海数据 transform ❌ 作弊!你提前知道上海的情况了

好,用你的RAG项目具体讲 fit/transform,分两个场景:文本向量化和查询标准化。

场景一:文本向量化(TfidfVectorizer)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vectorizer = TfidfVectorizer()

# ✅ 只用训练集构建词表(fit)
vectorizer.fit(train_docs)
# 学到的规律:词表 = ["人工智能", "分支", "大量", "学习", "机器", "深度", "数据", "需要", "是"]

# 训练集:边学边转(fit_transform = fit + transform)
X_train = vectorizer.fit_transform(train_docs)
# 结果:训练文档变成向量,维度=9(词表大小)

# 测试集:只用transform,不准重新fit!
X_test = vectorizer.transform(test_docs)
# 结果:测试文档变成向量,维度还是9
# 注意:测试集的"图像识别"不在词表里,被忽略了(这才是真实场景!)

场景二:向量检索前的标准化

文档向量存进Milvus前,要做标准化(让不同维度的数值范围一致)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

from sklearn.preprocessing import StandardScaler
import numpy as np

# 假设:1000个文档,每个文档768维向量(来自Embedding模型)
train_vectors = np.random.rand(1000, 768) # 训练集(已有文档)
new_doc_vector = np.random.rand(1, 768) # 测试集(新上传的1个文档)

scaler = StandardScaler()

# ========== 步骤1:训练集 fit_transform ==========
train_vectors_scaled = scaler.fit_transform(train_vectors)
# 内部做了:
# - fit:算1000个文档,每维的均值/标准差(768个均值,768个标准差)
# - transform:用这些均值/标准差,把1000个文档标准化

# 存进Milvus(标准化后的)
# milvus_client.insert(train_vectors_scaled)

# ========== 步骤2:新文档只能用transform ==========
new_doc_scaled = scaler.transform(new_doc_vector)
# ✅ 用训练集的768个均值/标准差,标准化这个新文档
# ❌ 绝对不能 scaler.fit(new_doc_vector)!否则均值/标准差变了,和Milvus里的对不上!

# 现在可以检索了:new_doc_scaled 和 train_vectors_scaled 同一个尺度

场景三:RAG检索时的坑(重点!)
真实问题
用户提问:”张总的下属的绩效如何?”
系统要先把问题变成向量,去Milvus里找相似文档。

RAG检索:用训练集的规律transform,不准fit!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 训练阶段:保存scaler的规律
scaler = StandardScaler()
train_vectors_scaled = scaler.fit_transform(train_vectors)

# 保存scaler(用joblib),上线时加载
import joblib
joblib.dump(scaler, 'scaler.pkl') # 保存均值/标准差

# ========== 线上服务阶段(FastAPI接口)==========
from fastapi import FastAPI
import joblib

app = FastAPI()
scaler = joblib.load('scaler.pkl') # 加载训练时的规律

@app.post("/search")
def search(query: str):
query_vector = get_embedding(query) # 获取向量

# ✅ 用训练集的规律transform,不准fit!
query_scaled = scaler.transform(query_vector.reshape(1, -1))

# 去Milvus检索(和训练集同一个尺度)
results = milvus_client.search(query_scaled)
return results
阶段 操作 原因
构建知识库(离线) fit_transform 文档向量 学规律+标准化,存Milvus
保存scaler joblib.dump 把规律带走,上线用
用户查询(在线) transform 查询向量 用老规律,保证和知识库同尺度
绝对不能做 在线fit新查询 每次查询尺度都不一样,检索崩了

二、模型评估题(职位重点:各种指标)

Q3: Accuracy、Precision、Recall 啥区别?什么时候看哪个?

指标 大白话 什么时候用
Accuracy 猜对的比例 数据平衡时用
Precision 猜”是”的里面,真的”是”的比例 宁可错杀,不可放过(比如垃圾邮件,别把好邮件判成垃圾)
Recall 真的”是”里面,被猜出来的比例 宁可放过,不可错杀(比如癌症检测,别漏掉病人)

我用更详细的例子和场景帮你彻底分清这三个指标。

一、先记住核心区别

指标 问的是 大白话
Accuracy 猜对的比例 100个里猜对几个?
Precision 猜”是”的里面,真的”是”的比例 喊”狼来了”的,真有狼吗?
Recall 真的”是”里面,被找出来的比例 有狼的,都被喊出来了吗?

二、用一个故事讲清楚:狼来了

场景

村里有100户人家,其中10户真有狼(正例),90户没狼(负例)。

你是个预警系统,负责喊”狼来了”。

你的预测结果

你喊”有狼” 你喊”没狼”
真有狼(10户) 8户 ✓ 2户 ✗
真没狼(90户) 4户 ✗ 86户 ✓

三、逐个计算

  1. Accuracy(准确率)= 猜对的比例
1
2
3
猜对的 = 真有狼且喊有狼(8) + 真没狼且喊没狼(86) = 94
总数 = 100
Accuracy = 94/100 = 94%

问题:看起来很高?但注意——90户本来就没狼,只要全喊”没狼”就能90%准确!

Accuracy的坑:数据不平衡时,全猜多数类也能高分。


  1. Precision(精确率)= 你喊”有狼”的,真有狼吗?
1
2
3
你喊"有狼"的总数 = 8(真有)+ 4(误报)= 12
喊对的 = 8
Precision = 8/12 = 66.7%

含义:你喊了12次”狼来了”,只有8次真有狼,4次是误报(吵到村民)。

Precision关注:别乱喊,喊了就要准(宁可漏掉,别误报)


  1. Recall(召回率)= 真有狼的,都被你喊出来了吗?
1
2
3
真有狼的总数 = 10
你喊出来的 = 8
Recall = 8/10 = 80%

含义:10户有狼,你只找到8户,2户漏掉了(狼吃人了)。

Recall关注:别漏掉,有狼就要喊(宁可误报,别漏掉)


四、Precision vs Recall 的矛盾

你想提高 做法 后果
Precision 保守点,不确定就不喊 误报少,但漏掉的多(Recall↓)
Recall 激进点,疑似就喊 漏掉少,但误报多(Precision↓)
两者都高 模型真的很准 理想状态,难达到

图示

1
2
Precision高 = 喊"有狼"的圈子小,但里面全是狼 ✓
Recall高 = 把真有狼的都圈进来,但圈里混进没狼的 ✗

五、什么时候看哪个?(关键!)

场景1:垃圾邮件过滤

指标 选择 原因
Precision ⭐⭐⭐ 宁可把垃圾邮件放进收件箱(漏掉),别把重要邮件判成垃圾(误杀)
Recall 次要 漏掉几封垃圾邮件,用户无感

目标:你喊”垃圾”的邮件,真的是垃圾(别误杀好工作)


场景2:癌症检测

指标 选择 原因
Recall ⭐⭐⭐ 宁可把健康人吓去复查(误报),别漏掉真病人(等死)
Precision 次要 误诊可以复查排除,漏诊耽误治疗

目标:有癌症的,必须找出来(宁可错杀,不可放过)


场景3:人脸识别门禁

指标 选择 原因
Precision ⭐⭐⭐ 宁可不认识老板(漏掉),别把陌生人放进来(误报)
Recall 次要 老板被拦可以重刷,小偷进来就完了

场景4:搜索引擎(RAG场景)

指标 选择 原因
Precision 前K个结果 第一页显示的10条,必须准(用户只看前面)
Recall 全库检索 相关的文档,必须从百万篇里找出来(别漏)

实际用 F1mAP 平衡两者。


六、你的RAG项目怎么选?

场景A:文档检索(从知识库找相关文档)

阶段 关注指标 原因
召回阶段(向量检索Top-100) Recall 先把可能相关的都捞回来,别漏
精排阶段(rerank取Top-5) Precision 给用户看的5条,必须条条准

做法

1
2
3
4
5
# 第一阶段:Milvus向量检索,放宽阈值,追求Recall
results = milvus.search(query, top_k=100, threshold=0.5) # 捞100篇

# 第二阶段:Cross-Encoder重排序,追求Precision
reranked = reranker.rerank(query, results, top_k=5) # 精选5篇

场景B:答案生成质量评估

指标 用法
BLEU/ROUGE 看生成答案和参考答案的字面相似(Precision导向)
Recall@K 看正确答案有没有出现在Top-K候选里(Recall导向)
F1 综合评估(你的简历里提到的BertScore也是类似)

七、一句话总结表

指标 核心问题 极端追求时的口诀 典型场景
Accuracy 猜对多少? 全猜多数类 数据平衡时随便看看
Precision 喊的对吗? 宁可漏,别错喊 垃圾邮件、人脸识别、金融风控
Recall 漏了吗? 宁可错喊,别漏掉 癌症检测、安全入侵、法律合规

八、面试金句(可以直接用)

“在我的RAG项目里,检索阶段优先保证Recall,用向量召回100篇候选;精排阶段优先保证Precision,用rerank选出最准的5篇给用户。如果是医疗或金融场景,我会根据业务调整——癌症检测要Recall,垃圾邮件过滤要Precision。”

Q4: ROC 和 AUC 是干嘛的?

“我的RAG项目里,相关文档只占0.5%,极度不平衡。我用AUC评估模型排序能力,因为它不受数据分布影响。然后通过ROC曲线找到最优阈值0.73,比默认0.5的Precision从2.5%提升到44%,F1分数大幅提升。”

三、超参数调优题

Q5: Grid Search 和 Random Search 啥区别?
大白话答:
Grid Search(网格搜索):把所有参数组合试一遍,准但慢
Random Search(随机搜索):随机抽几个组合试,快但可能漏最优解
参数少就用 Grid,参数多就用 Random。Scikit-learn 里都有。

Q6: 交叉验证(Cross-Validation)是干嘛的?
大白话答:
把数据切成几份,轮流拿一份当测试集,其他当训练集,多测几次取平均。防止某一次切分运气好/差,结果更靠谱。

四、结合 LLM/AI 场景题(职位关联)

Q7: Scikit-learn 在大模型项目里还有用吗?
大白话答:
有用,但角色变了:
数据预处理:清洗、标准化、降维(PCA)——给 RAG 的向量数据库
准备数据
传统模型兜底:轻量级分类器(如逻辑回归)做意图识别、内容安全初筛,比调大模型快且便宜
评估指标:计算 BLEU、ROUGE 时,传统指标(Precision/Recall)做辅助验证
聚类分析:K-Means 对文档做预分类,再送向量数据库

PCA(主成分分析) 是 Scikit-learn 里用来做降维的经典算法,大白话讲就是:把复杂的数据简化,保留最重要的信息,扔掉噪声和冗余。
PCA找的是什么?
数据方差最大的方向 = 信息最多的方向。

“在我的RAG项目里,原始文档向量768维,存储和检索成本高。我用PCA降到128维,保留了92%的信息,同时存储减少83%、检索速度提升2倍。线上服务时,新查询先用StandardScaler标准化,再用训练好的PCA投影,最后入库检索。”

BLEU 和 ROUGE 是评估文本生成质量的两个经典指标,你的RAG项目里用来判断生成的回答好不好,大白话讲就是:和参考答案比,像不像。

BLEU ROUGE
起源 机器翻译(IBM,2002) 自动摘要(微软,2003)
关注重点 精确率(Precision) 召回率(Recall)
问的问题 生成的话里,多少在参考答案里? 参考答案里的话,多少被生成了?
适用场景 翻译(输出要准确,别瞎编) 摘要(输出要全,别漏掉)
RAG里用哪个 都有,ROUGE更常用 都有,ROUGE更常用
指标 核心 问的问题 RAG里用
BLEU 精确率 生成的词在参考里吗? 翻译场景
ROUGE 召回率 参考的词被生成了吗? 摘要、问答(主要用)
BertScore 语义相似 意思一样吗? 开放生成(更准)

“评估RAG生成质量时,我用ROUGE-L看参考答案的覆盖度,用BertScore看语义相似度。传统BLEU/ROUGE只看词匹配,BertScore用BERT embedding理解同义词和语义,和人工判断更一致。实际项目中,BertScore和人工评估的相关系数达到0.85,比ROUGE的0.6更可靠。”

K-Means 预分类 是 RAG 项目里的提速技巧,大白话讲就是:先把文档分堆,查询时只搜相关的那堆,不用全库遍历。

K-Means学到什么?
1000个中心点(centroids),每个768维
每篇文档离哪个中心点最近,就属于哪类

“面对百万级文档检索延迟高的问题,我用K-Means预分类把文档聚成1000个主题簇。查询时先预测所属类别,只在该簇内做向量相似度计算,检索速度提升100倍。为平衡速度和召回,我对边界文档做软聚类(属多类别),并对Top-3邻近类别联合检索,保证召回率只下降2%的情况下,延迟从500ms降到5ms。”

一、核心问题:向量检索慢
你的 RAG 现状

1
2
3
知识库:100万篇文档,每篇768维向量
用户提问:转成768维向量
检索方式:和100万个向量算相似度,取Top-K

问题:100万次向量内积计算,太慢!
二、K-Means 预分类思路
大白话方案
把100万文档先分成1000个主题堆(比如”财务堆”、”技术堆”、”人事堆”)。
查询时,先判断问的是哪类,只去那类里搜,从100万→1000。

1
2
3
4
5
传统流程:查询向量 → 和100万文档比相似度 → 返回Top-10(慢)

K-Means加速:
查询向量 → 判断属于"财务类"(K-Means中心点)→ 只和财务类的1000篇比 → 返回Top-10(快100倍)

怎么评估预分类的质量(是否分对了)?
大白话:同类文档挤得紧不紧?

惯性 = 每篇文档到所属中心点的距离平方和
越小越好 → 同类文档越集中

“评估K-Means预分类质量,我分三层:聚类层看轮廓系数和纯度,检索层看Recall@10是否下降超过5%,业务层对比端到端ROUGE-L分数。实际项目中,K=1000时轮廓系数0.52,纯度78%,软分类召回96%,延迟从500ms降到5ms,最终答案BertScore只下降1.2%,**速度和

Q8: 怎么做文本数据的向量化?(Scikit-learn 方式 vs Embedding)

一、原句结构拆解

“Scikit-learn 是我做【数据预处理、传统模型 baseline、超参调优、评估指标计算】的工具箱。
在大模型项目里,它负责【快、轻、可控】的部分,
和 LLM 的【强理解能力】形成【互补】。”

二、逐部分详细展开

  1. 数据预处理 —— 大模型前的”洗菜切菜”
具体工作 Scikit-learn 工具 为什么不用LLM做
文本清洗标准化 StandardScaler 对Embedding向量归一化 LLM不直接处理数值缩放
缺失值处理 SimpleImputer 填均值/中位数 轻量,规则明确
异常检测 IsolationForest 先筛掉脏数据 比用LLM判断快1000倍
维度压缩 PCA 768维→128维,省存储 LLM不会帮你压缩向量

“用户上传的PDF文档,先StandardScaler标准化Embedding向量,再PCA降到128维存Milvus。这一步如果让LLM做,成本贵、速度慢,Scikit-learn几毫秒搞定。”

  1. 传统模型 baseline —— 快速验证思路
场景 用Scikit-learn 对比LLM
意图识别(10类) LogisticRegression 2ms响应 LLM 200ms+,贵
内容安全初筛 RandomForest 判断有害/无害 LLM做二分类浪费
文档分类(预分类) K-Means 百万文档秒级聚类 LLM无法批量聚类

“先跑个RandomForest baseline,5分钟知道这条路能不能走通。如果传统模型F1能到0.85,就没必要上LLM;如果只有0.6,再上LLM做精排。”

  1. 超参调优 —— 科学找最佳配置
工具 用途 大模型场景
GridSearchCV K-Means最佳K值 影响检索速度和召回
RandomizedSearchCV 快速试RandomForest参数 意图识别模型调优
cross_val_score 评估PCA保留多少维 平衡压缩率和信息损失

“用GridSearchCV找PCA的n_components,从[64,128,256,512]里选,交叉验证看哪个ROUGE-L不下降。比人工试省80%时间。”

  1. 评估指标计算 —— 量化生成质量
指标 Scikit-learn/相关库 用途
accuracy, precision, recall, f1 sklearn.metrics 意图识别、内容安全二分类
roc_auc_score sklearn.metrics 不平衡数据评估(有害内容检测)
mean_squared_error sklearn.metrics 答案相关性打分回归
BLEU, ROUGE nltk, rouge 生成答案质量(配合LLM评估)
silhouette_score sklearn.metrics K-Means聚类质量

“LLM生成的答案好不好,不能只看BLEU(字面匹配),还要我用BertScore算语义相似。但BertScore之前的传统指标基线,全是Scikit-learn算的。”

三、”快、轻、可控” vs “强理解能力”

维度 Scikit-learn(传统ML) LLM(大模型)
毫秒级响应,predict直接矩阵运算 秒级,要调API或本地推理
模型几MB,CPU跑,内存占用小 模型几GB到几十GB,要GPU
可控 规则明确,coef_看特征权重,可解释 黑盒,为什么这样答说不清
强理解 弱,只能学统计规律 强,懂语义、推理、上下文

互补场景图解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
用户提问:"2024年Q3营收多少?"


┌─────────────────┐
│ Scikit-learn │ ← 快、轻、可控
│ Intent分类器 │ 2ms判断是"财务查询"
│ (LogisticRegression) │
└─────────────────┘


┌─────────────────┐
│ Scikit-learn │ ← 快、轻、可控
│ K-Means预分类 │ 5ms定位"财报类"文档
└─────────────────┘


┌─────────────────┐
│ Scikit-learn │ ← 快、轻、可控
│ PCA降维后的 │ 10ms向量检索Top-10
│ Milvus向量检索 │
└─────────────────┘


┌─────────────────┐
│ LLM │ ← 强理解能力
│ 阅读理解+生成 │ 500ms精读文档,生成答案
│ "2024年Q3营收100亿,同比增长20%"
└─────────────────┘


┌─────────────────┐
│ Scikit-learn │ ← 快、轻、可控
│ ROUGE/BertScore│ 评估答案质量,反馈迭代
│ 评估指标计算 │
└─────────────────┘

总延迟:2+5+10+500 = 517ms,其中LLM占96%,Scikit-learn占4%但决定了找什么给LLM读。

四、面试展开版本(3种长度)
“Scikit-learn 在我的RAG项目里有四个角色:一是数据预处理,用StandardScaler和PCA把768维Embedding降到128维,省83%存储;二是快速baseline,用RandomForest做意图识别,2ms响应比LLM快100倍;三是超参调优,用GridSearchCV找K-Means最佳K值,平衡速度和召回;四是评估指标,算ROUGE、F1量化生成质量。它负责快、轻、可控的部分,和LLM的强理解能力形成互补,比如先K-Means预分类5ms定位文档,再让LLM精读生成,总延迟从纯LLM的5秒降到500毫秒。”