ITPub博客

首页 > 人工智能 > 人工智能 > 一种新型的AI决策模型?

一种新型的AI决策模型?

人工智能 作者:ITPUB社群 时间:1970-01-01 08:33:46 0 删除 编辑


TypeSafe.AI 最近发布了其首个模型 Jev。他们声称这是首个新型模型(System One 模型),与我们过去几年一直在使用(并大肆宣传)的大语言模型(LLM(大语言模型))有着本质区别。

这个新模型似乎特别适合许多日常用例,例如分类(如 NPS 评论的主题建模)或 LLM-as-a-judge 任务。所以,我自然决定必须试一试。

在本文中,我们将探讨 System One 模型与 LLM 的区别,并以客户支持请求的意图分类为例,在实践中检验 TypeSafe.AI 的一些说法。

System One 模型与 LLM 有何不同

LLM 被训练来预测下一个 token,并生成我们一直在享受的长文本和对话,而 System One 模型则被构建来评估一个状态并产生结构化答案。与 LLM 类似,System One 模型可以接受自然语言作为输入,因此在这方面没有真正的区别。

你可以在文档中找到有关训练过程的更多细节。Jev 有趣的地方在于其训练后方法。LLM 大多通过 RLHF(基于人类反馈的强化学习)进行训练后处理,这教会它们与人类偏好保持一致。但这也可能导致我们在实践中都见过的谄媚和听起来自信的幻觉。这对于聊天机器人来说效果很好,但对于涉及决策的用例,TypeSafe 提出了不同的方法。

对于 Jev,他们使用 RLCD(用于校准决策的强化学习),训练模型同时返回决策和概率。

让我们看看这个模型如何工作,以及它的输入和输出是什么样的。

模型的输入被称为状态(state)。状态定义了你想要提供给模型的上下文,以及你希望它回答的问题。它可以像单条消息一样简单,例如客户请求“Is it possible for me to change my PIN number?”,也可以是一个 JSON 对象。

  • 一个包含多个字段的映射,例如 {"message": "Is it possible for me to change my PIN number?", "user_id": 123}

  • 一个表示消息或记录序列的数组,例如 ["Hello! How can I help you?", "Is it possible for me to change my PIN number?"]

最佳实践是使用带有清晰字段名的对象作为状态,这样模型更容易对上下文进行推理。

除了上下文之外,我们还可以向模型传递一个或多个问题。由于 System One 模型不会生成自由形式的回答,我们需要使用可用的原语之一来指定预期的答案类型:

  • Choice 适用于答案应该是几个预定义选项之一的情况。例如:这个客户请求是关于什么的——配送、账单还是账户访问?

  • Score 可用于答案来自一组有序值的情况。例如:这条客户消息的情感是什么——负面、中性还是正面?

  • Noul 可用于是/否问题。例如:客户的问题在这次对话中是否已解决?

在所有这些情况下,我们不仅得到答案本身,还能得到所有可能值的概率。置信度是 Jev 的重要组成部分,因为它告诉我们模型对自己的决策是否有信心(例如,当大部分概率集中在某一个值上时),还是在不确定的情况下,几个选项的概率大致相近。

当我们需要基于模型输出做出决策时,这些置信度水平尤其有用。以客户问题的自动回复为例:如果模型能够以高置信度将客户请求分类到已知类别之一,我们就可以发送自动回复。否则,我们可以将消息转接给人工支持智能体。

实践

Jev 声称速度快 193.6 倍、成本低 444.6 倍,并且更不容易产生幻觉。让我们通过与熟悉的大语言模型(LLM)进行对比,看看这些说法在实践中是否站得住脚。

在这个实验中,我选择了 OpenAI,因为 TypeSafe 的基准测试显示 Jev 的表现与 OpenAI 的 Terra 模型相当。

我还决定使用 PolyAI 在 CC BY 4.0 许可下发布的公开银行意图数据集。这是一个相当有趣的分类问题,包含 77 个不同的意图类别(这相当多)。

数据样本。

使用 Jev

让我们从调用 Jev 模型开始。要获得访问权限,你需要注册(目前有等待名单)并获取 API(应用程序编程接口) 密钥。在我的情况下,大约花了半天时间才收到邀请。

对于我们的分类任务,我们将使用 Choice 原语来提问。我们没有类别的额外描述,因此将它们保留为 null。

接下来,我们只需发起一个 HTTP 请求,并传入所有必需的信息(state 和 question 原语)。

INSTRUCTIONS = (
"Classify this banking customer support message into its intent category. "
"Choose the single category that best matches what the customer is asking about."
)
JEV_URL = "https://api.typesafe.ai/v1/systemone"
def call_jev(text, labels, instructions, model="jev-latest"):
"""Ask Jev to pick exactly one label."""
response = requests.post(
JEV_URL,
headers={"Authorization": f"Bearer {JEV_API_KEY}"},
json={
"state": text,
"model": model,
"questions": {
"label": {
"type": "choice",
"instructions": instructions,
"criteria": {label: None for label in labels},
}
},
},
timeout=60,
)
response.raise_for_status()
body = response.json()
answer = body["answers"]["label"]
return {
"label": answer["choice"],
"confidence": answer.get("confidence"),
"input_tokens": body["usage"]["input_tokens"],
"output_tokens": body["usage"]["output_tokens"],
}
example = records[0]
print("text      :", example["text"])
print("true label:", example["label"])
# text      : How do I link this new card?
# true label: card_linking
jev_answer = call_jev(example["text"], LABELS, INSTRUCTIONS)

