程序员AI淘金综合指南

我在 90 年代经历过互联网淘金热,在 21 世纪初经历过移动淘金热,现在,我们终于迎来了 AI 淘金热。听起来有些夸张,但事实并非如此。

程序员AI淘金综合指南

新一轮编程淘金热正在如火如荼地展开。只是这一次,你不需要昂贵的铲子,你会得到免费的挖掘机。我在 90 年代经历过互联网淘金热,在 21 世纪初经历过移动淘金热,现在,我们终于迎来了 AI 淘金热。听起来有些夸张,但事实并非如此。

OpenAI、Anthropic、DeepSeek 和 X 等公司都需要大量的 Nvidia GPU。像我这样的独立开发者根本负担不起或投资。正如你从我的文章中了解到的那样,只有 10% 的用户可能会在免费增值模式下付费。这意味着你必须为 90% 的免费用户保持 AI 推理能力。对于独立开发者来说这是不可能的。

现在情况已经改变。使用 llama.cpp 库的 Ollama 等软件上的本地 AI 和本地 LLM 正在兴起。文本转语音、文本转文本、文本转图像、图像转文本和大量其他模型现在可以在最终用户设备上运行,甚至可以在 iPhone 和 iPad 上运行。我最近刚刚推出了我的 Botcast 应用程序,这是一款即时 AI 播客生成器,可在 iOS 上 100% 本地生成。它使用 TinyLlama 和 Kokoro 文本转语音模型来生成播客。我这边不需要基础设施,都是 BYOG(“自带 GPU”)。BYOG 是独立开发者进入 AI 的大门。

1、淘金所需的工具

说教已经够多了,让我们来看看我们手头上有哪些工具可以加入本地 AI 淘金热。我们将重点介绍在 Windows、Linux 和 Mac 上提供 100% 本地离线 AI 软件所需的所有本地 AI 库。

1.1 使用 llama.cpp 进行 LLM 推理

如果你去年没有住在山洞里,那么可能已经在你的机器上运行了几个月的 Ollama。Ollama 是一款使用 llama.cpp 的软件,llama.cpp 是当今每个人都在使用的 C/C++ 的 LLM 推理库。Ollama 在 llama.cpp 周围做了很多繁重的工作,并为任何开始使用本地 LLM 的人提供了相当可靠的可用性。

在 MacBook M1 Pro 上本地运行的德国“Teuken”模型的 Q6_K 量化

开发人员已经在围绕 Ollama 构建包装器和客户端软件,并连接到其服务器的 API。它本质上与使用 OpenAI、Anthropic、Gemini 或 AWS Bedrock 的 API 相同,只是你自己托管模型并需要维护 Ollama 服务器。

有趣的部分来自 llama.cpp 本身。如果你想发布本地 AI 软件,就像我对 Botcast 所做的那样,需要将 llama.cpp 打包到你的应用程序中。这并不是太大的挑战。在 iOS 上直接运行 llama.cpp 已经被大量应用程序证明,包括我的应用程序,并且还有 Go(go-llama.cpp)、Rust(llama_cpp)或 C#(LlamaSharp)的绑定。通过这些绑定,你可以轻松构建 PHP 模块、iOS 框架或 Node.js 包。

/* example Llama chat session in C# executing a local model */
using LLama.Common;
using LLama;

string modelPath = @"<Your Model Path>"; // change it to your own model path.

var parameters = new ModelParams(modelPath)
{
    ContextSize = 1024, // The longest length of chat as memory.
    GpuLayerCount = 5 // How many layers to offload to GPU. Please adjust it according to your GPU memory.
};
using var model = LLamaWeights.LoadFromFile(parameters);
using var context = model.CreateContext(parameters);
var executor = new InteractiveExecutor(context);

