有监督学习技术

第四课|文本分类中的有监督学习算法与提示词工程

这一讲只做两件事: 先用公开评论数据讲清常见的有监督学习算法, 再看怎样把大模型的分类任务写成一个可执行的 prompt。

《机器学习与自然语言处理》
AI + 计算社会科学微专业

Part 1有监督学习算法

文本分类任务设定

为了把算法讲清楚,这一讲先固定成一个最简单的文本分类任务。

DATA
公开中文评论
酒店、电商、外卖评论都可以。
数据公开,课后也能复现。
TASK
负面 / 非负面二分类
输入一条评论,输出一个标签:
`negative` 或 `non_negative`。
GOAL
比较常见算法
朴素贝叶斯、逻辑回归、决策树,
看它们各自怎么做同一个任务。
评论 A:房间干净,前台也很热情,下次还会住。
评论 B:图片和实际不符,入住体验很差,不会再来。
评论 C:位置方便,但早餐普通,整体还能接受。
评论 D:退房三天还没退款,客服一直没人回,很生气。
Input
评论文本
一句中文评论
Model
算法处理
提取线索并判别
Output
分类标签
negative / non_negative

常见算法的基本直观比较

同一个分类任务,不同算法的“想法”并不一样。

ALGO 1
朴素贝叶斯:像数词
看哪些词更常出现在负面评论里,
哪些词更常出现在非负面评论里。
ALGO 2
逻辑回归:像打分卡
每个线索加一点分、减一点分,
最后合成一个总分。
ALGO 3
决策树:像连续提问
一步步问:有没有退款、有没有失联、
有没有强烈抱怨。
Naive Bayes
退款 + 异味 负面概率上升
干净 + 热情 非负面概率上升
核心直觉:先看词,再比较两边证据。
Logistic Regression
退款 +3 + 异味 +2
没人回 +2 总分 7
核心直觉:把多个线索加权后合成一个分数。
Decision Tree
有退款? 有失联?
是 / 是 负面
核心直觉:按条件一路分下去,像走流程图。
记忆时可以抓三个动作:看词频、做加权、走流程。

算法一:朴素贝叶斯的词频判别机制

它先把一句话拆成词,再看这些词更像常出现在负面,还是常出现在非负面。

“图片和实际不符,不会再来。”
负面词证据
不符
不会再来
退款
非负面词证据
干净
热情
还会来
判别结果
negative
如果这句话里出现的词,整体更像常见于差评, 模型就会把它往负面一侧推。
朴素贝叶斯不会先理解整句语义,它先看词:`不符`、`不会再来`、`差` 之类的词,在负面评论里是否更常见。

Part 1算法的适用条件与局限性

朴素贝叶斯的适用条件与局限性

它快、轻、好上手,但它也会忽略很多上下文信息。

优势

快:训练和预测都很轻,适合先跑第一版。
稳:当关键词信号很强时,表现常常不差。
省:对小样本和稀疏文本也比较友好。
vs

局限性

不看顺序:词和词之间的组合关系抓得比较弱。
假设很强:默认各个词的贡献彼此独立。
怕语境:“不差”“还行”这类细微表达不一定处理得好。

算法二:逻辑回归的加权判别机制

它不只是看词出现没有,而是把多种线索加权后合成一个分数。

“房间有异味,要求退款,客服一直没人回。”
异味
+2
退款
+3
没人回
+2
总分
7 分
分数越往右,越像 negative。 逻辑回归的直觉不是“哪个词最多”,而是“这些线索加起来有多危险”。
逻辑回归的直觉不是“哪个词最常见”,而是“哪些线索一起出现后,总体会把评论推向负面”。

逻辑回归作为基线模型的原因

做文本分类时,逻辑回归经常是一个很好的起点。

WHY 1
好解释
每个线索的方向和权重都比较直观,
容易向别人解释模型在看什么。
WHY 2
好扩展
既能吃词袋特征,
也能接更多结构化特征或 embedding。
WHY 3
好比较
很适合拿来做课程里的 baseline,
再和其他算法比较错误类型。

算法三:决策树的递归划分机制

它更像一个判断流程:每走一步,就把评论分到更细的一类。

有没有退款词?
有 / 没有
有没有客服失联?
有 / 没有
如果两者都有
很可能是负面
如果只有轻微抱怨
可能是非负面
决策树最擅长的, 是把“如果 A 又 B,就更像负面”这种组合条件直接写进判断过程。

决策树的优势与风险

