昨天和小伙伴讨论技术方案时,突然意识到在过去的半年里,参与的几个与人工智能相关的项目,大家都纠结于选择:是使用程序实现?还是调用大模型?亦或是进行模型训练?

在这里我们不讨论为了使用而使用 AI 的场景,只考虑在日常工作中,如何更省钱省力。

1 可供选择的方案

  • 用程序写规则实现
  • 调用现有模型 +RAG(检索增强生成)
  • 训练模型

2 背后的逻辑

可以看到每种方案都有它适用的领域。

2.1 程序不能解决的问题

程序不能解决“复杂”问题,试想以下场景:

在与用户进行交互过程中,可能有很多不同的说法来表达一个问题,程序无法一一列举。这时候就需要使用模型。

对于图像、音频等模拟信号处理来说,更有无数种可能性。对于这些信息的识别、生成或判断,很难用硬性指标来界定,这时候可以使用模型。

2.2 调模型不能解决的问题

调用模型最大的问题是:通用模型不了解你的领域知识和背景知识

如果想得到很好的结果,首先得选择一个靠谱的模型。另外,还需要把提示写得非常准确,比如让它写一段程序。如果描述非常清晰,细化到函数内部逻辑,就能生成更符合你期望的内容。如果只说“给我写一个音乐播放器”,没有描述它的系统、编程语言、界面设计和逻辑细节等方面内容,那么模型也不可能生成你想要的内容。

因此,我们需要将上述“背景知识”告诉模型,也就是“写提示 Prompt”。另外,由于模型没有记忆功能,在每一次对话中都需要将之前提到的有用信息再次传给模型。我们在与模型聊天时之所以能记住之前的对话,是因为程序帮助我们保留了之前的上下文,并非模型本身具备这种功能。此外,每次传给模型的内容也有限制,比如中文约为 4096 字,而在某些场景中这显然不够。另外需要注意的是,调用模型也是按照字(token)收费的。

针对这些问题,可能需要额外的开发,包括如何存储、筛选和组装背景知识,以及 RAG(搜索加强生成)和向量数据库等方面的设计结构。也是非常复杂的领域。

2.3 训练模型不能解决的问题

训练模型有两种方法。一种是从头训练模型,这对于自然语言大模型来说通常需要上千张卡数月的时间和大量的数据。一般个人或公司不需要考虑这种方式,除非要重新定义模型结构且之前的参数无法复用。但如果新结构没有比旧结构更好,那么投入的时间和金钱都将白费。

更多人选择在现有模型上进行微调,或者将自己的数据输入到模型中,或者设计一些有监督的方法来引导模型。目前很多大厂和云平台提供了可供用户微调的 GPU 服务器租赁服务和基础模型,并且还有一些降低微调成本的技术,如 lora 和 p-tuning。

即使不考虑成本,目前训练和微调模型也它的局限性:模型相对来说不太可控。 与存储数据不同,无法保证模型输出与训练时输入的数据完全一致,即使使用很多数据进行多轮训练也不能确保答案总是正确的。而且微调后可能会导致模型偏差:之前能回答正确,在微调后可能回答错误了。这取决于训练轮数、模型参数量和其他训练参数等因素,所以大家也常将调模型称为 " 炼丹 "。

3 决定因素

所以,在选择时,至少需要考虑以下几个因素:

3.1 问题的复杂度

训练模型>调用模型>程序

程序只能解决简单的问题,考虑可列举的情况。而调用模型可以解决更复杂的问题,因为模型自带一些常识。如果模型仍然无法解决问题,可以通过提供类似示例来喂给模型,或者训练模型:当前的模型具有举一反三的能力(one-shot, zero-shot)。

3.2 可控性&准确性

程序>调用模型>训练模型

大语言模型存在幻觉问题。即使娃在写公众号时提及与地理、历史和文学相关的,具有确定答案的问题,也不敢直接使用模型生成的内容,还要再查一查。

因此,在某些需要高准确性的领域,如与金钱直接相关的业务和医学决策等,不能直接使用生成模型,还需要人工进一步确认。

此外,训练模型的可控性,如前所述也是一个问题。因此,调用 RAG(Retrieval-Augmented Generation)系统目前比较流行的方法。当我们搜索或提问时,RAG 系统通常能够提供原始数据的来源和内容。

3.3 成本&工作量

成本和工具量也是选型的重要衡量指标。

程序一次性开发,永久使用,使用过程中几乎不产生费用,而调用模型则会持续产生费用。

购买和维护服务器费用:

  • 有些优秀的模型只能通过购买服务来使用,不支持本地搭建环境。
  • 在调用的场景下,用量少时调用外部模型更划算;用量多时可以考虑自己搭建环境。
  • 在训练的场景下,用量少时可以考虑租云服务器,用量多?太贵了,一般人没这个需求。

预估工作量也需要结合场景来看:

  • 能用程序快速实现的尽量使用程序。
  • 实现复杂任务可能需要考虑 模型 +RAG 方案,搭建 RAG 也有工作量。
  • 训练模型(在原有模型基础上)需要准备数据,工作量也不小。
  • 训练模型(从头训练),对于大语言模型,一般人不需要考虑这个问题。

4 总结

综上,我的个人看法是:能用程序快速解决的问题就不调用模型,能调用模型解决的问题就不训练模型。

即使进行模型训练,也不能保证模型能够记住所有内容。模型和外部数据的关系就像人脑和笔记之间的关系。人脑始终处于不断变化中,即使在上学时背过《桃花源记》(这还是背了很多遍的情况,一般见过的内容不会反复背),多年以后谁还能完全记得住?差错在所难免。然而,通过文字记录下来,只需要一个小小的文本文件就可以实现。只要设计好如何找到这个文本文件即可。

因此,在条件允许的情况下,一个良好的系统需要进行模型训练,并与外部知识来更好地配合,以达到最佳效果。此外,即使进行模型训练,也少不了加入 RAG 方法,“好脑子不如烂笔头“对吧!

5 一些想法

  • 不用大模型完全取代人,而是在一些比较困难的环节使用大模型实现,以避免脑力低级的消耗。from: 大鹏