// Add chat histories as prompt to tell AI how to act.
var chatHistory = new ChatHistory();
chatHistory.AddMessage(AuthorRole.System, "Transcript of a dialog, where the User interacts with an Assistant named Bob. Bob is helpful, kind, honest, good at writing, and never fails to answer the User's requests immediately and with precision.");
chatHistory.AddMessage(AuthorRole.User, "Hello, Bob.");
chatHistory.AddMessage(AuthorRole.Assistant, "Hello. How may I help you today?");

ChatSession session = new(executor, chatHistory);

InferenceParams inferenceParams = new InferenceParams()
{
    MaxTokens = 256, // No more than 256 tokens should appear in answer. Remove it if antiprompt is enough for control.
    AntiPrompts = new List<string> { "User:" }, // Stop generation once antiprompts appear.

    SamplingPipeline = new DefaultSamplingPipeline(),
};

Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("The chat session has started.\nUser: ");
Console.ForegroundColor = ConsoleColor.Green;
string userInput = Console.ReadLine() ?? "";

while (userInput != "exit")
{
    await foreach ( // Generate the response streamingly.
        var text
        in session.ChatAsync(
            new ChatHistory.Message(AuthorRole.User, userInput),
            inferenceParams))
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.Write(text);
    }
    Console.ForegroundColor = ConsoleColor.Green;
    userInput = Console.ReadLine() ?? "";
}

我对可预见的未来的预测?几乎每个应用程序都会附带 llama.cpp。GGUF 文件格式已经成为 LLM 的事实标准。未来的操作系统很可能内置 llama.cpp。与此同时,你的应用程序需要携带 llama.cpp 并捆绑想要的模型(如 TinyLlama 或其德语表亲 LLäMmlein,英文意思是“小羊羔”)。

将自己的 LLM 捆绑到你的应用程序中将为其提供无限的、不受限制的离线 LLM 功能。无需 API 令牌,无需订阅。只需将 TinyLlama 或 Phi 与你的应用程序一起携带即可。MacBook 用户已经拥有强大的硬件,执行这些毫无困难。对于 Windows 和 Linux 用户?他们可以看着他们的 CPU 被扼杀而入睡,或者只需获得合适的 Nvidia GPU。无论你正在构建什么应用程序,都可以将 LLM 融入其中,并向 OpenAI 包装器构建技术兄弟展示谁是真正的 AI Gigachad,同时将其价格降低 99.999%。

1.2 使用 Stable Diffusion 生成图像

需要一张折纸中的“鸟在社交媒体上发帖时喝咖啡”的图像吗?这就是 Stable Diffusion 及其众多衍生产品的用途。JuggernautXL RealVisXL 目前是最受欢迎的。这些模型的大小约为 8GB,因此你需要在 iPhone 上小心一点。虽然已经有实现,但它们需要强大的 iPhone 15 Pro 或 M1 iPad。iPhone SE 什么也做不了(但它可以像 TinyLlama 一样执行 LLM)。

使用 RealVis 在 macOS 上使用 Swift 和 Xcode 的简单 Stable Diffusion XL 管道

Apple 自己在 Github 上发布了“Core ML Stable Diffusion”。该库使在 macOS 和 iPad 上的推理变得非常简单。你所需要的只是模型的内容,可以将其捆绑到你的应用程序中或从 Huggingface 下载,然后使用提供的库执行它。

/// initializes the pipeline on launch of the app
func initPipeline() async throws {
    writeStatus(text: "Initializing model configuration")
    let configuration = MLModelConfiguration()
    configuration.computeUnits = .cpuAndGPU
    
    writeStatus(text: "Instanciating pipeline with model...")
    let resourceUrl = URL(fileURLWithPath: ContentView.modelPath)
    self.pipeline = try StableDiffusionPipeline(resourcesAt: resourceUrl,
                           controlNet: [],
                           configuration: configuration,
                           disableSafety: false,
                           reduceMemory: false)
    
    writeStatus(text: "Pipeline is now loading resources...")
    try pipeline!.loadResources()
    
    writeStatus(text: "Pipeline ready")
}
    
