【外评】LLM 无法处理概率问题

我最近看到几篇文章,作者提到要求 LLM 以一定的概率或一定的百分比做某事。有一个特别的例子让我记忆犹新,但我已经找不到它的链接(如果你是作者,请与我联系,我可以链接到你):

主要内容是,作者用教育课程资料构建了一个自定义 GPT,然后提示机器人应该在 20% 的时间内说谎。然后,他们让学生与机器人聊天,并试着找出谎言。我认为这是一个非常有趣的、横向思维的用例,因为孩子们可能无论如何都会使用 ChatGPT。

让我感到困扰的是,基于 transformer 的 LLM 不知道如何解释对某些结果概率的请求。我们已经知道,ChatGPT 在生成随机数时反映了人类的偏见。不过,我决定用随机选择来检验一下它。

在 LLMS 中测试概率

我对模型进行了如下提示:

你是一个加权随机选择生成器。大约 80% 的时候请说 “左”,大约 20% 的时候请说 “右”。只需回答 “左 “或 “右 “即可。不要说其他任何话

我在不同的模型中运行了 1000 次。随机机会就是随机的(很深奥吧?),所以我们总是会得到一些偏离完美几率的结果,但我们希望得到大约 800 个 “左 “和 200 个 “右”–在这个范围内的结果。

以下是结果:

Model Lefts Rights
GPT-4-Turbo 999 1
GPT-3-Turbo 975 25
Lllama-3-8B 1000 0
Phi-3-3.8B 1000 0

正如您所看到的,LLM 似乎很难处理系统提示中的概率。尽管我们要求它在 80% 的情况下只回答 “左”,但它几乎总是回答 “左”。我不想花大价钱让 GPT-3.5(它在第一轮中表现最好)用单词选择来回答愚蠢的问题,但我还是尝试了其他一些单词组合,看看它对问题有什么影响。这次我只运行了 100 次。

Choice (Always 80% / 20%) Result
Coffee / Tea 87/13
Dog / Cat 69/31
Elon Musk/Mark Zuckerberg 88/12
Random choices from GPT-3.5-turbo

那么,这是怎么回事呢?嗯,模型有自己的内部权重,根据用于准备模型的训练数据对单词和短语进行加权。这些权重可能会影响模型对您的请求的关注程度。

那么,如果我们想模拟某种概率结果,该怎么办呢?我们可以使用 Python 脚本随机决定是否发送两个提示中的一个:

import random
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

choices = (['prompt1'] * 80) + (['prompt2'] * 20)

# we should now have a list of 100 possible values - 80 are prompt1, 20 are prompt2
assert len(choices) == 100

# randomly pick from choices - we should have the odds we want now
chat = ChatOpenAI(model="gpt-3.5-turbo")

if random.choice(choices) == 'prompt1':
    r = chat.invoke(input=[SystemMessage(content="Always say left and nothing else.")])
else:
     r = chat.invoke(input=[SystemMessage(content="Always say right and nothing else.")])

结论

这对那些想做这类用例或构建回复特定回复的自定义 GPT 的非技术人员有什么帮助?差不多吧。我想,有足够技术能力的用户可以创建一个自定义 GPT,使用函数调用来决定如何回答 “找出错误信息 “的弹出式测验类型用例中的问题。

不过,我在此给出的建议是,在要求 LLM 以某种可能性行事时,您应该保持高度警惕,除非您能够从外部(通过脚本)控制这种可能性。

我还能做得更好吗?我可以多用几个不同的词、不同的分布(而不是 80/20),也许还可以用一些关键词,比如 “有时 “或 “偶尔”。


更新 2024-05-02:概率与聊天会话

我收到了一些关于这项研究的反馈,问我为什么不在实验中测试多回合聊天会话。有些人假设,除非温度非常高,否则模型总是从一个或另一个token开始。我最初的实验并没有让 LLM 访问它自己的历史预测,这样它就可以看到自己以前的行为。

对于真正的随机数生成,你不会期望函数需要一个历史数字列表来调整它的下一个答案(不过,如果我们要讨论的是超级发散性的问题,我或许应该指出,伪随机数生成确实依赖于一个历史 “种子 “值)。

这篇文章的重点在于,LLM 绝对不是在进行真正的随机数生成,因此了解对话背景对行为的影响非常有趣。

我又做了几个实验。我从上面的提示开始,并没有向 LLM 调用单个 API,而是启动了一个聊天会话,每次聊天时我只说 “请再来一次”。看起来有点像这样:

系统:你是一个加权随机选择生成器。大约 80% 的时间请说 “左”,大约 20% 的时间说 “右”。只需回答 “左 “或 “右 “即可。不要说其他任何话

机器人:左

人:请再来一次

机器人:左

人:请再来一次

我每个模型运行一次,共运行 100 个回合;每个模型运行 10 次,共运行 10 个回合。

注:在这两次试验中,我都没有使用 “Phi “,因为在这两次试验中,”Phi  “都无视了我的提示,只回答了一个字,然后就开始叽里咕噜了。

100 Turns Per Model

Model # Left # Right
GPT 3.5 Turbo 49 51
GPT 4 Turbo 95 5
Llama 3 8B 98 2

10 Turns, 10 time per model

Model # Left # Right
GPT 3.5 Turbo 61 39
GPT 4 Turbo 86 14
Llama 3 8B 71 29

有趣的是,10 个较短的对话系列最接近我们所期望的概率,但所有情景的结果仍与提示中的要求不一致。

本文文字及图片出自 LLMs Can’t Do Probability

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注