它直观、像流程图,但也最容易把局部规律学得太死。

优势

直观:很像人工在脑中走的判断流程。
会抓交互:“退款 + 失联”这类组合条件表达得很自然。
好展示:课堂上容易把判断路径讲给学生看。
vs

风险

容易过拟合:树开得太深,就会把训练样本记得太细。
不够稳定:样本稍有变化,树结构可能就改很多。
要剪枝:否则很容易看起来很懂,实际泛化很差。

算法的综合比较

它们都能做文本分类,但各自擅长的地方并不一样。

解释性更强
对复杂关系的表达更强
朴素贝叶斯 快,轻,适合看强词信号。
逻辑回归 平衡,稳妥,适合做基线模型。
决策树 规则直观,但最容易过拟合。
算法 直觉 更适合 短板
朴素贝叶斯 看词证据 关键词很强、先跑快速基线时 不看词序,上下文能力弱
逻辑回归 做加权打分 文本分类 baseline、需要解释时 复杂交互要靠额外特征
决策树 走判断流程 规则型任务、组合条件很多时 容易过拟合,结构不稳定

Part 1课程作业中的算法比较方案

课程作业的建议实施流程

先把这几类算法都跑起来,再去看它们各自错在哪一类评论上。

准备训练数据
评论 + 标签
分别跑各类算法
NB / LR / Tree
比较错误样本
谁更容易误判
再做优化
调特征或换 prompt
课堂问题: 如果几类算法都在“轻微抱怨但整体还能接受”这类评论上出错,问题更可能出在算法,还是标签定义?

本部分小结

这些算法都能做文本分类,但它们处理“线索”的方式并不一样。

NB
看词证据
适合关键词很强的任务,跑得快,适合先做基线。
LR
做加权打分
是课程里最稳妥的第一版 baseline,也最容易解释。
TREE
走判断流程
适合讲“如果 A 又 B”这类组合规则,但更容易过拟合。

Part 2提示词工程(Prompt Engineering)

一个基本原理:先定标准,再写 Prompt

在这个评论二分类任务里,prompt engineering 不是“想一句更厉害的话”,而是先把 negative / non_negative 的判别标准固定下来,再把它稳定地写进输入。

PRINCIPLE 1
先固定标签含义
先想清楚什么叫 negative,什么叫 non_negative,不要一边写 prompt 一边改标准。
PRINCIPLE 2
再补边界规则
像“早餐普通但还能接受”这种边界评论,要提前写清楚,否则模型很容易漂。
PRINCIPLE 3
最后组织输入结构
示例、规则、当前评论怎么排,决定了模型能不能稳定复现同一套分类口径。

少样本学习(Few-shot Learning)

继续用前面的评论二分类任务为例:few-shot 的作用,就是先拿几条已经标好 negative / non_negative 的评论,把分类口径喂给模型。

WHAT
先给示例
先放 2 到 5 条已经标好标签的酒店评论,让模型看到这次到底在分什么。
WHY
再校边界
真正该放进去的,不是最明显的差评,而是“有点抱怨但还能接受”这类最容易分歧的评论。
GOAL
最后再做泛化
目标不是让模型背这几条评论,而是让它学会这门课前半部分一直在用的分类标准。

输入 Prompt 的六段骨架

还用同一个酒店评论分类任务。更稳的写法,不是只写一句“请分类”,而是把这个输入 prompt 拆成几个固定段落。

1
身份
例如:你是中文酒店评论分类助手。
2
任务
例如:把每条评论判成 negativenon_negative
3
标签定义
明确什么算负面,什么算轻微抱怨但总体可接受。
4
边界规则
把“早餐普通但还能接受”“补送后是否仍算负面”这种边界写清楚。
5
示例
优先放最容易误判的评论示例,而不是最典型的差评。
6
当前输入
把本次待判别的那条评论单独放在最后,避免和示例混在一起。

零样本 Prompt 示例

先不给示例,只拿前面那套评论分类规则直接去判一条新评论,这就是 zero-shot。

你是中文评论分类助手。

任务:把评论标成 `negative`
或 `non_negative`。

规则:
1. 退款、异味、失联,判 `negative`。
2. 轻微不满但总体接受,判 `non_negative`。
3. 输出 JSON:
{"label": "...", "reason": "..."}
评论:
“位置方便,但早餐普通,整体还能接受。”
{
  "label": "non_negative",
  "reason": "有轻微抱怨,但总体仍可接受"
}

Few-shot 示例的边界校准作用