/// performs image generation with a prompt
func generateImage(){
    writeStatus(text: "Configuring pipeline for prompt")
    
    var pipelineConfig = StableDiffusionPipeline.Configuration
                                              (prompt: promptText)
    pipelineConfig.negativePrompt = ""
    pipelineConfig.seed = UInt32.random(in: (0..<UInt32.max))
    pipelineConfig.guidanceScale = 3
    pipelineConfig.stepCount = 25
    pipelineConfig.imageCount = 1
    
    pipelineConfig.originalSize = 1024
    pipelineConfig.targetSize = 1024
    
    writeStatus(text: "Pipeline executing prompt...")
    let result = try! pipeline!.generateImages
                      (configuration: pipelineConfig)

    if result.count > 0 {
        writeStatus(text: "Ready, assigning result")
        generatedImage = result[0]
    } else {
        writeStatus(text: "Pipeline error: no image returned")
    }
}

预计在不久的将来会出现微小的图像生成模型。图像生成器的用例几乎是无穷无尽的。想象一下软件经常附带的所有默认图像?是的,你可以在将来跳过这些步骤,只需使用给定的用户输入生成它们即可。

1.3 使用 sherpa-onnx 进行文本转语音

文本转语音或语音合成早在 1984 年就已在 MacSpeak 中出现,听起来就像冰箱门坏了发出的吱吱声。从那时起,TTS 已经取得了长足的进步,如今的声音听起来非常自然。sherpa-onnx 库支持各种模型,包括令人印象深刻的 Kokoro-82M 模型。语音识别已内置在大多数操作系统中,包括 Windows、Linux、macOS、iOS 和 Android。

我的 Botcast 应用程序使用 sherpa-onnx 和 Kokoro 创建整个播客

TTS 和语音识别允许对你的应用程序进行完全交互式语音控制。结合 LLM,对夸张的 GUI 的需求变得非常值得怀疑。在所有支持的平台上,使用这些模型和 sherpa-onnx 库都非常简单。

/* instanciate the kokoro tts model */
let kokoro = sherpaOnnxOfflineTtsKokoroModelConfig(
    model: model.path(),
    voices: voices.path(),
    tokens: tokens.path(),
    dataDir: dataDir
)

/* setup the serpa onnx offline tts wrapper */
let modelConfig = sherpaOnnxOfflineTtsModelConfig(kokoro: kokoro, debug: 0)
var ttsConfig = sherpaOnnxOfflineTtsConfig(model: modelConfig)
self.tts = SherpaOnnxOfflineTtsWrapper(config: &ttsConfig)

/* generate the audio for the provided text */
let text = "Just say it out loud, no need to click"
let speed: Float = 1.0
let audio = self.tts?.generate(text: text, sid: Int(voiceId), speed: speed)

这个示例是我使用 Botcast 应用生成的播客。它展示了 TTS 如何生成 10 分钟的语音音频内容。

传统的软件设计依赖于带有文本和按钮的 GUI。TTS、语音识别和 LLM 的出现彻底颠覆了这一点。任何以前在应用设计上应用的规则都不再适用。

1.4 使用 Create ML 自定义模型

还有大量其他模型,从音乐生成器到图像分类器。我甚至还没有介绍计算机视觉和图像分类,因为这已经成为常态。我无法深入研究所有的人工智能和机器学习模型。这会让这篇文章变成一本完整的书,而这本书一出版就会过时。

苹果的 Create ML 用于简单的模型训练

对于 iOS、iPhone、iPad 和 macOS 用户来说,一个重要的工具是苹果自己的 Create ML。与 TensorFlow 以及 AWS、Google Cloud 和 Azure 上的所有机器学习工具相比,它看起来就像一个玩具。尤其是用 Python。这很好,因为这些模型可以使用苹果的 coremltools 转换为 CoreML。

但这不是 Create ML 的重点。它看起来像一个玩具,因为它的目标正是:一个用于相对基本的机器学习模型的极其简单的训练应用程序。为什么?因为你到处都需要它们。看看 Create ML 提供的模板,这是日常任务。

