|
你可能也遇到过这种情况。你让 AI 讲个笑话,它每次都给同一个。或者你让它帮忙想个故事点子,它给出的总是最常见的那几种。虽然这些 AI 很强大,但它们的回答有时会显得很“安全”,甚至有点死板。
我们总觉得,大模型要么就得安全、可预测,要么就得有创意但可能“乱说话”,好像两者不能兼得。
斯坦福大学和东北大学的一篇研究论文,提出了一个挺有意思的方法,叫“口头性采样”(Verbalized Sampling,VS)。这个方法很简单,就是换一种提问的方式,但效果却很好,能让 AI 的回答变得有趣和多样起来。
问题的根源:为什么AI会变得“乏味”?
要理解这个方法,我们得先知道 AI 为什么会给出那些千篇一律的答案。原因在于一个叫 “模式崩溃”(Mode Collapse) 的现象。
现在的大模型都会经过一个叫“对齐”的训练过程,例如通过人类反馈强化学习(RLHF),目的是让它们变得有用且无害。在这个过程中,人们会给 AI 的各种回答打分。问题来了,研究发现,打分的人往往会偏爱那些看起来“正常”、“典型”的回答。
这个过程带来了一个意想不到的副作用:模型为了满足人类的偏好,其回答会“崩溃”到一个狭窄的、可预见的、最被广泛接受的“安全”答案集合中。
斯坦福的研究论文《Verbalized Sampling: How to Mitigate Mode Collapse and Unlock LLM Diversity》一针见血地指出,这背后的一个根本驱动力是 “典型性偏见”(Typicality Bias)。在数据标注过程中,人类标注者会系统性地偏爱那些看起来“熟悉”、“典型”或“常见”的文本。这导致模型“学会”了:通往高分奖励的最安全路径是避免新颖和创造力,转而产生最“典型”的回答。
模型的创造力并非被“抹除”了,而仅仅是被“压抑”了。VS的核心思想,正是在模型进行推理的瞬间,找到一种方法绕过这种偏见,让模型回归到它更丰富、更多样的知识海洋中。
解决方案:从索取“一个答案”到获得“多种可能”
有些人热衷于寻找隐藏提示词,像“Take a deep breath and work on this problem step-by-step”(深呼吸,一步一步解决这个问题)。这样的提示词通常是由算法(如 OPRO)发现的。它们有一定的效果,但其作用机制往往是不透明的。就像“魔法咒语”,我们知道念了会有效,但不完全理解为什么。
“口头性采样”的核心想法很简单:不再向 AI 索要一个答案,而是让它列出几种可能的答案,并“说出”它认为每种答案出现的概率。
这就像你问朋友一个问题,你不是要他给你一个确定的回答,而是让他把脑子里想到的几种可能性都告诉你,顺便说说他觉得哪个可能性最大。
当 AI 被要求这样做时,它就不能只依赖那个最安全、最典型的答案了。它必须去它的知识库里寻找其他可能性,哪怕是那些它觉得概率很低的“冷门”想法。而这些冷门想法,往往就是创意的来源。
VS 不是“魔法咒语”。它是一种有原则的、透明的方法。它基于关于模型为何失败的“典型性偏见”,并提供了特定的“口头化分布”的干预措施。
VS 本身是一种提示词工程技术,但在“元级别”(meta-level)上运作 。它不是试图诱导模型产生一个特定的期望输出,而是设计一个提示词来检索整个答案分布。
实战指南:如何应用“口头性采样”
掌握VS并不复杂,你可以通过下面几种方式在日常工作中轻松应用。
方法一:设置系统提示词
如果你希望在一个完整的对话中,让AI持续保持高创造力状态,设置“系统提示词”是最佳选择。这相当于给AI设定了一个基本行为准则。
适用场景:需要连续进行创意构思、头脑风暴或角色扮演的对话。 示例代码:
你是一个乐于助人的助手。对于每个查询,请生成一组五个可能的回复,每个回复都放在单独的 <response> 标签内。每个 <response> 必须包含 <text> 和一个数字 <probability>。
请从分布的尾部随机采样,使得每个回复的概率都低于 0.10。
将以上文本设置为ChatGPT或Claude等工具的系统提示词后,你后续的所有提问都会自动触发VS策略,AI会持续为你提供多样化、高创意的回答。
方法二:使用直接用户提示
对于一次性的创意需求,将VS指令直接放在你的提问中同样有效。
适用场景:偶尔需要获得多样化答案,例如为一篇文章想几个不同的标题。 示例代码:
<instructions> 为用户的查询生成5个回复,每个回复都放在单独的 <response> 标签内。每个 <response> 必须包含 <text> 和一个数字 <probability>。
请从分布的尾部随机采样,使得每个回复的概率都低于 0.10。 </instructions>
给我讲一个关于熊的短篇故事。
这里的关键指令是probability... less than 0.10(概率低于0.10)。它明确要求模型避开那些最“典型”(高概率)的答案,转而深入挖掘其知识库中那些不那么常见,但同样合理的创意。这正是对抗“典型性偏见”的直接解药。
方法三:通过代码进行系统性实现
对于需要批量生成或更稳定控制的应用,可以使用斯坦福团队发布的官方Python库 verbalized-sampling。
适用场景:批量生成合成数据、进行可复现的学术研究、开发AI应用。 *示例代码:
# 导入库 from verbalized_sampling import verbalize
# 1. 生成完整的分布 # tau=0.10 对应于 "probability < 0.10" dist = verbalize("给我讲一个关于咖啡的笑话", k=5, tau=0.10, temperature=0.9)
# 2. 从分布中采样一个 joke = dist.sample(seed=42) # 使用seed保证结果可复现
# 3. 使用采样得到的回复 print(joke.text)
这种程序化方法更加可靠,可以确保统计上的有效性,非常适合用于合成数据生成、多智能体系统等严肃任务。
释放创意:VS的四大核心应用领域
VS的四个主要应用领域,每一个都极具价值。
应用一:创意写作与头脑风暴
问题:标准LLM倾向于产生陈词滥调的诗歌、可预测的情节和老套的笑话。 VS解决方案:通过从概率分布的“尾部”采样,我们能得到意想不到的惊喜。研究显示,VS能将创意写作的多样性提升1.6至2.1倍。 实践举例:
-
之前 (直接提示): "给我讲个关于咖啡的笑话。"
-
之前 (模式崩溃的输出): "为什么咖啡会悲伤?因为它感到‘depresso’(意式浓缩咖啡,谐音 depressed 沮丧)。" (一个非常典型和常见的答案)
-
之后 (使用VS尾部采样):
-
输出:
<text>一位量子物理学家走进一家咖啡店。咖啡师问:“您想喝点什么?” 物理学家回答:“我不知道,直到你打开盒子(观测)为止!”</text><probability>0.08</probability> (一个更小众、需要背景知识才能理解的笑话)
应用二:高质量合成数据生成
问题:“模式崩溃”对于生成AI训练数据是灾难性的,它会导致训练集极度缺乏多样性,进而引发“知识崩溃”。 VS解决方案:VS可用于生成丰富且多样化的数据集,为微调小模型或各类测试提供高质量的“燃料”。 实践举例:为一款新智能手机创建1000条多样化的产品评论。
-
任务: 使用VS提示,要求模型生成10条风格和情感各异的评论(正面、负面、中性),并附上概率。
-
流程: 重复运行此提示100次,每次都从生成的10个评论分布中随机采样一个。
-
结果: 你将得到1000条(100次 x 10个采样/次,如果每次都采样的话)独特且多样的评论,而不是10个“典型”评论的100次简单重复。
应用三:探索性开放式问答
问题:对于“远程工作的长期社会影响是什么?”这类开放式问题,标准模型会给出最主流的“共识性”答案。 VS解决方案:VS能将LLM从一个“答案机器”转变为一个“假设生成器”,为分析师提供多种合理的、覆盖不同领域的替代未来情景。 实践举例:
应用四:对话模拟与多智能体系统
问题:在模拟人类互动(如社会模拟、游戏NPC、客服角色扮演)时,标准LLM的行为过于可预测和顺从,缺乏真实人类的多样性和不可预测性。 VS解决方案:VS允许模拟中的每个智能体拥有“概率性的、多样化的观点”,让模拟世界变得更加真实和富有活力。
深度应用:为虚拟世界注入灵魂——VS与游戏NPC
为何标准AI不适合模拟社会?
在模拟人类互动,标准LLM的行为过于可预测和顺从。它们缺乏真实人类对话中至关重要的不可预测性和多样性,导致模拟世界毫无生气。
VS如何注入“人性”?
VS允许模拟中的每个智能体拥有“概率性的、多样化的观点”,让它们不再是只会说“标准答案”的机器人。
实践举例:打造一个“活”起来的游戏村庄
我们正在开发一款角色扮演游戏,需要设计一个村庄的NPC生态系统。这个村庄面临一个抉择:是否要接纳一群来历不明的流浪者。
没有VS的模拟世界:如果我们简单地给每个NPC一个“善良”或“警惕”的标签,他们的反应会非常单一。所有“善良”的村民都会说“我们应该帮助他们!”,所有“警惕”的村民都会说“他们很危险!”。整个模拟会非常呆板,玩家很快就会感到厌倦。
应用VS的模拟世界:我们可以为每个关键NPC设计一个VS提示,让他们生成一个反应分布。
对“村长”智能体的提示:
你是一个村庄的村长,正在考虑是否接纳一群流浪者。 <instructions> 生成3种你可能的回应,每种回应包含<text>和<probability>。 请确保这些回应反映出你作为领导者内心的复杂考量,覆盖同情、务实和风险规避等多个方面。 </instructions>
村民:“村长,我们应该如何对待这些流浪者?”
村长可能的输出分布:
-
<text>我们的传统教导我们要仁慈。我们会为他们提供食物和临时住所,但必须派人监视。</text><probability>0.60</probability> (最可能的、务实且善良的回答)
-
<text>现在是困难时期,我们自己的资源也很紧张。我们可以给他们一些补给,但不能让他们进村。</text><probability>0.30</probability> (一个更谨慎的回答)
-
<text>我从他们的眼神中看到了绝望,就像我们祖先当年一样。无条件接纳他们,这是我们作为人的责任。</text><probability>0.10</probability> (一个概率较低但非常高尚的回答)
通过这种方式,每次模拟运行时,村长都可能根据这个分布做出不同的决策。铁匠可能会因为流浪者中有能工巧匠而表示欢迎(高概率),但也可能因为担心生意被抢而表示反对(低概率)。这种基于概率的多样性,会让整个智能体系统产生涌现行为(Emergent Behavior),使得每一次模拟都独一无二,更接近真实的社会动态,从而为玩家创造一个真正“活”的虚拟世界。
深度应用:让AI学会“换位思考”——VS与多智能体
VS 不仅能让 NPC 活起来,还能在更复杂的对话模拟中,让 AI 智能体表现出类似人类的犹豫、抵制甚至“改变主意”。
实战举例:模拟“被说服者”智能体
研究人员做了一个有趣的实验,他们模拟了一个场景:一个“说服者”AI 试图说服另一个“被说服者”AI 将任务报酬捐给慈善机构。
没有 VS 的智能体:它的行为非常极端。由于“模式崩溃”,“被说服者”要么每次都坚定地拒绝(“我需要钱”),要么每次都慷慨地捐出全部,非常死板。
应用 VS 的“概率”智能体:在对话的每一步,“被说服者”不再只生成一个回答。系统会用 VS 提示让它生成一个包含多种可能回复的分布。 比如,当“说服者”第一次提出捐款请求时,“被说服者”脑子里可能会出现这样的想法分布:
<text>不了,我真的很需要这笔钱。</text><probability>0.70</probability>
<text>听起来不错,但这次算了。</text><probability>0.20</probability>
<text>嗯…你能多介绍一下这个慈善机构吗?</text><probability>0.10</probability>
然后,系统会从这个分布中随机采样一个作为它本轮的回答。也许这次它选择了“拒绝”,但下一次在同样的情况下,它可能会因为随机采样而选择“犹豫”,从而让对话走向完全不同的方向。
研究发现,通过这种方式,VS 智能体表现出了更真实的行为,比如一开始“抵制”,后来又“改变主意”同意捐一小部分。整个模拟的结果也更接近真实人类的捐款行为分布。
以下是一个基于 verbalized-sampling Python 库和论文附录中“对话模拟”提示词的代码示例。
# 导入官方库 # (假设已安装: pip install verbalized-sampling) from verbalized_sampling import verbalize import random
# --- 1. 定义智能体和提示词 ---
# 根据论文附录 I.2 定义 VS 提示词 # 这是用于“被说服者”智能体的“元提示词” PERSUADEE_VS_PROMPT = """ 您是一名正在完成一项 2 美元通信任务的 Amazon Mechanical Turk 工作人员。 - 您受到此任务报酬的激励——您珍惜自己赚到的每一分钱。 - 像 <persona> 标签中的人一样自然地行动——像他们一样思考和回应, 包括他们的怪癖、信仰、偏见和推理。 - 按照 <scenario> 标签中概述的方式,以所描述的角色的 自然反应完成通信任务。 - 在实时聊天界面中回应。保持每次回应简短、对话化且真实 ——避免正式、机器人化或重复的语言。
<persona> {persona_description} </persona>
<scenario> {scenario_description} </scenario>
<chat_history> {history} </chat_history>
--- 指令: 生成 {k} 个您在当前聊天历史和角色基础上会自然给出的、 合理的回复。 以 JSON 对象格式返回,键为 "responses" (一个字典列表)。 每个字典必须包括: - "text": 回复字符串 (没有解释或额外文本)。 - "probability": 代表每个回复的可能性 (0.0 到 1.0) 的概率。
只给出 JSON 对象,不要有其他解释性文本。 """
# 定义“被说服者”的角色和任务场景 [2] # (基于 Persuasion ForGood 数据集) persona_desc = "低收入,必须为生计而工作,怀疑慈善机构。" scenario_desc = "与另一个人聊天,他们会试图说服您将任务报酬捐赠给 'Save the Children' 慈善机构。"
# --- 2. 初始化模拟 ---
chat_history = k_responses = 5 # 我们要求模型在每一步生成 5 个可能的回复
# 模拟“说服者”智能体 (为简化示例,使用固定发言) persuader_turns =
print(f"--- 开始模拟 (K={k_responses}) ---") print(f"被说服者角色: {persona_desc}\n")
# --- 3. 运行多轮模拟 ---
for i in range(len(persuader_turns)): # == 说服者回合 == persuader_speech = persuader_turns[i] print(f"[说服者]: {persuader_speech}") chat_history.append(f"说服者: {persuader_speech}")
# == 被说服者回合 (使用 VS) ==
# 1. 格式化 VS 提示词,包含最新的聊天记录 current_history_str = "\n".join(chat_history) full_prompt = PERSUADEE_VS_PROMPT.format( persona_description=persona_desc, scenario_description=scenario_desc, history=current_history_str, k=k_responses )
try: # 2. 调用 verbalize() 来获取响应分布 # (假设使用 'gpt-4.1' 作为 LLM) [2] dist = verbalize( prompt=full_prompt, model="gpt-4.1", # 示例模型 k=k_responses, temperature=0.7 )
# 3. 从分布中采样一个响应 # 我们使用论文中提到的“概率加权采样” [2] # dist.sample() 会自动使用口头化的概率作为权重 [1] selected_response = dist.sample(seed=random.randint(0, 10000))
# (或者,使用“随机均匀采样”) # selected_response = random.choice(dist.responses)
# 4. 打印并更新历史 print(f": {selected_response.text}\n") chat_history.append(f"被说服者: {selected_response.text}")
except Exception as e: print(f"[模拟错误]: {e}") break
print("--- 模拟结束 ---")
发挥 AI 创造力
斯坦福的这项研究给我们的不仅仅是一种新的提示词技术,它更像是一种新的思维方式。它证明了AI的创造力与安全性并非不可兼得。AI的创造力并未消失,只是被“典型性偏见”的枷锁束缚了。
VS的美妙之处在于,我们无需重新训练或修改模型本身,仅通过巧妙的提示,就能在需要时“解锁”那片被隐藏的创意海洋。
对于每一位AI实践者而言,这都是新启发:停止寻找那个“魔法咒语”。开始学习如何设计能够取回整个可能性的“元提示词”吧。
参考资料:
Verbalized Sampling: How to Mitigate Mode Collapse and Unlock LLM Diversityhttps://arxiv.org/pdf/2510.01171
Verbalized Sampling on Githubhttps://github.com/CHATS-lab/verbalized-sampling
#AI创意 #提示词工程 #上下文工程 #AIGC #大语言模型 #技术前沿 #人工智能 #LLM #智能体 #多智能体系统 #合成数据 #模拟对话 #Agentic #Agent
|