-
Conoce la estructura Foundation Models
Descubre cómo aprovechar el modelo de lenguaje de gran tamaño en el dispositivo detrás de Apple Intelligence. Esta descripción general de alto nivel abarca todo, desde la generación guiada para crear estructuras de datos Swift y transmisión para experiencias receptivas, hasta la llamada a herramientas para integrar fuentes de datos y sesiones para la administración del contexto. Esta sesión no tiene prerrequisitos.
Capítulos
- 0:00 - Introducción
- 2:05 - El modelo
- 5:20 - Generación guiada
- 7:45 - Transmisión de instantáneas
- 11:28 - Llamada de herramientas
- 16:11 - Sesión con control de estado
- 21:02 - Experiencia del desarrollador
Recursos
Videos relacionados
WWDC25
- Codificación conjunta: Incorpora la IA en el dispositivo a tu app mediante la estructura Foundation Models
- Descubre las estructuras de aprendizaje automático e IA en las plataformas de Apple
- Explora el diseño rápido y la seguridad para los modelos base en el dispositivo
- Profundización en la estructura Foundation Models
-
Buscar este video…
-
-
2:28 - Playground - Trip to Japan
import FoundationModels import Playgrounds #Playground { let session = LanguageModelSession() let response = try await session.respond(to: "What's a good name for a trip to Japan? Respond only with a title") } -
2:43 - Playground - Loop over landmarks
import FoundationModels import Playgrounds #Playground { let session = LanguageModelSession() for landmark in ModelData.shared.landmarks { let response = try await session.respond(to: "What's a good name for a trip to \(landmark.name)? Respond only with a title") } } -
5:32 - Creating a Generable struct
// Creating a Generable struct @Generable struct SearchSuggestions { @Guide(description: "A list of suggested search terms", .count(4)) var searchTerms: [String] } -
5:51 - Responding with a Generable type
// Responding with a Generable type let prompt = """ Generate a list of suggested search terms for an app about visiting famous landmarks. """ let response = try await session.respond( to: prompt, generating: SearchSuggestions.self ) print(response.content) -
6:18 - Composing Generable types
// Composing Generable types @Generable struct Itinerary { var destination: String var days: Int var budget: Float var rating: Double var requiresVisa: Bool var activities: [String] var emergencyContact: Person var relatedItineraries: [Itinerary] } -
9:20 - PartiallyGenerated types
// PartiallyGenerated types @Generable struct Itinerary { var name: String var days: [Day] } -
9:40 - Streaming partial generations
// Streaming partial generations let stream = session.streamResponse( to: "Craft a 3-day itinerary to Mt. Fuji.", generating: Itinerary.self ) for try await partial in stream { print(partial) } -
10:05 - Streaming itinerary view
struct ItineraryView: View { let session: LanguageModelSession let dayCount: Int let landmarkName: String @State private var itinerary: Itinerary.PartiallyGenerated? var body: some View { //... Button("Start") { Task { do { let prompt = """ Generate a \(dayCount) itinerary \ to \(landmarkName). """ let stream = session.streamResponse( to: prompt, generating: Itinerary.self ) for try await partial in stream { self.itinerary = partial } } catch { print(error) } } } } } -
11:00 - Property order matters
@Generable struct Itinerary { @Guide(description: "Plans for each day") var days: [DayPlan] @Guide(description: "A brief summary of plans") var summary: String } -
13:42 - Defining a tool
// Defining a tool import WeatherKit import CoreLocation import FoundationModels struct GetWeatherTool: Tool { let name = "getWeather" let description = "Retrieve the latest weather information for a city" @Generable struct Arguments { @Guide(description: "The city to fetch the weather for") var city: String } func call(arguments: Arguments) async throws -> ToolOutput { let places = try await CLGeocoder().geocodeAddressString(arguments.city) let weather = try await WeatherService.shared.weather(for: places.first!.location!) let temperature = weather.currentWeather.temperature.value let content = GeneratedContent(properties: ["temperature": temperature]) let output = ToolOutput(content) // Or if your tool’s output is natural language: // let output = ToolOutput("\(arguments.city)'s temperature is \(temperature) degrees.") return output } } -
15:03 - Attaching tools to a session
// Attaching tools to a session let session = LanguageModelSession( tools: [GetWeatherTool()], instructions: "Help the user with weather forecasts." ) let response = try await session.respond( to: "What is the temperature in Cupertino?" ) print(response.content) // It’s 71˚F in Cupertino! -
16:30 - Supplying custom instructions
// Supplying custom instructions let session = LanguageModelSession( instructions: """ You are a helpful assistant who always \ responds in rhyme. """ ) -
17:46 - Multi-turn interactions
// Multi-turn interactions let session = LanguageModelSession() let firstHaiku = try await session.respond(to: "Write a haiku about fishing") print(firstHaiku.content) // Silent waters gleam, // Casting lines in morning mist— // Hope in every cast. let secondHaiku = try await session.respond(to: "Do another one about golf") print(secondHaiku.content) // Silent morning dew, // Caddies guide with gentle words— // Paths of patience tread. print(session.transcript) // (Prompt) Write a haiku about fishing // (Response) Silent waters gleam... // (Prompt) Do another one about golf // (Response) Silent morning dew... -
18:22 - Gate on isResponding
import SwiftUI import FoundationModels struct HaikuView: View { @State private var session = LanguageModelSession() @State private var haiku: String? var body: some View { if let haiku { Text(haiku) } Button("Go!") { Task { haiku = try await session.respond( to: "Write a haiku about something you haven't yet" ).content } } // Gate on `isResponding` .disabled(session.isResponding) } } -
18:39 - Using a built-in use case
// Using a built-in use case let session = LanguageModelSession( model: SystemLanguageModel(useCase: .contentTagging) ) -
19:19 - Content tagging use case - 1
// Content tagging use case @Generable struct Result { let topics: [String] } let session = LanguageModelSession(model: SystemLanguageModel(useCase: .contentTagging)) let response = try await session.respond(to: ..., generating: Result.self) -
19:35 - Content tagging use case - 2
// Content tagging use case @Generable struct Top3ActionEmotionResult { @Guide(.maximumCount(3)) let actions: [String] @Guide(.maximumCount(3)) let emotions: [String] } let session = LanguageModelSession( model: SystemLanguageModel(useCase: .contentTagging), instructions: "Tag the 3 most important actions and emotions in the given input text." ) let response = try await session.respond(to: ..., generating: Top3ActionEmotionResult.self) -
19:56 - Availability checking
// Availability checking struct AvailabilityExample: View { private let model = SystemLanguageModel.default var body: some View { switch model.availability { case .available: Text("Model is available").foregroundStyle(.green) case .unavailable(let reason): Text("Model is unavailable").foregroundStyle(.red) Text("Reason: \(reason)") } } } -
22:13 - Encodable feedback attachment data structure
let feedback = LanguageModelFeedbackAttachment( input: [ // ... ], output: [ // ... ], sentiment: .negative, issues: [ LanguageModelFeedbackAttachment.Issue( category: .incorrect, explanation: "..." ) ], desiredOutputExamples: [ [ // ... ] ] ) let data = try JSONEncoder().encode(feedback)
-
-
- 0:00 - Introducción
El marco de modelos fundacionales te da acceso a un modelo de lenguaje de gran tamaño en el dispositivo para macOS, iOS, iPadOS y visionOS. Te permite crear funcionalidades personalizadas e innovadoras, como sugerencias de búsqueda, itinerarios y diálogos dentro del juego, priorizando la privacidad del usuario, ya que los datos permanecen en el dispositivo y funcionan sin conexión. Está optimizado para la generación de contenido, el resumen de texto y el análisis de entradas del usuario. Para ayudar a los desarrolladores, Apple preparó una serie de videos que abarcan un resumen del marco, la generación guiada, las API de transmisión, la llamada de herramientas, el soporte de varios turnos y la integración fluida en el ecosistema.
- 2:05 - El modelo
La nueva funcionalidad Playgrounds de Xcode es el punto de partida ideal para experimentar con el modelo de lenguaje de gran tamaño en el dispositivo. Con solo unas líneas de código, puedes probar prompts y ver las respuestas del modelo en tiempo real. Aunque este modelo en el dispositivo es impresionante, con 3 mil millones de parámetros, está optimizado para tareas específicas, como resúmenes, extracciones y clasificaciones, y no es adecuado para el conocimiento general ni para el razonamiento avanzado. Divide las tareas en partes más pequeñas para maximizar su eficacia. La generación guiada, un componente central de la estructura FoundationModels, aborda el reto de integrar la salida del modelo en las apps. Esto permite crear funcionalidades de forma más confiable, ya que proporciona un enfoque estructurado para la generación de modelos, evitando así las limitaciones de depender del modelo para producir formatos fácilmente analizables, como JSON o CSV.
- 5:20 - Generación guiada
Con la importación de FoundationModels, se introducen dos nuevas macros, @Generable y @Guide. @Generable permite describir tipos de instancias generadas por el modelo, que pueden construirse a partir de primitivas, matrices y tipos compuestos o recursivos. @Guide proporciona descripciones en lenguaje natural de las propiedades y controla los valores generados, lo que garantiza la corrección estructural a través de una decodificación restringida. Este enfoque de generación guiada simplifica las prompts, mejora la precisión del modelo y acelera la inferencia. Esto permite recibir objetos Swift enriquecidos desde el modelo, que pueden asignarse fácilmente a vistas atractivas, todo sin necesidad de especificar el formato de salida en la prompt.
- 7:45 - Transmisión de instantáneas
La estructura FoundationModels se diferencia de la transmisión delta basada en tokens tradicional para modelos de lenguaje de gran tamaño. En su lugar, transmite instantáneas de respuestas parcialmente generadas con propiedades opcionales, que son más sólidas y convenientes para procesar una salida estructurada. Este enfoque aprovecha la macro @Generable, que produce un tipo PartiallyGenerated, reflejando la estructura externa con propiedades opcionales. El método streamResponse genera una secuencia asincrónica de estos tipos generados parcialmente, lo que permite una integración perfecta con estructuras declarativas como SwiftUI. Usa animaciones y transiciones de SwiftUI para mejorar la experiencia del usuario durante la transmisión. La consideración adecuada de la identidad de la vista y el orden de declaración de propiedad también es crucial para obtener resultados óptimos.
- 11:28 - Llamada de herramientas
La llamada a herramientas permite que un modelo de IA ejecute códigos personalizados dentro de una app, mejorando sus capacidades. Esta funcionalidad permite al modelo decidir de forma autónoma cuándo usar herramientas externas para obtener información o realizar acciones, como consultar restaurantes, hoteles o datos del clima, según el contexto de la solicitud. El modelo puede integrarse en varias fuentes de información veraz, como MapKit, para proporcionar información precisa y actualizada. Este proceso implica llamadas a herramientas de generación de modelos, que luego la estructura FoundationModels ejecuta automáticamente, y los resultados se insertan nuevamente en la transcripción de la conversación con el fin de que el modelo los use para formular su respuesta final.
- 16:11 - Sesión con control de estado
El marco de modelos fundacionales permite crear sesiones con control de estado, con un modelo de propósito general en el dispositivo. Puedes dar instrucciones personalizadas para guiar las respuestas, especificando el estilo y la verbosidad, aunque esto es opcional. Estableces tus instrucciones, que son distintas de las prompts del usuario, y el modelo obedece las instrucciones en lugar de las prompts para mejorar la seguridad. Dentro de una sesión, el modelo conserva el contexto en interacciones de varios turnos, lo que permite comprender y consultar prompts y respuestas anteriores. Con la propiedad de transcripción se pueden inspeccionar estas interacciones. La estructura también ofrece casos de uso especializados integrados, como el adaptador de etiquetado de contenido, que admite la generación de etiquetas, la extracción de entidades y la detección de temas. Personaliza estos adaptadores para necesidades específicas. Antes de crear una sesión, comprueba la disponibilidad del modelo, ya que solo puede ejecutarse en dispositivos compatibles con Apple Intelligence en las regiones admitidas. El manejo adecuado de errores también es esencial para administrar posibles problemas de seguridad, idiomas no compatibles o ventanas de contexto excedidas.
- 21:02 - Experiencia del desarrollador
Playgrounds permite la iteración rápida de prompts para modelos de lenguaje de gran tamaño dentro de un proyecto de app, lo que te permite acceder a todos los tipos de proyectos. La nueva plantilla de creación de perfiles de la app Instruments ayuda a optimizar la latencia al identificar áreas de mejora en las solicitudes de modelos y la verbosidad de las prompts. Te invitamos a enviarnos tus comentarios a través de Feedback Assistant.