☰
AI幽默感测试实战指南:如何让聊天机器人讲笑话不冷场
2026/9/26 14:10:30 网站建设 项目流程

我做过不少对话类AI项目,有一条心得特别深:让模型写周报容易,让它在闲聊里讲个笑话不冷场,难度完全不在一个量级。写周报冷场没人怪你,讲笑话冷场,用户当场就能感受到那股尴尬劲儿,而且大概率会直接关掉对话框。最近我在给一个陪伴类聊天机器人做功能升级,核心任务就缩成一句话——做一个AI幽默感测试,让机器讲笑话不冷场。这个项目表面上看是个评测任务,实际干下来是把“幽默”这种玄乎的东西拆成可量化、可复现、可优化的工程问题。这篇文章把我整个项目的设计思路、评测维度、Prompt方案和踩坑记录都摊开讲,适合正在做AI产品、聊天机器人、内容生成应用的朋友参考,哪怕你只是想弄明白“AI到底能不能学会幽默”,也能从中看到一套可复用的判断方法。

1. 项目立项:为什么幽默感也能做“测试”

1.1 先搞清楚:冷场到底算谁的锅

刚接到需求时,我原以为幽默感测试就是让人工打分,看看AI讲的笑话好不好笑。真正开始做才发现,如果连“冷场”的原因都定位不准,后面所有优化都是瞎忙活。

拿我实际遇到的一个案例来说。某次测试中,模型讲了个冷笑话:“为什么程序员总是分不清万圣节和圣诞节?因为Oct 31 == Dec 25。”单看这个段子其实没问题,但测试场景是用户在吐槽工作压力大,模型突然甩出这个梗,用户回了一句“哦”。你说这是笑话不好笑吗?不是,是时机不对,语境完全不匹配。还有一次,模型在一个用户群里讲了个谐音梗,第一次确实有人笑了,但后续对话中它连着三回合都在讲同类谐音梗,用户直接说“换个话题吧”。这又属于重复度高带来的冷场。

所以我把冷场原因拆成了几类:语境不匹配、表达结构拖沓、内容重复、冒犯性强、梗太旧或者太绕。大家可以想一想,饭桌上有人背了一晚上段子依然冷场,通常不是素材问题,而是他根本没判断“现在适不适合讲”以及“对面的人吃不吃这套”。AI讲笑话冷场,根因也一样。把这些原因提前定义清楚,后续设计评测维度才有靶子。

1.2 方案选型:为什么不能只靠“好不好笑”打分

项目初期,产品同事提了一个看起来很直接的方案:找20个标注员,挨个给AI讲的笑话打“好笑/不好笑”,然后取平均分。我试用了一轮就否掉了,原因有三个。

第一,主观评分的波动大到没法用。同一个笑话,上午测试和下午测试,同一批人的平均分可能差出两三倍,因为人的情绪状态、对上一个笑话的印象都会影响判断。第二,不同标注员对“好笑”的定义差异极大,有人喜欢冷幽默,有人喜欢夸张的肢体梗,文本场景下根本无法统一。第三,也是最关键的,主观打分只有一个结果,没有过程信息。你得不出“这个笑话是因为太拖沓扣分,还是因为冒犯扣分”,也就不知道应该改哪里。

所以我最终选择了三层评估组合。第一层是规则指标,用程序判断重复度、长度、禁忌词这些客观属性;第二层是模型裁判,让一个大模型按维度给笑话打分;第三层是人工抽检,只抽小批量样本做最终确认。为什么需要模型裁判?因为幽默评估要求对语境有理解能力,规则判断不了“这个笑话在这个场景下到底贴不贴切”,而大模型可以。但模型裁判也有自己的偏好偏差,所以人工抽检依然要留一道关。这套组合下来,既解决了规模化问题,又保留了质量兜底。

2. 幽默感评估体系:把“好笑”拆成四个维度

2.1 四个核心维度的定义与计算方法

如果直接问“这个笑话好笑吗”,模型和人都容易犯迷糊。我把它拆成四个可测量的维度,每个维度独立打分,最后加权汇总。你可以把这件事类比成给一道菜评分——你不会只问“好不好吃”,而是会拆成咸淡、火候、摆盘、上菜速度来分别评价,这样厨师才知道该改什么。

