一个简单、可读的库,可让您与 LLM 本地互动

LLM.swift

LLM.swift 是一个简单易读的库,它可以帮助您轻松地在 macOS、iOS、visionOS、watchOS 和 tvOS 上与 LLM 本地交互。

screenshot

概述

LLM.swift 基本上是 llama.cpp 包上的一层轻量级抽象层,因此它始终保持最佳性能并始终保持最新状态。它只是一个单文件库,因此您可以根据需要复制、研究和修改代码。

值得特别注意以下几行,以便了解其内部结构:

public typealias Chat = (role: Role, content: String)
public enum Role {
    case user
    case bot
}

public var history: [Chat]
public var preProcess: (_ input: String, _ history: [Chat]) -> String
public var postProcess: (_ output: String) -> Void
public var update: @MainActor (_ output: String) -> Void

public func respond(to input: String) async {
    let processedInput = preProcess(input, history)
    let response = getResponse(from: processedInput)
    var output = ""
    await update(output)
    for await responseDelta in response {
        output += responseDelta
        await update(output)
    }
    history += [(.user, input), (.bot, output)]
    if historyLimit < history.count {
        history = .init(history.dropFirst(2))
    }
    postProcess(output)
}

用法

您只需使用 SPM,或将代码复制到项目中,因为它只是一个文件。

dependencies: [
    .package(url: "https://github.com/eastriverlee/LLM.swift/", branch: "main"),
],

示例

如果您在初始化 LLM 时提供 endString 参数,即使它不是 EOS 令牌,输出也会在遇到 endString 时停止生成。这对制作健壮的聊天机器人非常有用。