跳到主要内容

使用 LLMEngine 进行文本生成

LLMEngine 加载本地文本模型目录,并流式生成文本。Edge Kit 会自动应用 runtime memory policy,让多轮对话在设备上保持有界。

创建并加载

import EdgeInference

let engine = LLMEngine()
let modelURL = URL(fileURLWithPath: "/path/to/model")

try await engine.loadLocal(directory: modelURL)

如果某类会话需要不同内存取向,可以在加载时传入高层 intent:

try await engine.loadLocal(
directory: modelURL,
options: NativeRuntimeLoadOptions(memoryIntent: .exactRecall)
)

对金额、日期、计数等可审计事实,.exactRecall 应和 App 拥有 工具 或 fact storage 配合使用。

EdgeModelKit 准备已注册的 ModelConfig,再加载本地缓存目录:

import EdgeModelKit

guard let config = ModelConfig.find(modelID: "qwen3.5-9b-4bit") else {
throw EdgeRuntimeError.modelNotFound("qwen3.5-9b-4bit")
}

try await HFDownloader.shared.download(config: config)
try await engine.loadLocal(directory: ModelCache.shared.cachedURL(for: config))

生成流式文本

let messages: [ChatMessage] = [
.system("You are concise."),
.user("Explain on-device AI in one sentence.")
]

for try await chunk in engine.generate(messages: messages) {
print(chunk.text, terminator: "")
}

消息

Helper角色
.system("...")系统指令
.user("...")用户消息
.assistant("...")之前的助手输出
.tool("...")后续轮次使用的工具结果

参数

let parameters = EdgeGenerateParameters(
temperature: 0.7,
topP: 0.9,
maxTokens: 512
)

for try await chunk in engine.generate(
messages: [.user("Write a haiku about local AI.")],
parameters: parameters
) {
print(chunk.text, terminator: "")
}

除非你为了测试显式使用低层 override,Edge Kit 会在这些参数之上应用自动内存管理。

多轮对话

一次对话保留一个 engine 实例。Edge Kit 会自动管理提示缓存复用。

var history: [ChatMessage] = [
.user("Give me three app ideas.")
]

let first = try await engine.generateOnce(messages: history)
history.append(.assistant(first))
history.append(.user("Make the second one more specific."))

for try await chunk in engine.generate(messages: history) {
print(chunk.text, terminator: "")
}

开始新对话时清理对话状态:

engine.clearPromptCache()

指标

生成完成后读取 lastMetrics

if let metrics = engine.lastMetrics {
print("TTFT:", metrics.ttftMs)
print("Decode TPS:", metrics.decodeTPS)
print("Generated tokens:", metrics.generationTokenCount)
}

SwiftUI 示例

import EdgeInference
import SwiftUI

@MainActor
final class ChatViewModel: ObservableObject {
@Published var output = ""
@Published var isLoading = false

private let engine = LLMEngine()

func load(modelURL: URL) async {
isLoading = true
defer { isLoading = false }

do {
try await engine.loadLocal(directory: modelURL)
} catch {
output = error.localizedDescription
}
}

func send(_ text: String) async {
output = ""

do {
for try await chunk in engine.generate(messages: [.user(text)]) {
output += chunk.text
}
} catch {
output = error.localizedDescription
}
}
}

struct ChatView: View {
@StateObject private var model = ChatViewModel()
@State private var prompt = "What is edge AI?"

var body: some View {
VStack {
TextEditor(text: $prompt)
Button("Send") {
Task { await model.send(prompt) }
}
ScrollView {
Text(model.output)
.frame(maxWidth: .infinity, alignment: .leading)
}
}
.padding()
}
}

API 概览

你最常用的方法:

Method作用
LLMEngine()创建 engine 实例。@MainActor
loadLocal(directory:)从本地路径加载模型。
load(config:)Preview 元数据 hook;原生默认构建 不在这里执行远程下载。请使用 EdgeModelKitloadLocal(directory:)
generate(messages:parameters:)流式返回 GenerateChunk 值。Async sequence。
generateOnce(messages:)返回一次性累积字符串。
clearPromptCache()重置对话状态。
lastMetrics生成后的 TTFT、TPS、token 数。

完整签名和类型 → EdgeInference API Reference

下一步