如何将人工智能添加到现有应用程序
如果你还没有被要求为应用程序添加人工智能 (AI) 功能,那么这可能只是时间问题。
添加 AI 功能并不难。然而,这就像说为应用程序添加数据库支持并不难一样。确实不难,但选择正确的数据库、设置架构和存储过程可能是一项艰苦的工作。然后你需要决定数据库是应该在同一台服务器上,还是在不同的服务器上。你还需要决定使用哪种数据库:关系型、文档型、键/值……这可能会变得很复杂。
AI 就是这样。添加一个库,使用本地服务,使用托管服务,我应该使用哪个服务?如何设置它。然后是棘手的问题:它会花费多少钱?我的数据将如何处理?它有多安全?
那么,让我们快速浏览一下你的选项,这样你至少知道要问什么问题。
自行编写
我首先要说的是,这是我们十年前开始涉足 AI 的方式,我真的不推荐它。有太多太多杰出的研究人员花费了无数工时,基于快速发展的 AI 研究语料库,构建了极其强大和高效的 AI 库和模型,因此使用许多已有的 AI 解决方案会更容易、更快、更安全。
话虽如此,深入研究一个简单的神经网络,以根据你的特定场景构建数据分类能力,可能会带来满足感,提供出色的结果,并且开销很小。CodeProject 的垃圾邮件过滤器就是这样的一个例子,在我们看来,任何更大的东西都将是多余的。在这种情况下,合适的工具。
优点:- 编写代码很有趣。- 你得到你真正需要的东西,不多不少。- 你最终可能会得到一个更小的代码库,因为你没有导入库及其所有依赖项。
缺点 - 你在重复造轮子 - 你(可能)做得不够好、不够准确,或者解决方案不如已有的快。 - 这可能会分散你核心业务的注意力。它最终可能会花费你更多的时间、错失的机会和开发人员时间,而不是简单地使用现有解决方案。
在代码中直接使用 AI 库或工具包
如果你希望将 AI 处理直接包含在你的代码库中,那么使用 TensorFlow 或 PyTorch 等库是不会错的。有许多成熟、受支持、易于使用的库可用于多种语言和平台。它们为你完成了繁重的工作,再加上许多预训练模型,你所需要做的就是包含工具包、加载模型、输入数据、运行推理并输出结果。
以下是如何在 Python 中使用最新的 YOLO5 模型
import torch # import the Torch library
model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # Load the YOLO model
img = '~/username/images/street.jpg' # Specify the image
results = model(img) # Perform the inference
results.print() # Output the results
这有多简单!
当你需要处理不同的模型版本、模型训练所用的库版本,以及模型所需库所需的编译器或解释器版本时,问题就开始出现了。如果所有这些都与应用程序其他部分的库、解释器版本甚至硬件要求发生冲突,那该怎么办?
这可能是一个真正的挑战,特别是对于 Python 来说,你可能需要设置多个虚拟环境,每个环境都有自己的库包副本,并且每个环境都使用不同版本的 Python。保持这些同步且未损坏可能需要很大的耐心。
你可能有一个适用于 Python 3.7 的出色解决方案,但当它在安装了 Python 3.11 的另一台机器上运行时,它可能 просто 失败。
将 AI 直接添加到你的应用程序中可能意味着你需要非常小心,以确保始终将所有必需的部分作为一个单元进行部署。Docker 会在这里帮助你,但对于许多人来说,这种开销可能无法接受。
最后,在你的应用程序中添加一个 AI 工具包时,你需要记住你还将添加模型本身。AI 模型可能很大,以千兆字节计。
优点
- 你建立在之前杰出的开发人员和研究人员的工作之上
- 许多库都是开源的,因此你可以查看和审计代码
- AI 库和工具正以惊人的速度开发和完善。新功能和改进性能不断发布
- 这些库通常非常易于使用
- 有工具可以实现库之间的模型转换。
- 几乎每种语言和平台都有一个模型
缺点
- 使用一个库肯定有一个学习曲线
- 你可能被限制使用特定库的特定模型格式
- 库太多了。选择的悖论。
- 包含一个库很少意味着只有一个库:它通常会带来它的所有朋友、亲戚和远房表亲。事情可能会变得臃肿
- 包含一个库意味着包含模型。事情可能会变得非常非常大,而且很快。
- 你必须确保你的编译器/解释器、库和模型在版本控制方面保持同步。例如,永远不要假设 Python 的默认安装会与你的代码一起工作。
使用抽象库(.NET ML、OpenVINO)
许多库要求你使用特定形式的预训练模型,或者它们需要针对不同硬件的不同库。ML.NET 和 OpenVINO 等库解决了这个问题,它们致力于聚合和抽象库和硬件,以便为你的 AI 操作提供一个统一的 API。
优点
- 使用专用库的所有优点
- 无需为特定硬件设置特定版本。库将动态适应
- 你能够轻松使用更广泛的模型
- 你对新硬件和模型格式具有一定的未来适应性
缺点
- 库和功能的聚合将导致更大的占用空间。
- 抽象可能导致“最小公分母”问题,即库只公开常见功能,这意味着你失去了访问专用库中可用的一些功能或精细调整的能力
- 你的语言或平台选择可能有限。
托管 AI 服务
使用托管 AI 服务意味着你无需处理与库、硬件和兼容工具包相关的所有问题,也无需拖拽数 GB 的模型。你向托管 AI 服务发出调用,结果会在几毫秒后通过你的低延迟、高带宽互联网连接返回。当然,前提是你拥有这样的连接。
托管提供商提供的服务范围确实令人惊叹。预构建模型、快速硬件、出色的 API。请注意成本。
在考虑成本时,你需要了解收费方式。上传数据到提供商会产生费用吗?下载结果呢?每次请求的费用是多少,如何计算?有些服务按请求收费,有些按处理单元收费,有些按时间收费。你还需要考虑数据存储的成本以及可能适用的任何许可费用。还要注意,成本将在很大程度上受到任务的影响:传入数据并应用于预训练模型是一回事,但传入数万亿字节的数据来训练新模型则要昂贵数个数量级。例如,GPT-3 据说训练成本约为 500 万美元。
有一些选项可以降低你的成本。一种方法是混合搭配服务提供商:将你的数据上传并存储在 DELL 等提供廉价存储的提供商处。将这些数据发送到 Azure(可能没有存储摄取费用),训练模型,然后将结果发送回你的 DELL 存储。你的数据在一个提供商处安全且存储成本相对较低,而另一个提供商则完成了训练模型的繁重工作。由于它们拥有庞大的网络基础设施,在大型托管提供商之间发送数据通常非常快速。
如果你只是将托管提供商用于 AI 推理(即向 AI 模型发送数据以由模型进行预测或分析),那么你也应该了解一些限制,例如调用次数的绝对限制,以及在给定时间段内限制调用次数的任何节流。如果某个功能因为其他用户耗尽了你当天的配额而消失,你的用户会作何反应?
你还需要了解数据流向何处以及该司法管辖区的法律可能如何影响你。你的数据副本会存储在外国司法管辖区吗?你的数据流会被监控或提供给第三方吗?一个人家中网络摄像头的视频流可能不是用户或你的应用程序希望知道被发送到外国进行处理的信息。如果将个人身份数据发送到国外,你甚至可能需要了解法律或保险限制。
优点
- 快速、强大,你可以访问最新最好的东西
- 无需担心 AI 库或版本
- 无需担心硬件速度或容量。你的信用卡是你唯一的限制。
- 你能够轻松使用各种模型
- 你面向未来。你将可以访问最新最好的东西
- 你的应用程序会更小。无需携带库代码或模型
- 它们将与任何可以通过 HTTP 进行 API 调用的语言一起工作
缺点
- 你可能需要一个不错的互联网连接才能使用这些服务
- 它们可能很昂贵,或者更常见的是,实际成本模糊不清或不透明
- 系统是封闭的。你无法真正看到幕后发生了什么
- 你无法控制数据的去向。这可能会导致隐私和安全问题。
- 你可能会面临配额或使用问题
本地 AI 服务
那么,如果你不想自己编写 AI 代码,想使用你选择的任何语言或平台进行 AI 分析,不想让你的数据离开本地网络(甚至你的机器),并且不想为你知道是免费的服务支付未知的金额,该怎么办?
CodeProject.AI 等本地托管 AI 服务是 AI 服务的一个很好的例子,它兼具两者的优点。你无需担心处理库和版本,任何可以进行 HTTP 调用的语言都可以与该服务进行交互。
优点
- 本地开源 AI 服务器可以在线找到并免费使用
- 没有使用限制
- 你的数据保留在你可以看到的地方。除非你选择,否则不会将任何内容发送到网络之外。
- 与托管 AI 服务一样,你无需担心库或版本控制。一切都在服务的范围内
- 你可以轻松访问多个 AI 功能,而无需为要执行的每个 AI 操作安装库或工具包
缺点
- 服务的安装程序可能很大,具体取决于包含的模型和功能。
- 像直接使用库一样,你受限于安装服务的机器的性能
- 同样,像直接使用库一样,你不会自动获得更新。
- 所提供的 AI 功能不会像托管服务那样多。然而,一个服务可以提供来自多个提供商的多个 AI 操作,所有这些都通过统一的 API 提供
后续步骤
将 AI 添加到应用程序可以从根本上扩展应用程序的功能,同时降低复杂性。启发式和硬编码的 if-then 语句被基于(希望是)广泛的真实世界数据的训练集所取代,而传统二进制逻辑无法轻易涵盖这些数据。
你添加 AI 的方式同样具有根本性的影响,如何选择这样做取决于你的要求、你的预算以及最终你的情况。
在 CodeProject,我们尝试了上述所有方法,将 AI 添加到我们的系统中。我们的经验从对某些方法的简单性感到惊喜,到因不得不与工具作斗争而感到彻底愤怒。
最后,我们希望将我们使用 AI 的经验(和乐趣)分享给尽可能多的开发人员,而无需他们经历挫折。寻找兼容的库,处理模型、系统工具、路径、操作系统之间的怪异之处以及不同 CPU 上相同操作系统之间的怪异之处,过去和现在仍然非常耗时。我们构建了 CodeProject.AI Server,作为一种将这种复杂性封装到一个自包含包中的方法,它为你完成了所有繁重的工作。一旦安装,你就可以立即开始在应用程序中尝试和使用 AI。
下载最新版本并尝试一下。