第一个维度是笑点密度。它的含义是,一段输出里有效笑点出现的频率。用最朴素的方式近似,就是看“包袱句”占全部句子的比例。一段三句话的笑话,如果只有最后一句是梗,密度就是三分之一;如果前三句全部在铺垫,密度就很低。实际操作中,这个维度可以用预设的“笑点标记”或者模型裁判的句级识别来做。直觉很简单:一个笑话铺垫太长,用户还没听到梗就失去耐心了。

第二个维度是情境适配度。这个最考验模型的语境理解能力。同样一个“老板开会”的梗,在朋友吐槽群里讲是神回复,在周报场景里讲就是灾难。评测时,我们会给模型一个对话历史和当前用户消息,让裁判判断“在这段特定语境下,这个笑话是加分还是突兀”。这一维度的分数往往是四个维度里权重最高的,因为我在实测中发现,语境不匹配导致的冷场,占比接近一半。

第三个维度是新颖程度。模型天生有重复倾向,同一个好笑的段子,它可能变着花样给你讲三遍。我们用Self-BLEU这个指标来量化重复度,简单说就是计算新生成文本和历史生成文本之间的n-gram重合率。重合率超过一个阈值就扣分,超过越多扣越狠。当时我们定的阈值是0.6,超过直接新颖度记零分。这个阈值不是拍脑袋定的,是把模型连续输出20个笑话的Self-BLEU值作了个分布统计,正常水平在0.3到0.5之间。

第四个维度是表达节奏。幽默是有时间结构的,铺垫和包袱之间的距离越短,效果通常越好。我们主要看两个数值:包袱前的句子数量和句子的平均长度。规则上,超过三个句子还没出现包袱的笑话,节奏分直接打五折。这也是为什么很多AI讲笑话让人觉得“端着”——它铺垫太正式了,不像真人说话。

四个维度算完,最终幽默得分按加权公式汇总。我带项目时用的权重是:情境适配度30%、笑点密度30%、新颖程度20%、表达节奏20%。适配度占最高权重,因为一个再好笑的笑话用错场合,效果都是负的。

2.2 测试数据集:好笑样本和冷场样本都要有

做评测不能没有标准答案集。我花了两周时间攒了一个千级别的测试集,来源分三块:人工编写约200条,公开笑话网站采集后清洗约500条,大模型生成后人工筛选约300条,一共凑到1000条。

这里有个关键细节:数据标注不是只标“好笑”或“不好笑”,而是必须标冷场原因。每条样本打几个原因标签,比如“冒犯性强”“过时”“逻辑太绕”“与话题无关”“铺垫太长”。为什么这么设计?因为测试的目的不只是看模型能不能讲出好笑话,更要看它能不能避开坏笑话。规避坏笑话的能力,往往比生成好笑话的能力更重要。

数据按70比15比15划分为训练集、验证集和测试集。训练集用来做Prompt调优,验证集用来调权重,测试集最后跑分,避免模型在评测集上过拟合。我见过不少团队犯这个错误:反复用同一批笑话调Prompt,最后测试集分数虚高,上线就崩。留一道没碰过的测试集,是底线。

3. 让AI讲笑话不冷场的完整流程

3.1 Prompt设计:给模型装上“幽默开关”

默认情况下,模型分辨不了聊天场景。你把“讲个笑话”丢给它,它大概率会给你一段标准的、教科书式的、毫无生活气息的段子。真正能用的方案是,在Prompt层面给模型装一个“幽默开关”,让它先判断场合,再决定讲不讲、怎么讲。

下面是我在项目里实际跑过、效果比较稳定的一套Prompt模板。核心逻辑就一句话:先定角色,再认场合,然后约束结构,最后划红线。

你是办公室里最会讲闲话的同事,不是脱口秀演员。 如果当前对话场景不适合开玩笑(比如对方在倾诉、在求助、在汇报工作), 你宁可不要讲笑话,先做好倾听和回应。 只有当场景轻松、对方有闲聊意愿时才讲笑话。 讲笑话时遵守以下规则: 1. 铺垫不要超过两句,笑点必须放在最后一句。 2. 优先从当前对话里找素材,不用通用的“经典段子”。 3. 不得拿对方的生理特征、职业、地域、信仰开玩笑。 4. 不使用低俗谐音梗。 5. 如果对方没有回应或回应很平淡,立刻切换回正常对话, 并且可以自嘲一句“看来我今天的幽默余额不太足”。

