API Swift LiteRT-LM

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.

  1. Apri il progetto in Xcode e vai a File > Add Package Dependencies... (File > Aggiungi dipendenze pacchetto).
  2. Inserisci l'URL del repository del pacchetto: https://github.com/google-ai-edge/LiteRT-LM
  3. 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.

  1. Conformati al protocollo Tool.
  2. Dichiara i parametri utilizzando il wrapper di proprietà @ToolParam.
  3. 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)