下次你构建一个用户可以对项目进行分类的 iOS 应用时,只需使用文本分类器并自动对其进行分类,或者至少根据 ML 文本分类器提出建议。在 Xcode 中使用 Create ML 中的模型很容易:只需拖放模型包文件即可。

2、为什么会有淘金热

人工智能不仅改变了我们编写软件的方式,还改变了软件本身。长下拉列表?不,文本分类器。拍摄产品并手动输入产品详细信息?当然不是,那将是一个图像分类器。想在执行某项操作时通知用户?忘记计时器吧,那将是一个预测时间的回归模型。

我的自定义 Create ML 模型,它为给定标题定义播客背景音乐流派

有些用例甚至更简单:我的 Botcast 应用附带 16 个背景音乐文件,用于生成的播客。它可以随机选择一个,这会很尴尬,因为它与内容不匹配。相反,它使用来自 Create ML 的自定义训练模型。该模型本身非常小,只有 73 KB。推理(执行)仅需几毫秒即可完成。训练仅需 5 分钟。这比正则表达式魔法要好得多。

/// returns the background music file to use for this podcast
func getBackgroundMusicFile() -> URL? {
    var musicGenre = self.defaultBackgroundMusic
    
    do {
        let genreOuput = try self.musicClassifier?.prediction
                                              (text: self.title)
        if genreOuput != nil {
            musicGenre = genreOuput?.label ?? self.defaultBackgroundMusic
        }
    } catch {
        print("Failed to predict background music: fallback to default")
        musicGenre = self.defaultBackgroundMusic
    }
    
    let fileIndex = Int.random(in: 1...2)
    let audioFileUrl = Bundle.main.url(
                forResource: "\(musicGenre)\(fileIndex)", 
                withExtension: "mp3"
    )

    if audioFileUrl != nil {
        return audioFileUrl
    }
    
    return nil
}

使用 Xcode 自动为 mlmodel 文件生成包装器类,执行模型本身只需 3 行非常基本的代码。现在,作为开发人员,我们真的需要重新考虑我们的方法。正则表达式和随机化器以及大型表单农场和预选不再可行。即使是几百 KB 的基本模型也可以立即预测值。

3、ML 进入应用的后果

在以前使用复杂正则表达式或随机数生成器的场景中,现在它属于 ML 模型的领域。其结果是,任何现有的软件都需要彻底改革。就像技术兄弟们几年前谈论“移动优先”和“API 优先”方法一样,我们现在需要考虑“AI 优先”方法。

我的意思是什么?假设你的应用有 5 个核心功能,用户将根据他当前的情况和之前的任务需要这些功能。无需编写复杂的条件来确定何时在何处呈现这些功能,只需使用推荐模型即可。推荐器不仅内置于 Core ML,还内置于许多其他语言的库中存在。请查看微软的“教程:使用 ML.NET 矩阵分解构建电影推荐器” 的C# 版作为示例之一。

* Recommender engine output from Microsoft.ML with C# and .NET *

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5382   3.1213e+05
   1       0.9223   1.6051e+05
   2       0.8691   1.5050e+05
   3       0.8413   1.4576e+05
   4       0.8145   1.4208e+05
   5       0.7848   1.3895e+05
   6       0.7552   1.3613e+05
   7       0.7259   1.3357e+05
   8       0.6987   1.3121e+05
   9       0.6747   1.2949e+05
  10       0.6533   1.2766e+05
  11       0.6353   1.2636e+05
  12       0.6209   1.2561e+05
  13       0.6072   1.2462e+05
  14       0.5965   1.2394e+05
  15       0.5868   1.2352e+05
  16       0.5782   1.2279e+05
  17       0.5713   1.2227e+05
  18       0.5637   1.2190e+05
  19       0.5604   1.2178e+05
=============== Evaluating the model ===============
Rms: 0.977175077487166
RSquared: 0.43233349213192
=============== Making a prediction ===============
Movie 10 is recommended for user 6
=============== Saving the model to a file ===============

