LiteRT-LM Swift API

API LiteRT-LM на языке Swift позволяет интегрировать большие языковые модели непосредственно в приложения iOS и macOS . Полностью поддерживаются такие функции, как многомодальность , использование инструментов и ускорение GPU (через Metal).

Введение

Вот пример использования Swift API для инициализации модели и отправки сообщения:

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)

Начиная

В этом разделе приведены инструкции по интеграции API LiteRT-LM Swift в ваше приложение.

Swift Package Manager (SPM)

Вы можете интегрировать LiteRT-LM в свой проект Xcode, используя Swift Package Manager.

  1. Откройте свой проект в Xcode и перейдите в меню File > Add Package Dependencies...
  2. Введите URL-адрес репозитория пакета: https://github.com/google-ai-edge/LiteRT-LM
  3. Выберите библиотеку LiteRTLM , чтобы добавить её в целевую среду вашего приложения.

Если вы разрабатываете пакет с использованием Package.swift , добавьте его в ваши зависимости:

dependencies: [
  .package(url: "https://github.com/google-ai-edge/LiteRT-LM", from: "0.12.0")
]

Руководство по основному API

В этом разделе подробно описаны основные компоненты и рабочие процессы использования API LiteRT-LM Swift, включая инициализацию движка, управление диалогами и отправку сообщений.

Инициализация движка

Engine отвечает за загрузку моделей, распределение ресурсов и управление жизненным циклом.

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()

Начать разговор

В Conversation управляется история чата, системные инструкции и настройки сэмплера.

// 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)

Отправить сообщения

Взаимодействовать с моделью можно синхронно или асинхронно (потоковая передача).

Синхронный пример

let response = try await conversation.sendMessage(Message("Hello!"))
print(response.toString)

Пример асинхронной (потоковой) передачи

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()

Мультимодальность

Для использования функций обработки изображений или звука обязательно настройте специализированные бэкэнды во время инициализации движка.

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()

Ввод изображения (зрение)

Укажите изображение в виде пути или в виде необработанных байтов:

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)

Аудиовход

Укажите путь к аудиофайлу:

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)

🔴 Новинка: Многотокенное прогнозирование (MTP)

Многотокенное предсказание (MTP) — это оптимизация производительности, которая значительно ускоряет скорость декодирования. Она повсеместно рекомендуется для всех задач, использующих бэкенды GPU/Metal.

Для использования MTP необходимо включить спекулятивное декодирование в экспериментальных флагах перед инициализацией движка.

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()

Определение и использование инструментов

Структуры Swift можно определить как инструменты, которые модель может автоматически вызывать для выполнения логики.

  1. Соответствуйте протоколу Tool .
  2. Объявляйте параметры, используя обертку свойства @ToolParam .
  3. Реализуйте метод 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)