我最常用的 Gen AI 技巧是网页和文档的摘要。与语义搜索相结合,摘要意味着我在需要时浪费很少的时间搜索我需要的单词和想法。摘要变得如此重要,以至于我现在在写作时使用它来确保我的关键点出现在 ML 摘要中。不幸的是,这是一把双刃剑:对 深度学习 的依赖会导致一个令人尴尬的、代价高昂的或终结职业生涯的错误,因为摘要遗漏了什么,还是更糟,因为摘要产生了幻觉? 

幸运的是,多年的技术专业人士教会了我风险管理的价值,这就是本文的主题:识别总结的风险以及减轻风险的(实际上非常简单的)方法。 

确定问题

对于所有的软件开发历史,我们很容易验证我们的代码是否按要求工作。软件和计算机是确定性的、有限状态的自动机,也就是说,它们按照我们的吩咐去做(除了宇宙射线或其他拜占庭失败的来源)。这使得正确行为的测试变得简单。每个可能的单元测试用例都可以由 assertEquals(actual, expected)、assertTrue、assertSame、assertNotNull、assertTimeout 和 assertThrows 处理。即使是最棘手的动态字符串方法也可以由 assertTrue(string.包含(a),字符串。Contains(b) 字符串。包含 (c) 和字符串。包含(d)。

但那是那时。我们现在有 大型语言模型,它们基本上是随机系统。当对 API 调用的响应可能变化到不可知的程度时,即使是 contains(a)、contains(b) 或 contains(c) 的完整字母表也无法完成验证 Gen AI 正确行为的任务。JUnit、Nunit 和 PyUnit 都没有 assertMoreOrLessOK(actual, expected)。然而,我们仍然需要测试这些 Gen AI API 并在生产中监控它们。一旦您的 Gen AI 功能投入生产,传统的可观测性方法将不会提醒您注意下面描述的任何潜在故障模式。 

那么,问题就在于如何确保Gen AI系统返回的内容与预期一致,又如何在生产中对其进行监控呢?为此,我们必须了解LLM的多种失效模式。我们不仅要理解它们,还必须能够在出现问题之前向我们的非技术同事解释它们。 

LLM 故障模式是独一无二的,对可观测性提出了一些真正的挑战。让我用 OpenAI 最近的一个例子来说明,这个例子没有被主流新闻报道,但应该被报道。斯坦福大学、加州大学伯克利分校的三名研究人员一直在监测 ChatGPT,看看它是否会随着时间的推移而改变,它确实发生了变化,它确实发生了变化 ChatGPT 在 2023 年 3 月有 98% 的时间做出了正确的反应。三个月后,他们重复了测试,但 ChatGPT 有 87% 的时间回答错误! 

需要注意的是,OpenAI 于 2023 年 3 月 14 日发布了新版本的 API。必须回答两个问题: 

  1. OpenAI 是否知道新版本存在问题,他们为什么要发布它? 
  2. 如果他们不知道,那为什么不呢?

这只是您在监控生成式 AI 方面所面临的挑战的一个例子。即使您可以完全控制发布,也必须能够检测到彻底的故障。 

研究人员已经在GitHub上提供了他们的 代码和说明 ,这很有启发性。他们还添加了一些额外的材料和更新。如果您的用例需要事实准确性,这是一个很好的起点。

问题:一般危害

除了准确性之外,生成 式人工智能 还很有可能产生具有偏见或毒性等有害品质的响应。 HELM,即语言模型的整体评估,是一个活生生的、快速增长的基准测试集合。它可以在 42 个场景中评估 60 多个公共或开源 LLM,具有 59 个指标。对于任何寻求更好地了解语言模型风险以及各种供应商对其产品相关风险的透明程度的人来说,这是一个很好的起点。原始 论文代码 均可在线免费获得。

模型崩溃是另一个潜在风险;如果发生这种情况,结果将广为人知。缓解措施非常简单,只需确保您可以返回到以前的模型即可。一些研究人员声称,ChatGPT 和 Bard 已经 朝着这个方向前进

问题:模型漂移

为什么要担心漂移?让我给你讲一个故事。OpenAI 是一家初创公司;初创公司最需要的一件事是快速增长。ChatGPT 于 2022 年 12 月首次发布时,用户数量呈爆炸式增长。然而,从 2023 年 6 月开始,用户数量开始下降,并在整个夏季持续下降。许多专家推测,这与 ChatGPT 的学生用户放暑假有关,但评论员没有来自 OpenAI 的内部数据,所以他们只能猜测。 可以理解的是,OpenAI 尚未发布任何有关下降原因的信息。 

现在,想象一下这发生在你身上。有一天,Gen AI 功能的使用统计数据开始下降 只有 4% 的客户倾向于抱怨,而您的投诉并没有增加。您已经实现了出色的 API 和 UX 可观测性;响应时间和可用性均未显示任何问题。是什么原因导致了下降?您的数据中是否有任何差距? 

模型漂移是由于数据、语言模型或提供训练数据的区域性的变化而导致的 LLM 响应的逐渐变化。在观察个体反应时,LLM 行为的变化可能很难检测到。

  • 数据偏移是指输入数据模型进程随时间的变化。 
  • 模型漂移是指模型在部署后随时间推而发生的性能变化,并可能导致:
    • 性能下降: 由于数据漂移,模型在同一测试集上的准确性降低。
    • 行为漂移: 即使对相同的数据,模型也会做出与原始不同的预测。

然而,漂移也可以指概念漂移,这会导致模型学习过时或无效的概念假设,从而导致当前语言的错误建模。它可能会导致下游任务失败,例如生成对客户消息的适当响应。 

风险呢?

到目前为止,我们发现的潜在问题是生成式人工智能系统行为的失败和漂移,导致意想不到的结果。不幸的是,目前还无法明确说明业务可能面临的风险,因为没有人可以事先确定非确定性系统可能的响应范围。 

您必须逐个预测 Gen AI 用例的潜在风险:您的实施是否提供财务建议或回答客户问题以获取有关您产品的事实信息?

LLM 不是确定性的;希望这句话现在对你来说比三分钟前更有意义。这是您在帮助非技术同事了解潜在麻烦时可能遇到的另一个挑战。关于风险,最好的说法是所有常见的嫌疑人都在起作用(商业声誉损失、收入损失、违反监管、安全)。

以火灭火

好消息是,可以通过一些新的可观测性方法来降低实施生成式 AI 的风险。坏消息是,你必须使用机器学习来做到这一点。幸运的是,它很容易实现。遗憾的是,您无法使用客户提示来检测偏差 – 您必须使用基准数据集

如果您的员工拥有统计学或应用数学学位,您可能希望尝试使用本文中描述的方法(最大均值差异)进行漂移:

发现文本数据中的漂移:一种检测和缓解机器学习模型漂移的无监督方法

你在干什么?

您正在尝试使用一个相对较小的数据集来检测模型行为中的漂移,该数据集包含代表您的用例的精心策划的文本样本。与上面的方法一样,您将使用差异,但不会用于整个集合。相反,您将创建提示和响应的基线集合,每个提示-响应对发送到 API 100 次,然后计算每个提示的均值和方差。然后,每天左右,您都会向 Gen AI API 发送相同的提示,并查找与均值的过度方差。同样,这很容易做到。

让我们来编码吧!

选择要在创建嵌入时使用的语言模型。它应该尽可能接近 Gen AI API 正在使用的模型。您必须能够完全控制此模型的文件及其所有配置,以及创建嵌入和计算相似性时使用的所有支持库。该模型将成为您的参考。相当于 1 公斤的纯硅球体,可作为全球质量标准。

Java 实现

对于我这个拥有 20 年 Java 编码经验的我来说,在 Java 如何做这个的经历是痛苦的,直到我从 深度 Java 学习中整理出示例。不幸的是,与 Python 相比,DJL 可用的原生语言模型列表非常有限。例如,尽管过度设计,但 Java 代码几乎和 Python 一样简洁:

  1. 用于创建句子嵌入向量的 LLM 的设置。

LLM used to create sentence embedding vectors

  1. 用于创建文本嵌入向量并比较两个文本之间的语义相似性的代码:

Text embedding vectorspng“ data-new=”false“ data-size=”42265“ data-sizeformatted=”42.3 kB“ data-src=”https://dz2cdn1.dzone.com/storage/temp/17282619-1698011618645.png“ data-type=”temp“ data-url=”https://dz2cdn1.dzone.com/storage/temp/17282619-1698011618645.png“ height=”145“ src=”http://www.cheeli.com.cn/wp-content/uploads/2023/11/17282619-1698011618645.png“ width=”624“/></p>
<ol start=

  • 计算语义相似度的函数。

  • Function that calculates the semantic similarity.

    把它们放在一起

    如前所述,目标是能够检测单个响应中的漂移。根据您的用例和要使用的 Gen AI API,基准测试提示的数量、构成基线的响应数量以及对 API 进行采样的速率会有所不同。步骤如下:

    1. 创建一组非常能代表您的用例的提示和 Gen AI API 响应的基线:10、100 或 1,000。将它们保存在表 A 中。
    2. 创建一组基线响应:对于每个提示,在几天到一周内向 API 发送 10、50 或 100 次,并保存文本响应。将它们保存在表 B 中。
    3. 计算基线响应之间的相似性:对于每个基线响应,计算其与表 A 中响应之间的相似性,将这些相似性值与表 B 中的每个响应一起保存。
    4. 计算表B中相似度值的均值、方差和标准差,并将其存储在表A中。
    5. 开始漂移检测运行:每天左右执行与步骤 1 中相同的步骤。将结果保存在表 C 中。
    6. 在每次检测运行结束时计算表 A 中响应之间的相似性。
    7. 计算完所有相似性后,查找原始方差之外的任何方差。
    8. 对于差异过大的响应,请查看原始提示、表 A 中的原始响应以及表 C 中的最新响应。最新回应的含义是否有足够的差异?如果是这样,您的 Gen AI API 模型可能会偏离产品所有者的期望;和他们聊聊。

    结果

    收集和绘制图表时,数据应如下所示:

    该图表显示了在一周内向 API 发送 100 次的 125 个提示的基准集的结果 – 基线样本。计算每个提示的平均相似度,并由基线线和均值图中的点表示。昨天,相同的 125 个基准测试样本的最新运行已发送到 API。计算它们的相似性与基线平均值(最新样本)的相似性。回顾了似乎与平均值相差很大的单个样本的响应,以查看是否与基线响应存在任何显着的语义差异。如果发生这种情况,请与产品所有者一起查看您的发现。

    结论

    对于工程师来说,非确定性软件将继续是一个挑战,需要开发、测试和监控,直到人工智能大脑接管我们所有的工作。在那之前,我希望我已经预先警告过你,并用清晰的解释和简单的方法武装你,让你在下一次 Gen AI 事件会议上保持微笑。而且,如果不出意外,本文应该可以帮助您说明雇用自己的数据科学家的理由。如果这不在卡片中,那么……数学?

    Comments are closed.