将 ML 模型集成到应用程序中并不是一个自我实现的预言。它通过做出合理且有用的预测来节省用户的时间,否则他们必须手动决定或计算。这就是淘金热出现的原因:公司愿意为现代机器学习和AI驱动的软件付费,因为这可以为他们节省数千小时的手动工作。

4、“杀手级功能”的时代已经结束

软件开发过去非常注重功能。它专注于 GUI 和将数据插入 GUI 的人,无论是网络、移动还是桌面。该软件将包含一个“神奇算法”,这是用户购买或使用该软件的主要原因。

现在这已经结束了,我们又回到了“哦,它可以做到吗?”新技术的阶段。用户不知道什么是可能的。因此,方法需要完全理解目标用户群的过程。一旦完全理解,软件就会自动化到绝对极限,只允许用户验证、调整和批准结果。

让我们用一个实际的例子来概述这一点:假设你有一个图书馆的库存管理软件,本质上是一个“图书数据库”。在机器学习时代之前,软件允许用户拍摄书籍、扫描 ISBN、从 API 获取一些详细信息(例如书名、作者等)并定义书籍副本的状况和年代。我们不再这样做了。

在当今的人工智能时代,用户无需拍摄书籍。相反,应用程序有一个简单的 AR 扫描功能,可以提取 ISBN、扫描书籍的状况、提取找到的任何文本、确定类型(例如软封面或硬封面)并识别损坏或使用图像分类器需要执行的任何其他操作。

用户所要做的就是验证确定和预测的信息是否正确。借助腾讯的 Hunyuan3D 模型,它甚至可以创建实际书籍副本的 3D 渲染。这将使其他人在出租或购买之前以 3D 形式查看实际副本。这也意味着电子商务需要进行彻底的技术改造。今天,用户对此印象深刻并感到惊讶,但几个月后他们就会期待这些功能。

5、如何最好地加入淘金热潮

在这场淘金热潮中,我们经历的无非是我们所熟知的“专家系统”的最终消亡。仅依赖预编程条件(即“如果……那么”算法)的软件已落入遗留软件类别。软件不再帮助用户实现流程自动化,而是分析流程并预测操作。它甚至可以立即自动执行操作。想想汽车的紧急制动。通过找到尚未或不会转向 AI 和 ML 的“遗留软件”来加入这场革命。并替换它。

Excel 公式和 VBA 已经濒临消亡:被 ML 和 RAG ETL 管道取代

过去,我们使用复杂的数学公式转化为算法来生成特定结果。然后算法会变得越来越复杂,涵盖越来越多的边缘情况。所有这些都可以训练成 ML 模型,该模型将根据之前训练的数据预测输入参数的结果。它会通过强化学习和模型再训练不断更新。

6、结束语

编程已死,编程万岁!虽然人工智能是一场革命,但软件产品只是经历了一场演变:从静态条件算法到机器学习算法。虽然我们需要更少的软件开发人员来构建我们今天构建的东西,但我们需要更多的软件开发人员来构建未来。我们正处于另一个“技能过时”的循环中。

作为一名软件开发人员,你现在需要了解 ML 的基本方法以及如何使用它们。在 Mac 上创建 ML 是一个很好的起点。你不需要能够自己实现 K-MEANS 和 K-NN 算法,但您需要了解它们是什么、如何工作以及何时使用它们。你还需要对 LLM、TTS、稳定扩散和计算机视觉的工作原理有基本的了解。

虽然我们这些大四学生经常对大三学生使用 LLM 做所有事情感到好笑,但这正在慢慢成为现实。与我们的静态条件算法相比,LLM 可以涵盖更多修复损坏的 CSV 文件的情况。如果 LLM 很快就能加入操作系统,那又何必呢?不要与未来作斗争,要拥抱它。今天看似过度的东西,明天就会成为常态。

欢迎来到 AI 编程淘金热!


原文链接:Programmers’ New Goldrush: Seizing Opportunities With Local AI

汇智网翻译整理,转载请标明出处