L'API Swift di LiteRT-LM ti consente di integrare modelli linguistici di grandi dimensioni in modo nativo nelle applicazioni iOS e macOS. Le funzionalità come la multimodalità, l'utilizzo degli strumenti e l'accelerazione GPU (tramite Metal) sono completamente supportate.
Introduzione
Ecco un esempio di utilizzo dell'API Swift per inizializzare un modello e inviare un messaggio:
import LiteRTLM
// 1. Initialize the Engine with your model
let config = try EngineConfig(
modelPath: "path/to/model.litertlm",
backend: .gpu, // Use .cpu() for CPU execution
cacheDir: NSTemporaryDirectory()
)
let engine = Engine(engineConfig: config)
try await engine.initialize()
// 2. Start a new Conversation
let conversation = try await engine.createConversation()
// 3. Send a message and print the response
let response = try await conversation.sendMessage(Message("What is the capital of France?"))
print(response.toString)
Per iniziare
Questa sezione fornisce istruzioni su come integrare l'API Swift di LiteRT-LM nella tua applicazione.
Swift Package Manager (SPM)
Puoi integrare LiteRT-LM nel tuo progetto Xcode utilizzando Swift Package Manager.
- Apri il progetto in Xcode e vai a File > Add Package Dependencies... (File > Aggiungi dipendenze pacchetto).
- Inserisci l'URL del repository del pacchetto:
https://github.com/google-ai-edge/LiteRT-LM - Seleziona la libreria LiteRTLM per aggiungerla al target dell'applicazione.
Se stai sviluppando un pacchetto utilizzando Package.swift, aggiungilo alle dipendenze:
dependencies: [
.package(url: "https://github.com/google-ai-edge/LiteRT-LM", from: "0.12.0")
]
Guida all'API principale
Questa sezione descrive in dettaglio i componenti e i flussi di lavoro fondamentali per l'utilizzo dell'API Swift di LiteRT-LM, inclusi l'inizializzazione del motore, la gestione delle conversazioni e l'invio di messaggi.
Inizializzare il motore
Engine gestisce il caricamento del modello, l'allocazione delle risorse e la gestione del ciclo di vita.
import LiteRTLM
let engineConfig = try EngineConfig(
modelPath: "path/to/your/model.litertlm",
backend: .gpu, // Use .gpu for Metal hardware acceleration
maxNumTokens: 512, // Size of the KV-cache
cacheDir: NSTemporaryDirectory() // Writable directory for compilation cache
)
let engine = Engine(engineConfig: engineConfig)
try await engine.initialize()
Creare una conversazione
Una Conversation gestisce la cronologia chat, le istruzioni di sistema e le configurazioni del campionatore.
// Configure custom sampling parameters
let samplerConfig = try SamplerConfig(
topK: 40,
topP: 0.95,
temperature: 0.7
)
// Create the conversation config with system instructions
let config = ConversationConfig(
systemMessage: Message("You are a helpful assistant."),
samplerConfig: samplerConfig
)
let conversation = try await engine.createConversation(with: config)
Inviare messaggi
Puoi interagire con il modello in modo sincrono o asincrono (streaming).
Esempio sincrono
let response = try await conversation.sendMessage(Message("Hello!"))
print(response.toString)
Esempio asincrono (streaming)
let message = Message("Tell me a long story.")
for try await chunk in conversation.sendMessageStream(message) {
// Output response chunks in real-time
print(chunk.toString, terminator: "")
}
print()
Multimodalità
Per utilizzare le funzionalità di visione o audio, assicurati di configurare i backend specializzati durante l'inizializzazione del motore.
let engineConfig = try EngineConfig(
modelPath: "path/to/multimodal_model.litertlm",
backend: .gpu,
visionBackend: .cpu(), // Enable CPU vision executor
audioBackend: .cpu(), // Enable CPU audio executor
cacheDir: NSTemporaryDirectory()
)
let engine = Engine(engineConfig: engineConfig)
try await engine.initialize()
Input immagine (visione)
Fornisci un'immagine come percorso o byte non elaborati:
let imagePath = Bundle.main.path(forResource: "scenery", ofType: "jpg")!
let message = Message(contents: [
Content.imageFile(imagePath),
Content.text("Describe this image.")
])
let response = try await conversation.sendMessage(message)
print(response.toString)
Input audio
Fornisci un percorso audio:
let audioPath = Bundle.main.path(forResource: "recording", ofType: "wav")!
let message = Message(contents: [
Content.audioFile(audioPath),
Content.text("Transcribe this recording.")
])
let response = try await conversation.sendMessage(message)
print(response.toString)
🔴 Novità: previsione di più token (MTP)
La previsione di più token (MTP) è un'ottimizzazione delle prestazioni che accelera notevolmente le velocità di decodifica. È consigliata universalmente per tutte le attività che utilizzano i backend GPU/Metal.
Per utilizzare MTP, attiva la decodifica speculativa nei flag sperimentali prima di inizializzare il motore.
import LiteRTLM
// Opt into experimental APIs to configure MTP
ExperimentalFlags.optIntoExperimentalAPIs()
ExperimentalFlags.enableSpeculativeDecoding = true
let engineConfig = try EngineConfig(
modelPath: "path/to/model.litertlm",
backend: .gpu,
cacheDir: NSTemporaryDirectory()
)
let engine = Engine(engineConfig: engineConfig)
try await engine.initialize()
Definire e utilizzare gli strumenti
Puoi definire le strutture Swift come strumenti che il modello può chiamare automaticamente per eseguire la logica.
- Conformati al protocollo
Tool. - Dichiara i parametri utilizzando il wrapper di proprietà
@ToolParam. - Implementa il metodo
run().
import LiteRTLM
// 1. Define your custom tool
struct GetCurrentWeatherTool: Tool {
static let name = "get_current_weather"
static let description = "Get the current weather for a location."
@ToolParam(description: "The city and state, e.g. San Francisco, CA")
var location: String
@ToolParam(description: "The temperature unit to use (celsius or fahrenheit)")
var unit: String = "celsius"
func run() async throws -> Any {
// Call your weather API here
return [
"location": location,
"temperature": "22",
"unit": unit,
"condition": "sunny"
]
}
}
// 2. Register the tool in your conversation configuration
let config = ConversationConfig(
tools: [GetCurrentWeatherTool()]
)
let conversation = try await engine.createConversation(with: config)
// 3. The model will invoke the tool automatically if needed
let response = try await conversation.sendMessage(Message("What is the weather in Paris right now?"))
print(response.toString)