结果,我们得到一个 JSON 对象,其中包含答案以及所有可能选项的概率。在这个例子中,我们可以看到模型非常确信正确答案是 card_linking。

{
"model": "jev-1.13.0",
"answers": {
"label": {
"type": "choice",
"choice": "card_linking",
"confidence": 1.0,
"probabilities": {
"why_verify_identity": 0.0,
"cash_withdrawal_charge": 0.0,
"declined_card_payment": 0.0,
"top_up_reverted": 0.0,
"card_linking": 1.0,
"transaction_charged_twice": 0.0,
"pending_cash_withdrawal": 0.0,
"card_delivery_estimate": 0.0,
"pending_card_payment": 0.0,
"visa_or_mastercard": 0.0,
"declined_transfer": 0.0,
-- skipped some intents
"age_limit": 0.0,
"verify_top_up": 0.0,
"exchange_via_app": 0.0,
"get_disposable_virtual_card": 0.0
}
}
},
"usage": {
"input_tokens": 1036,
"output_tokens": 827
}
}

使用 OpenAI

为了进行比较,我们将使用 OpenAI 的 Luna 和 Terra 模型。为了使设置具有可比性,我们还将为 OpenAI 模型指定输出 schema,从而将其响应限制为相同的结构化格式。

def call_openai(text, labels, instructions, model):
"""Ask an OpenAI model the same question, constrained to the same labels."""
response = openai_client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": instructions},
{"role": "user", "content": text},
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "classification",
"strict": True,
"schema": {
"type": "object",
"properties": {"label": {"type": "string", "enum": labels}},
"required": ["label"],
"additionalProperties": False,
},
},
},
timeout=60,
)
return {
"label": json.loads(response.choices[0].message.content)["label"],
"confidence": None,  # OpenAI does not give us one
"input_tokens": response.usage.prompt_tokens,
"output_tokens": response.usage.completion_tokens,
}

遗憾的是,OpenAI 模型目前不返回对数概率,因此我们无法直接从中获取模型的置信度分数并与 Jev 进行直接比较。

对比

TypeSafe 将 Jev 定位为与 Terra 大致相当,并略微领先于 Luna,同时速度显著更快、成本更低,尤其是在涉及多个决策或模型调用的工作流中。

让我们看看这如何转化为我们的用例,尽管这个任务相当简单,只需要一次调用。在准确率方面,Jev 的表现明显差于两个 OpenAI 模型:79.0%,而 Terra 为 83.9%,Luna 为 86.2%。这一差异具有统计学显著性。

我们还可以看到,Jev 使用的 token 明显更多(输入 token 约多 2 倍,输出 token 约多 40 倍),这主要是因为它是为全部 77 个意图返回概率。因此,即使单 token 价格更低,我也不认为在这个特定用例中它最终会比 Luna 便宜很多。

然而,速度提升确实非常显著:Jev 快了近 2 倍。

真正令人印象深刻的是置信度分数的校准程度:准确率随着置信度分桶的升高而持续增加。

我还做了一些实验,想了解为什么 Jev 在这个任务上表现不佳。我最好的猜测是类别数量过多是主要问题。当我将任务从 77 个标签减少到仅 7 个时,结果显著改善,并且大致与 OpenAI 模型持平。

你可以在 GitHub 上找到所有代码。

我们已经了解了这个新模型的工作原理并将其付诸实践,现在是时候总结一下经验了。

总结

我非常喜欢 System One 模型的发展方向,因为我能看到它们在我工作中处理的不少任务上很有用,比如 LLM-as-a-judge 评估或意图分类。

正如我们所见,质量并不总是能与 LLM 媲美,但校准良好的置信度分数是一个很大的优势。它们可能使得对较简单的案例使用快速且便宜的模型成为可能,同时将更不确定的案例路由到前沿模型。我非常有兴趣在真实的生产工作流中尝试这种设置。

与此同时,TypeSafe 的主要宣传让这些模型听起来几乎不可思议(便宜 100 倍以上且更快)。我相信这在某些工作流中是可以实现的,尤其是那些涉及许多小决策和重复调用的工作流,但我仍然预计实际收益会因用例而有很大差异。因此,值得在你自己的任务上进行测试,而不是假设基准数字会直接转化。

感谢阅读。我希望这篇文章具有启发性。记住爱因斯坦的建议:“重要的是不要停止提问。好奇心自有其存在的理由。”愿你的好奇心引领你走向下一个伟大的洞见。

转载声明:本文为转载整理,原文版权归原作者及原站点所有。

原文来源:Towards Data Science

原创地址:https://towardsdatascience.com/a-new-kind-of-model-for-ai-decision-making/

原文作者:Mariya Mansurova;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-11-21

  • 博文量
    1090
  • 访问量
    546678