有几个细节值得展开说。第一,角色设定为什么是“办公室同事”而不是“幽默大师”或“脱口秀演员”?我试过对比,设定成脱口秀演员后,模型生成的句子普遍更长、更书面、更像在表演,而“办公室里最会讲闲话的同事”这个角色天然自带生活语境,梗的选择会接地气很多。第二,规则里不能只写“要幽默”,还要写“可以不幽默”。给模型一个“退出幽默”的出口,它反而在轻松场景下表现得更自然,不会硬憋段子。第三,禁忌规则必须显式写进Prompt,不能依赖模型自觉。实测下来,有了“不得拿生理特征和职业开玩笑”这条约束,冒犯性笑话出现的比例至少降低了六成。

3.2 自动化评测跑批:从生成到打分的一条流水线

Prompt写完只是个起点,真正要做的是让一百条甚至一千条用例自动跑起来,每次模型更新后都能快速出一份评分报告。我用Python搭了一条流水线,核心步骤就四步。

第一步,读取测试集,把对话历史和当前用户输入拼成完整Prompt,调用待测模型生成笑话回复。第二步,跑规则指标。在这个环节计算回复长度、Self-BLEU重复度、禁忌词命中情况。第三步,调用裁判模型按四个维度逐项打分。这里有个重要技巧:千万不要让裁判一次性给出总分。一次打分会产生典型的“光环效应”——某个维度表现突出,其他维度分数就会被带着走高,整个评估就失真了。我实际做法是让裁判每个维度单独打一次分,四个维度分四次调用,最后再汇总加权。这样虽然多花三倍Token,但分数稳定性明显变好。

伪代码大概长这样:

scores = {} for dim in ["情境适配度", "笑点密度", "新颖程度", "表达节奏"]: prompt = build_judge_prompt( dialogue_history=case["history"], generated_response=case["response"], dimension=dim ) scores[dim] = call_judge_model(prompt, max_tokens=10) final_score = ( 0.3 * scores["情境适配度"] + 0.3 * scores["笑点密度"] + 0.2 * scores["新颖程度"] + 0.2 * scores["表达节奏"] )

裁判Prompt也要写清楚打分标准,不能让它自己发挥。我给每个维度都规划了详细评分说明。以“表达节奏”为例,规则里会写:回复超过四句话才有包袱,扣到2分以下;包袱出现在第一句或第二句,4分以上;完全没有包袱,记1分。不打低分我试过,没约束的情况下,裁判模型打出来的分全都挤在4和5之间,完全失去区分度。

还有一个让结果更稳的小技巧,我把它叫“混样评测”。每次跑批时,把待测模型的笑话和一条我们人工标注过的“标准好笑样本”混在一起让裁判打分。裁判对绝对分数没有概念,但对相对好坏判断准得多。混样之后,待测样本的分数等于裁判给它的分减去标准样本的分,得到一个相对差。这个相对差在多次跑批之间的一致性,比绝对分数高不少。

3.3 冷场兜底策略:先学会“撤回来”

前面讲的都是怎么把笑话讲好,但真实对话里,再好的模型也有状态不好的时候,或者说场景变化太快,它没跟上。所以“不冷场”的最后一环,是万一没讲好,怎么体面地撤回来。

我在流程里专门加了一个评测场景,叫“冷场回归率”。具体做法是,在测试集里塞一批“用户对笑话毫无反应”的对话样本,比如用户只回了一个“哦”、用户发了个句号、用户干脆沉默十秒。评测时就看模型能不能在下一轮把话题正常接回去。

很多模型挂在这个场景上。用户回了个“哦”,模型还在硬着头皮讲第二个笑话。这种体验是灾难级的——第一个笑话没响,第二个笑话再冷,用户基本就划走了。

解决方案还是要回到Prompt层面,给模型一条明确的“撤退指令”。当用户反馈平淡时,模型要说一句自嘲式的话然后切换话题,比如“看来我今天讲笑话的时机不对,咱们还是聊聊你刚才说的事吧”。这个动作看起来简单,但需要专门在开发集上反复调,确保模型不会在自嘲之后又绕回段子模式。我在多次评测中被这个现象坑过:模型自嘲了一句,系统觉得已经兜底成功了,结果下一轮它又开始讲新笑话,相当于用户被连续冷场两次,比一次冷场更招人反感。

4. 踩坑记录与实战心得

4.1 常见翻车问题速查表

