huggingface/AnyLanguageModel

An API-compatible, drop-in replacement for Apple's Foundation Models framework with support for custom language model providers.

AnyLanguageModel – 다양한 LLM 백엔드에 대한 Swift 중심 추상화

무엇인가요

  • Apple의 FoundationModels 임포트를 대체하는 Swift 패키지로, Apple, Core ML, MLX, llama.cpp, Ollama, Anthropic, OpenAI, Gemini 등 다양한 LLM 제공업체에 대해 통합된 API를 제공합니다.
  • 단지 import FoundationModelsimport AnyLanguageModel로 변경하고 나머지 코드는 그대로 사용할 수 있습니다.

핵심 개념

  • LanguageModelSession – 모델 인스턴스와 선택적 도구(모델이 호출할 수 있는 함수) 목록을 보유하는 객체입니다. 모든 상호작용은 session.respond { … }를 통해 이루어집니다.
  • 가이드된 생성@Generable@Guide 프로퍼티 래퍼를 사용하여 모델이 원시 텍스트를 파싱하는 대신 강력한 타입의 Swift 구조체를 생성하도록 요청할 수 있습니다.
  • 도구 호출Tool을 준수하는 타입(예: 날씨 조회)을 정의하고 모델이 언제 호출할지 결정하게 합니다. ToolExecutionDelegate를 통해 각 호출을 관찰하거나 승인할 수 있습니다.
  • 트레이트 – Swift Package Manager의 트레이트를 사용하여 필요에 따라 무거운 백엔드(CoreML, MLX, Llama)만 선택적으로 활성화할 수 있습니다. 이로 인해 바이너리 크기가 작아집니다.

지원하는 제공업체 (README의 체크박스는 구현된 것을 나타냅니다)

  • Apple Foundation Models (iOS 26/macOS 26+에서 시스템 모델)
  • Core ML (온디바이스 .mlmodelc 파일)
  • MLX (Apple Silicon 가속 모델, mlx-swift를 통해)
  • llama.cpp (GGUF 양자화 모델)
  • Ollama HTTP API (로컬 또는 원격 Ollama 서버)
  • Anthropic Messages API
  • Google Gemini API
  • OpenAI Chat Completions & Responses API
  • Open Responses (OpenAI 응답 형식과 호환되는 모든 엔드포인트)

설치

// Package.swift
dependencies: [
    .package(url: "https://github.com/huggingface/AnyLanguageModel", from: "0.11.0")
]

특정 백엔드가 필요할 경우 해당 트레이트를 활성화합니다:

.package(
    url: "https://github.com/huggingface/AnyLanguageModel",
    from: "0.11.0",
    traits: ["CoreML", "MLX"]
)

트레이트를 사용할 경우, 하위 패키지(CoreML → huggingface/swift-transformers, MLX → ml-explore/mlx-swift-lm, Llama → mattt/llama.swift)도 추가해야 합니다. README에는 트레이트를 직접 선언할 수 없는 프로젝트를 위한 전체 Xcode 쉘 워크플로우가 제공됩니다.

일반적인 사용 예시

import AnyLanguageModel

let model = SystemLanguageModel.default          // 또는 CoreMLLanguageModel(...), MLXLanguageModel(...), 등
let session = LanguageModelSession(model: model)

// 간단한 프롬프트
let resp = try await session.respond { Prompt("양자 컴퓨팅을 한 문장으로 설명해 주세요") }
print(resp.content)

가이드된 생성 예시

@Generable(description: "고양이의 기본 프로필 정보")
struct CatProfile {
    var name: String
    @Guide(description: "고양이의 나이", .range(0...20))
    var age: Int
    @Guide(description: "한 문장의 성격 설명")
    var profile: String
}

let profile = try await session.respond(
    to: "귀여운 구조 고양이의 프로필을 생성해 주세요",
    generating: CatProfile.self
).content

모델은 CatProfile 인스턴스를 직접 반환합니다.

도구 호출

struct WeatherTool: Tool {
    let name = "getWeather"
    let description = "도시의 최신 날씨 정보를 가져옵니다"

    @Generable
    struct Arguments { @Guide var city: String }

    func call(arguments: Arguments) async throws -> String {
        "The weather in \(arguments.city) is sunny and 72°F"
    }
}

let session = LanguageModelSession(model: model, tools: [WeatherTool()])
let answer = try await session.respond { Prompt("Cupertino의 날씨는 어때요?") }
print(answer.content)

데리게이트를 연결하여 도구 호출을 감시하거나 승인할 수 있습니다.

이미지 입력 많은 클라우드 제공업체(OpenAI, Anthropic, Gemini, Open Responses)와 일부 로컬 백엔드(MLX, Ollama)는 이미지를 지원합니다:

let resp = try await session.respond(
    to: "보이는 것을 설명해 주세요",
    images: [.init(url: URL(string: "https://example.com/photo.jpg")!)]
)

README의 표에는 어떤 제공업체가 이미지를 지원하는지 나와 있습니다.

보안 가이드라인 README는 API 키를 하드코딩하지 말 것을 강조합니다. 두 가지 프로덕션 패턴이 권장됩니다:

  1. Bring-Your-Own-Key – 사용자가 제공한 키를 시스템 Keychain에 저장하고, 직접 제공업체에 전송합니다.
  2. 프록시 서버 – 제공업체 키를 당신이 제어하는 백엔드에 보관하고, 앱에 일시적인 토큰을 공개한 후 요청을 전달합니다. 두 가지 접근 방식에 대한 장단점이 설명되어 있습니다.

왜 이 라이브러리를 사용해야 할까

  • 한 번 작성하면 어디서나 실행 가능: 동일한 Swift 코드가 온디바이스(Core ML, MLX, llama.cpp)와 클라우드(OpenAI, Anthropic, Gemini, Ollama)에서 모두 작동합니다.
  • 가이드된 생성을 통한 강력한 타입 출력은 취약한 문자열 파싱을 줄입니다.
  • 내장된 도구 호출 지원으로 에이전트 스타일 앱(날씨 조회, 데이터 검색, 사용자 정의 코드 실행 등)을 구축할 수 있습니다.
  • 트레이트 기반 종속성 관리로 최종 앱의 크기를 작게 유지할 수 있습니다.

현재 제한 사항

  • Apple Foundation Models는 iOS/macOS 26가 필요하며, 작성 시점에서는 미래의 OS 버전입니다.
  • llama.cpp는 도구 호출을 지원하지 않습니다.
  • v0.11에서 빌드 시간 문제로 LiteRT 백엔드가 제거되었습니다.

더 배우기

  • README는 Apple의 Guided Generation 문서, 다양한 제공업체 API, 샘플 Xcode 앱(chat-ui-swift)에 대한 링크를 제공합니다.
  • 이슈 #15와 #135는 알려진 Xcode/SwiftPM 버그와 대안에 대해 논의하고 있습니다.

결론: AnyLanguageModel은 다양한 언어 모델 제공업체를 추상화하고, 일급 도구 호출 및 타입 기반 생성을 추가하며, Swift Package Manager 트레이트를 사용해 바이너리 크기를 작게 유지하는 진정한 프로덕션 준비된 Swift 라이브러리입니다. 온디바이스 및 클라우드 LLM에 통일된 API를 원하는 iOS/macOS/visionOS 개발자를 위한 것입니다.

관련

  • Dispatch
  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트