对这个评论二分类任务来说,few-shot 最有价值的地方,就是先把最容易摇摆的评论边界钉住。

边界评论 标签 为什么值得放进 prompt
位置方便,但早餐普通,整体还能接受。 non_negative 提醒模型:轻微抱怨不自动等于负面。
外卖送到时已经凉了,不过客服马上补送了。 negative 提醒模型:即使有补救,也可能仍然是负面体验。
隔音一般,这个价位也就这样吧。 non_negative 提醒模型:模糊表达最容易误判,需要提前定规则。

Prompt 设计中的歧义表达问题

还是以前面的评论分类为例。如果标签标准写得模糊,模型每次判 negative 的边界都可能变。

歧义表达

例子:“帮我判断哪些评论比较差。”
问题:“比较差”到底等不等于 negative?轻微抱怨算不算?
结果:同一条“早餐普通,整体还行”的评论,模型可能一会儿判负面,一会儿不判。
vs

可执行表达

例子:“明确抱怨退款、异味、客服失联,标成 negative。”
补充:“轻微不满但总体接受,标成 non_negative。”
结果:这样写之后,前面那批评论的判别标准才能前后一致。

一个实用 Trick:先写排除规则

做评论二分类时,很多误判不是因为模型不知道什么叫 negative,而是因为你没有写清楚什么情况不算 negative

WITHOUT TRICK
只写正向规则
“退款、异味、客服失联,判为 negative。”

问题是:模型容易把“早餐普通”“隔音一般”这类轻微抱怨也往负面里塞。
WITH TRICK
补一条排除规则
“轻微不满但总体接受,不算 negative。”

这一句会直接帮模型守住边界,特别适合处理“还行”“一般”“能接受”这类模糊评论。
可直接复用的写法: 除非评论出现明确且实质性的负面体验,否则不要判为 negative; 轻微抱怨但总体接受,统一判为 non_negative

长上下文输入的组织原则

如果你要一次性把“标签定义 + 边界规则 + 几条评论示例 + 当前待分类评论”都放进去,就必须把顺序排清楚。

前面放静态内容
角色、任务、标签定义
中间放规则与示例
边界规则、few-shot 评论
最后放当前输入
本次待分类的评论文本
写法上也要分区: 对这个评论分类任务,可以用 Markdown 标题、编号步骤,或 XML 标签把 <instructions><examples><input> 分开,这样模型更不容易把“示例评论”和“本次待判别评论”混在一起。

复杂任务的 Prompt Chaining

如果这门课里的评论分类任务还要求你同时抽取抱怨点、给标签、写理由,那就不要一条 prompt 全做完。

STEP 1
先抽取关键信号
先从评论里抽出退款、异味、失联、态度差等线索,不急着判 negative
STEP 2
再做标签判断
再根据这些线索,判断这条评论是 negative 还是 non_negative
STEP 3
最后生成简短理由
最后只补一句简短理由,例如“存在退款投诉且客服失联,因此判为 negative”。
对前面这个评论分类任务来说,这种“抽取线索 → 判断标签 → 输出理由”的链式提示,往往比一条 prompt 包打天下更稳定。

主流模型的输入提示偏好差异

即使都是在做前面那个评论二分类任务,不同平台对这条输入 prompt 的组织方式也有不同偏好。

OPENAI
清楚分角色,提示要直接
例如把“你是中文酒店评论分类助手”放在上层角色里,再把标签定义、few-shot 评论和当前评论放进输入;写得直接,通常比堆很多修辞更稳。
ANTHROPIC
强调 XML 标签和多样示例
把这个分类 prompt 分成 <instructions><examples><input> 三段,会更清楚;few-shot 评论最好兼顾典型样本和边界样本。
GEMINI
强调分区和格式示范
对这类评论分类任务,先示范目标输出格式也很重要,例如先示范一条 {"label":"negative","reason":"..."},再喂当前评论。

本讲总结

前半段讲模型怎么做同一个评论分类任务,后半段讲怎么把这个任务稳定地写进输入 prompt。

PART 1
有监督学习算法
朴素贝叶斯看词证据,逻辑回归做加权打分,决策树走判断流程。
PART 2
Prompt Engineering
围绕同一个 negative / non_negative 评论分类任务,输入 prompt 要有骨架、有顺序,也要把边界样本写进去。
一句话总结: 前半段是在学“模型怎么给评论分类”,后半段是在学“怎么把同一套分类标准写成更稳定的输入 prompt”。