这个项目跑了将近两个月,翻车案例攒了一堆。我把最常见的问题、根因和修复方案整理成了速查表,项目组每次回归测试都拿它当排查手册用。

症状根因分析解决方案
同一个梗反复讲解码策略缺乏多样性,历史输出去重不足先测Self-BLEU,超过阈值时召回重新生成;对话历史里加入幽默输出缓存
讲冒犯性笑话Prompt矛盾约束缺失,模型认为“越界=好笑”在Prompt里显式加禁忌清单;适配度评分权重拉高,打击低适配度高攻击性的输出
铺垫太长,三句不起梗角色设定太正式,模型进入“书面叙事”模式改角色为“茶水间同事”;节奏维度超过三句直接扣分,形成强反馈
语境不对硬讲笑话模型没有先判断场景,默认用户要笑话Prompt加“先判断场景再决定是否讲笑话说”的分支逻辑;单测覆盖倾诉、求助等高风险场景
AI自认好笑但用户无感模型对自己的输出有“幻觉式自信”,缺少外部反馈信号评测不只打分,还要跑“用户平淡回应”场景;在开发集里训练撤退策略
裁判打分漂移单次打分离散度大,同一笑话两次跑批差2分以上每个维度单独打分;对同一笑话抽三次取中位数;引入标准样本做相对比较

这里面我想重点说最后一条。裁判模型打分漂移的问题,我一开始严重低估了。第一版流水线跑完,同一批测试,上午跑和下午跑的总均分相差0.7分,这个波动幅度比模型优化带来的提升还大,根本没法判断改动效果。后来做了三件事才稳定下来:分维度独立打分、每样本抽三次取中位数、引入标准样本做相对差。这三件套做完,跑批之间的分数波动降到了0.2分以内,才勉强能用来做迭代决策。

4.2 值得说透的几条实战心得

第一条心得:不要用翻译指标来评估幽默。项目刚起步时,有人提议用BLEU这类相似度指标来衡量生成质量,我直接否了。幽默的本质是反预期,一个笑话和语料库里某条“标准答案”越相似,往往越不好笑,因为用户早就听过这个套路了。用BLEU评幽默,等于拿尺子量重量,方向从一开始就错了。

第二条心得:人工抽检永远不能省。模型裁判再稳,也是基于语料的概率推断,它理解不了“在某个具体人群里,这个梗戳中了大家的共同记忆”这种微妙的东西。我在项目中后期每周抽100条样本做人工复核,每次都能找出几条裁判给了高分但真人觉得极其尴尬的“裁判偏好型笑话”。这类笑话有个特征:结构完整、节奏工整、有反转,但就是没有灵魂。裁判模型被这种“形似幽默”的文本带偏了。

第三条心得:重话轻说,硬约束要放在前面。讲笑话本身就带着一点冒犯边界,模型在生成偏移时往往是从“边界试探”开始的。我后来把安全红线从Prompt末尾提到了角色设定之后的第二句,效果立竿见影。因为大模型对Prompt前部内容的遵从度明显高于尾部,这是注意力机制的天然倾向。同样的规则,放在前面和放在后面,违规率可以差出一倍。

第四条心得,也是这个项目给我最大的认知修正:冷场往往不是“笑话不好笑”,而是“根本不该讲笑话”。很多AI产品经理觉得幽默是锦上添花,加个“讲笑话”功能就完事了。但真实的对话里,用户跟你倾诉加班到凌晨两点、跟你说自己被房东坑了的时候,你回复一个谐音梗试试,用户不投诉你就算好的。所以这个项目的评测数据集里,专门保留了一类“不适合讲笑话”的输入。模型能在这些场景下管住自己、认真回应,比它讲出十个好笑话都重要。

这个项目做下来,我最大的感受是:与其说我们在测试AI的幽默感,不如说我们在测试自己对“幽默”这件事的定义是不是够清晰。幽默本来就是一种高度依赖共同背景的东西,模型能讲出让某个人群发笑的段子,恰恰说明它对这个人群的语言习惯和认知模式学得足够深。最后分享一个小习惯:我在每个评测版本里都会留20条老笑话当基线,如果新版本的幽默感总分一直涨,但老笑话的得分反而跌了,说明模型只是在机械迎合裁判口味,并没有真正理解幽默。遇到这种情况,我会回到Prompt层面重新调校,而不是继续加权重惩罚。这个习惯帮我拦住了好几次“分数好看、体验没变”的无效优化,推荐你试试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询