分类与回归
分类 = 预测”是什么”(类别)
回归 = 预测”是多少”(数值)
| 场景 | 分类问题(选标签) | 回归问题(算数值) |
|---|---|---|
| 房价 | 这房子贵/便宜?(二分类) | 这房子具体多少钱?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 | vectorizer = TfidfVectorizer() |
场景二:向量检索前的标准化
文档向量存进Milvus前,要做标准化(让不同维度的数值范围一致)。
1 |
|
场景三:RAG检索时的坑(重点!)
真实问题
用户提问:”张总的下属的绩效如何?”
系统要先把问题变成向量,去Milvus里找相似文档。
RAG检索:用训练集的规律transform,不准fit!
1 | # 训练阶段:保存scaler的规律 |
| 阶段 | 操作 | 原因 |
|---|---|---|
| 构建知识库(离线) | 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户 ✓ |
三、逐个计算
- Accuracy(准确率)= 猜对的比例
1 | 猜对的 = 真有狼且喊有狼(8) + 真没狼且喊没狼(86) = 94 |
问题:看起来很高?但注意——90户本来就没狼,只要全喊”没狼”就能90%准确!
Accuracy的坑:数据不平衡时,全猜多数类也能高分。
- Precision(精确率)= 你喊”有狼”的,真有狼吗?
1 | 你喊"有狼"的总数 = 8(真有)+ 4(误报)= 12 |
含义:你喊了12次”狼来了”,只有8次真有狼,4次是误报(吵到村民)。
Precision关注:别乱喊,喊了就要准(宁可漏掉,别误报)
- Recall(召回率)= 真有狼的,都被你喊出来了吗?
1 | 真有狼的总数 = 10 |
含义:10户有狼,你只找到8户,2户漏掉了(狼吃人了)。
Recall关注:别漏掉,有狼就要喊(宁可误报,别漏掉)
四、Precision vs Recall 的矛盾
| 你想提高 | 做法 | 后果 |
|---|---|---|
| Precision | 保守点,不确定就不喊 | 误报少,但漏掉的多(Recall↓) |
| Recall | 激进点,疑似就喊 | 漏掉少,但误报多(Precision↓) |
| 两者都高 | 模型真的很准 | 理想状态,难达到 |
图示:
1 | Precision高 = 喊"有狼"的圈子小,但里面全是狼 ✓ |
五、什么时候看哪个?(关键!)
场景1:垃圾邮件过滤
| 指标 | 选择 | 原因 |
|---|---|---|
| Precision | ⭐⭐⭐ | 宁可把垃圾邮件放进收件箱(漏掉),别把重要邮件判成垃圾(误杀) |
| Recall | 次要 | 漏掉几封垃圾邮件,用户无感 |
目标:你喊”垃圾”的邮件,真的是垃圾(别误杀好工作)
场景2:癌症检测
| 指标 | 选择 | 原因 |
|---|---|---|
| Recall | ⭐⭐⭐ | 宁可把健康人吓去复查(误报),别漏掉真病人(等死) |
| Precision | 次要 | 误诊可以复查排除,漏诊耽误治疗 |
目标:有癌症的,必须找出来(宁可错杀,不可放过)
场景3:人脸识别门禁
| 指标 | 选择 | 原因 |
|---|---|---|
| Precision | ⭐⭐⭐ | 宁可不认识老板(漏掉),别把陌生人放进来(误报) |
| Recall | 次要 | 老板被拦可以重刷,小偷进来就完了 |
场景4:搜索引擎(RAG场景)
| 指标 | 选择 | 原因 |
|---|---|---|
| Precision | 前K个结果 | 第一页显示的10条,必须准(用户只看前面) |
| Recall | 全库检索 | 相关的文档,必须从百万篇里找出来(别漏) |
实际用 F1 或 mAP 平衡两者。
六、你的RAG项目怎么选?
场景A:文档检索(从知识库找相关文档)
| 阶段 | 关注指标 | 原因 |
|---|---|---|
| 召回阶段(向量检索Top-100) | Recall | 先把可能相关的都捞回来,别漏 |
| 精排阶段(rerank取Top-5) | Precision | 给用户看的5条,必须条条准 |
做法:
1 | # 第一阶段:Milvus向量检索,放宽阈值,追求Recall |
场景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 | 知识库:100万篇文档,每篇768维向量 |
问题:100万次向量内积计算,太慢!
二、K-Means 预分类思路
大白话方案
把100万文档先分成1000个主题堆(比如”财务堆”、”技术堆”、”人事堆”)。
查询时,先判断问的是哪类,只去那类里搜,从100万→1000。
1 | 传统流程:查询向量 → 和100万文档比相似度 → 返回Top-10(慢) |
怎么评估预分类的质量(是否分对了)?
大白话:同类文档挤得紧不紧?
惯性 = 每篇文档到所属中心点的距离平方和
越小越好 → 同类文档越集中
“评估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 的【强理解能力】形成【互补】。”
二、逐部分详细展开
- 数据预处理 —— 大模型前的”洗菜切菜”
| 具体工作 | Scikit-learn 工具 | 为什么不用LLM做 |
|---|---|---|
| 文本清洗标准化 | StandardScaler 对Embedding向量归一化 |
LLM不直接处理数值缩放 |
| 缺失值处理 | SimpleImputer 填均值/中位数 |
轻量,规则明确 |
| 异常检测 | IsolationForest 先筛掉脏数据 |
比用LLM判断快1000倍 |
| 维度压缩 | PCA 768维→128维,省存储 |
LLM不会帮你压缩向量 |
“用户上传的PDF文档,先StandardScaler标准化Embedding向量,再PCA降到128维存Milvus。这一步如果让LLM做,成本贵、速度慢,Scikit-learn几毫秒搞定。”
- 传统模型 baseline —— 快速验证思路
| 场景 | 用Scikit-learn | 对比LLM |
|---|---|---|
| 意图识别(10类) | LogisticRegression 2ms响应 |
LLM 200ms+,贵 |
| 内容安全初筛 | RandomForest 判断有害/无害 |
LLM做二分类浪费 |
| 文档分类(预分类) | K-Means 百万文档秒级聚类 |
LLM无法批量聚类 |
“先跑个RandomForest baseline,5分钟知道这条路能不能走通。如果传统模型F1能到0.85,就没必要上LLM;如果只有0.6,再上LLM做精排。”
- 超参调优 —— 科学找最佳配置
| 工具 | 用途 | 大模型场景 |
|---|---|---|
GridSearchCV |
找K-Means最佳K值 |
影响检索速度和召回 |
RandomizedSearchCV |
快速试RandomForest参数 |
意图识别模型调优 |
cross_val_score |
评估PCA保留多少维 |
平衡压缩率和信息损失 |
“用GridSearchCV找PCA的n_components,从[64,128,256,512]里选,交叉验证看哪个ROUGE-L不下降。比人工试省80%时间。”
- 评估指标计算 —— 量化生成质量
| 指标 | 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 | 用户提问:"2024年Q3营收多少?" |
总延迟: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毫秒。”