
-
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…
Hola, soy Erik. Y yo soy Yifei. Y hoy tenemos el privilegio de presentar la nueva estructura Foundation Models. La estructura Foundation Models te da acceso al modelo de lenguaje de gran tamaño en el dispositivo que impulsa Apple Intelligence, con una API Swift cómoda y potente. Está disponible en macOS, iOS, iPadOS y visionOS. Puedes utilizarla para mejorar funcionalidades existentes en tus apps, como ofrecer sugerencias de búsqueda personalizadas. O bien puedes crear funcionalidades completamente nuevas, como generar itinerarios en una app de viajes, todo en el dispositivo. Incluso puedes usarla para crear diálogos sobre la marcha para los personajes de un juego.
Se optimizó para generar contenidos, resumir textos, analizar las entradas de los usuarios y mucho más. Todo esto se ejecuta en el dispositivo, por lo que todos los datos que entran y salen del modelo permanecen privados. Eso también significa que puede funcionar sin conexión. Además, está integrada en el sistema operativo, por lo que no aumentará el tamaño de la app. Es un gran año, así que para ayudarte a aprovechar al máximo la estructura Foundation Models, preparamos una serie de videos. En este primer video, te daremos una descripción general de alto nivel de la estructura en su totalidad. Comenzaremos por los detalles del modelo. A continuación, presentaremos la generación guiada, que permite obtener output estructurado en Swift, y las potentes API de streaming, que convierten la latencia en deleite. También hablaremos de la llamada de herramientas, que permite al modelo ejecutar de forma autónoma el código que definas en tu app. Por último, explicaremos cómo proporcionamos soporte de varios turnos con sesiones con control de estado y cómo integramos perfectamente la estructura en el ecosistema de desarrolladores de Apple. La parte más importante de la estructura, por supuesto, es el modelo que la impulsa. La mejor manera de empezar a crear el modelo es entrar en Xcode. Una parte importante de la creación de modelos de lenguaje de gran tamaño consiste en probar una variedad de prompts para encontrar el que mejor funciona, y la nueva funcionalidad Playgrounds de Xcode es la mejor manera de hacerlo. Con unas pocas líneas de código, puedes empezar inmediatamente a crear el modelo en el dispositivo. Aquí le pediré que genere un título para un viaje a Japón, y el output del modelo aparecerá en el lienzo de la derecha. Ahora, quiero ver si este prompt funciona bien también para otro destino. En un #Playground, puedes acceder a los tipos definidos en tu app, así que crearé un bucle for sobre los puntos de referencia que aparecen en la mía. Ahora Xcode me mostrará la respuesta del modelo para todos los puntos de referencia.
El modelo en el dispositivo que acabamos de usar es un modelo de lenguaje de gran tamaño con 3,000 millones de parámetros, cada uno cuantificado a 2 bits. Es varios órdenes de magnitud superior a cualquier otro modelo que forme parte del sistema operativo.
Pero aun así, es importante tener en cuenta que el modelo en el dispositivo es un modelo a escala del dispositivo. Está optimizado para casos de uso como resúmenes, extracciones, clasificaciones y muchos más. No está diseñado para el conocimiento del mundo o el razonamiento avanzado, que son tareas para las que normalmente se utilizan los LLM a escala de servidor.
Los modelos a escala del dispositivo requieren que las tareas se dividan en partes más pequeñas. A medida que trabajes con el modelo, irás intuyendo sus puntos fuertes y débiles.
Para determinados casos de uso común, como el etiquetado de contenidos, también proporcionamos adaptadores especializados que maximizan la capacidad del modelo en dominios específicos.
También seguiremos mejorando nuestros modelos con el tiempo. Más adelante en este video hablaremos de cómo puedes contarnos cómo usas nuestros modelos, lo que nos ayudará a mejorarlos de la forma que más te interese.
Ahora que ya conocemos el modelo, la primera parada de nuestro viaje es la generación guiada. Gracias a la generación guiada es posible crear funcionalidades como las que acabas de ver, y es el alma de la estructura Foundation Models. Veamos un problema común y hablemos de cómo se resuelve con GuidedGeneration. Por defecto, los modelos de lenguaje producen como output un lenguaje natural no estructurado. Es fácil de leer para las personas, pero difícil de trasladar a las vistas de tu app.
Una solución común es indicar al modelo que produzca algo que sea fácil de analizar, como JSON o CSV.
Sin embargo, esto se convierte rápidamente en un juego inútil. Tienes que agregar instrucciones cada vez más específicas sobre lo que se supone que debe y no debe hacer… A menudo eso no funciona bien… Así que terminas escribiendo alteraciones para extraer y corregir el contenido. Esto no es seguro porque el modelo es probabilístico y existe una probabilidad de errores estructurales superior a cero. GuidedGeneration ofrece una solución fundamental a este problema.
Al importar Foundation Models, se obtiene acceso a dos nuevas macros, @Generable y @Guide. Generable te permite describir un tipo del que quieres que el modelo genere una instancia. Además, Guides te permite proporcionar descripciones en lenguaje natural de las propiedades y controlar mediante programación los valores que se pueden generar para esas propiedades.
Una vez que definas un tipo Generable, puedes hacer que el modelo responda a los prompts generando una instancia de tu tipo. Esto es muy potente. Observa cómo nuestro prompt ya no necesita especificar el formato de output. De eso se encarga la estructura.
La parte más importante, por supuesto, es que ahora obtenemos un objeto Swift enriquecido que podemos trasladar fácilmente a una vista atractiva.
Los tipos generables pueden construirse utilizando primitivas, como cadenas, enteros, dobles, flotantes y decimales, y valores booleanos. Los arrays también son generables. Y los tipos Generable también se pueden componer. Generable incluso admite tipos recursivos, que tienen potentes aplicaciones en dominios como las interfaces de usuario generativas. Lo más importante que hay que entender sobre la generación guiada es que garantiza fundamentalmente la corrección estructural mediante una técnica llamada decodificación restringida. Al utilizar GuidedGeneration, los prompts pueden ser más sencillos y centrarse en el comportamiento deseado en lugar del formato. Además, GuidedGeneration tiende a mejorar la precisión del modelo. Y, al mismo tiempo, nos permite realizar optimizaciones que aceleran la inferencia. Todo esto es posible gracias a la integración cuidadosamente coordinada de los sistemas operativos de Apple, las herramientas para desarrolladores y el entrenamiento de nuestros modelos fundacionales. Todavía hay mucho más que cubrir sobre la generación guiada, como la creación de esquemas dinámicos en tiempo de ejecución, así que echa un vistazo a nuestro video de análisis profundo para obtener más detalles. De este modo concluye GuidedGeneration: vimos cómo el potente sistema de tipos de Swift aumenta los prompts en lenguaje natural para permitir un output estructurado fiable. Nuestro siguiente tema es el streaming, y todo se basa en la macro @Generable que ya conoces. Si trabajaste con modelos de lenguaje de gran tamaño, es posible que sepas que generan texto como grupos breves de caracteres llamados tokens. Por lo general, cuando se hace streaming de output, los tokens se entregan en lo que se llama un delta, pero la estructura Foundation Models en realidad adopta un enfoque diferente, y quiero mostrarte por qué.
A medida que se producen deltas, la responsabilidad de acumularlos suele recaer en el desarrollador. Agregas cada delta a medida que llegan. Y la respuesta crece a medida que lo haces. Pero la cosa se complica cuando el resultado tiene estructura. Si quieres mostrar la cadena de saludo después de cada delta, tienes que analizarla a partir de la acumulación, y eso no es trivial, especialmente para estructuras complicadas. El streaming delta no es la fórmula adecuada cuando se trabaja con output estructurado. Y como ya sabes, el output estructurado es el núcleo de la estructura Foundation Models, por lo que desarrollamos un enfoque diferente. En lugar de deltas sin procesar, transmitimos instantáneas.
A medida que el modelo produce deltas, la estructura los transforma en instantáneas. Las instantáneas representan respuestas generadas parcialmente. Las propiedades son todas opcionales. Se van rellenando a medida que el modelo produce más respuestas. Las instantáneas son una representación práctica y eficaz del streaming de output estructurado.
Ya conoces la macro @Generable, y resulta que también es de donde salen las definiciones de los tipos parcialmente generados. Si expandes la macro, descubrirás que produce un tipo llamado PartiallyGenerated. Se trata de un espejo de la estructura exterior, con la diferencia de que todas las propiedades son opcionales.
El tipo parcialmente generado entra en juego cuando invocas el método streamResponse en tu sesión.
streamResponse genera una secuencia asíncrona. Los elementos de esa secuencia son instancias de un tipo parcialmente generado. Cada elemento de la secuencia contendrá una instantánea actualizada.
Estas instantáneas funcionan muy bien con estructuras declarativas como SwiftUI. En primer lugar, crea un estado que contenga un tipo parcialmente generado. A continuación, solo tienes que iterar sobre un stream de respuesta, almacenar sus elementos y ver cómo la interfaz de usuario cobra vida.
Para terminar, repasemos algunas de las prácticas recomendadas para el streaming.
Primero, sé creativo con las animaciones y transiciones de SwiftUI para ocultar la latencia. Tienes la oportunidad de convertir un momento de espera en uno de deleite. Segundo, tendrás que considerar cuidadosamente la identidad de las vistas en SwiftUI, especialmente cuando generes arrays. Por último, ten en cuenta que las propiedades se generan en el orden en que se declaran en tu estructura de Swift. Esto es importante tanto para las animaciones como para la calidad del output del modelo. Por ejemplo, es posible que descubras que el modelo produce los mejores resúmenes cuando son la última propiedad de la estructura.
Hay mucho que analizar aquí, por lo que asegúrate de ver nuestro video sobre la integración de Foundation Models en apps con SwiftUI para obtener más detalles. Con esto concluimos el streaming con Foundation Models. A continuación, Yifei te contará todo sobre la llamada de herramientas. ¡Gracias, Erik! La llamada de herramientas es otra de nuestras funcionalidades clave. Permite que el modelo ejecute el código que definas en tu app. Esta funcionalidad es especialmente importante para aprovechar al máximo nuestro modelo, ya que la llamada de herramientas dota al modelo de muchas capacidades adicionales. Permite al modelo identificar que una tarea puede requerir información o acciones adicionales y tomar decisiones de forma autónoma sobre qué herramienta utilizar y cuándo, siempre que sea difícil decidirlo programáticamente. La información que proporcionas al modelo puede ser conocimiento del mundo, acontecimientos recientes o datos personales. Por ejemplo, en nuestra app de viajes, proporciona información sobre varios lugares desde MapKit. Esto también permite al modelo citar fuentes de información veraz, lo que elimina las alucinaciones y permite comprobar el output del modelo. Por último, permite que el modelo realice acciones reales, ya sea en la app, en el sistema o en el mundo real. Integrar varias fuentes de información en la app es una estrategia eficaz para crear experiencias atractivas. Ahora que ya sabes por qué la llamada de herramientas es muy útil, veamos cómo funciona. A la izquierda tenemos una transcripción que refleja todo lo que ha sucedido hasta ahora. Si proporcionaste herramientas a la sesión, esta las presentará al modelo junto con las instrucciones. A continuación viene el prompt, donde le indicamos al modelo qué destino queremos visitar. Ahora bien, si el modelo considera que la llamada de una herramienta puede mejorar la respuesta, producirá una o varias llamadas de herramientas. En este ejemplo, el modelo produce dos llamadas de herramientas: consulta de restaurantes y hoteles. En esta fase, la estructura Foundation Models llamará automáticamente al código que escribiste para estas herramientas. A continuación, la estructura inserta automáticamente el output de la herramienta en la transcripción. Por último, el modelo incorporará el output de la herramienta junto con todo lo demás de la transcripción para proporcionar la respuesta final.
Ahora que ya tenemos una idea general de la llamada de herramientas, definamos una herramienta.
Aquí estamos definiendo una simple herramienta meteorológica, que se ajusta al protocolo Tool. La herramienta meteorológica se convirtió de hecho en el primer programa a crear de las llamadas de herramientas, y es una buena manera de empezar.
El protocolo requiere en primer lugar que se especifique un nombre y una descripción en lenguaje natural de la herramienta.
La estructura los proporcionará automáticamente al modelo para ayudarlo a comprender cuándo debe llamar a la herramienta.
Cuando el modelo llame a tu herramienta, ejecutará el método de llamada que definas.
El argumento del método de llamada puede ser de cualquier tipo Generable.
La razón por la que tus argumentos deben ser generables es porque la llamada de herramientas se basa en la generación guiada para garantizar que el modelo nunca producirá nombres de herramientas o argumentos no válidos. Después de definir el tipo de argumentos, ya puedes escribir lo que quieras en el cuerpo de tu método. Aquí estamos usando CoreLocation y WeatherKit para encontrar la temperatura de una ciudad determinada. El output se representa utilizando el tipo ToolOutput, que puede crearse a partir de GeneratedContent para representar datos estructurados. O a partir de una cadena si el output de la herramienta es lenguaje natural. Ahora que definimos una herramienta, debemos asegurarnos de que el modelo tenga acceso. Para ello, introduce la herramienta en el inicializador de sesión. Las herramientas deben adjuntarse en la inicialización de la sesión y estarán disponibles para el modelo durante toda la duración de la sesión.
Después de crear una sesión con herramientas, solo tienes que crear el modelo como lo harías normalmente. Las llamadas de herramientas se producirán de forma transparente y autónoma, y el modelo incorporará los outputs de las herramientas a su respuesta final. Los ejemplos que acabo de mostrar ilustran cómo definir herramientas de tipo seguro durante la compilación, lo que es ideal para la gran mayoría de los casos de uso. Las herramientas también pueden ser dinámicas en todos los sentidos. Por ejemplo, puedes definir los argumentos y comportamientos de una herramienta en tiempo de ejecución utilizando esquemas de generación dinámicos. Si tienes curiosidad al respecto, no dudes en echar un vistazo a nuestro video de análisis profundo para obtener más información. Concluimos la llamada de herramientas. Aprendimos por qué es útil llamar a las herramientas y cómo aplicarlas para ampliar las capacidades del modelo. A continuación, hablemos de las sesiones con control de estado. Ya viste muchas veces la palabra sesión en este video. La estructura Foundation Models se basa en la noción de sesión con control de estado. Por defecto, cuando se crea una sesión, se solicita el modelo de propósito general en el dispositivo. Y puede proporcionar instrucciones personalizadas. Las instrucciones son una oportunidad para indicarle al modelo cuál es su papel y orientarlo sobre cómo debe responder. Por ejemplo, puedes especificar cosas como el estilo y la verbosidad. Recuerda que proporcionar instrucciones personalizadas es opcional, y que se utilizarán instrucciones predeterminadas razonables si no especificas ninguna.
Si decides proporcionar instrucciones personalizadas, es importante que entiendas la diferencia entre instrucciones y prompts. Las instrucciones deben venir de ti, el desarrollador, mientras que los prompts pueden venir del usuario. Esto se debe a que el modelo está entrenado para obedecer instrucciones en lugar de prompts. Esto ayuda a proteger contra ataques de inyección de prompt, pero no es una solución infalible. Por regla general, las instrucciones son en su mayoría estáticas, y es mejor no interpolar en ellas entradas de usuario que no sean de confianza. Este es un repaso básico sobre cómo formular las instrucciones y los prompts de la mejor manera posible. Para descubrir aún más prácticas recomendadas, consulta nuestro video sobre diseño y seguridad de los prompts. Ahora que ya inicializaste una sesión, vamos a hablar de las interacciones de varios turnos. Al usar los métodos respond o streamResponse de los que hablamos antes, cada interacción con el modelo se conserva como contexto en una transcripción, de modo que el modelo podrá referirse a interacciones pasadas de varios turnos y comprenderlas dentro de una misma sesión. Por ejemplo, aquí el modelo es capaz de entender cuando decimos “haz otro”, que nos estamos refiriendo a escribir un haiku.
Y la propiedad transcript del objeto de sesión te permitirá inspeccionar interacciones anteriores o dibujar vistas de interfaz de usuario para representarlas.
Una cosa más importante a saber es que mientras el modelo está produciendo output, la propiedad isResponding se convertirá en true. Es posible que tengas que observar esta propiedad y asegurarte de no enviar otro prompt hasta que el modelo termine de responder. Más allá del modelo por defecto, también ofrecemos casos de uso especializados incorporados adicionales que están respaldados por adaptadores. Si encuentras un caso de uso incorporado que se ajuste a tus necesidades, puedes pasarlo al inicializador de SystemLanguageModel. Para saber qué casos de uso incorporados están disponibles y cómo aprovecharlos mejor, consulta nuestra documentación en el sitio web para desarrolladores. Un adaptador especializado del que quiero hablar más hoy es el adaptador de etiquetado de contenidos. El adaptador de etiquetado de contenidos ofrece soportes de primera clase para la generación de etiquetas, la extracción de entidades y la detección de temas. Por defecto, el adaptador está preparado para emitir etiquetas de temas y se integra con la generación guiada desde el primer momento. Por lo tanto, puedes simplemente definir una estructura con nuestra macro Generable, y pasar el input del usuario para extraer temas de ella.
Pero aún hay más. Al proporcionarle instrucciones personalizadas y un tipo de output Generable personalizado, incluso puedes usarlo para detectar cosas como acciones y emociones. Antes de crear una sesión, también debes comprobar la disponibilidad, ya que el modelo solo puede ejecutarse en dispositivos compatibles con Apple Intelligence en las regiones admitidas. Para comprobar si el modelo está disponible actualmente, puedes acceder a la propiedad availability de SystemLanguageModel.
La disponibilidad es un enum de dos casos que está disponible o no disponible. Si no está disponible, también recibirás un motivo para que puedas ajustar tu interfaz en consecuencia.
Por último, es posible que se produzcan errores al llamar al modelo. Estos errores pueden incluir una infracción de las normas de seguridad, idioma no admitido o ventana de contexto superada. Para ofrecer la mejor experiencia de usuario, debes abordarlos adecuadamente, y obtendrás más información en el video de análisis profundo. Es todo para las sesiones con control de estado de varios turnos. Aprendimos a crear una sesión y a utilizarla, así como la forma en que nuestro modelo realiza un seguimiento de tu contexto. Ahora que ya conoces todas las funcionalidades interesantes de la estructura, hablemos de las herramientas y la experiencia del desarrollador. Para empezar, puedes abrir cualquier archivo Swift de tu proyecto y usar la nueva macro playground para crear el modelo.
Los playgrounds son potentes porque te permiten iterar rápidamente sobre tus prompt sin tener que volver a compilar y ejecutar toda la app. En un playground, tu código puede acceder a todos los tipos de tu proyecto, como los tipos generables que ya están potenciando tu interfaz de usuario.
A continuación, sabemos que cuando se trata de crear experiencias de app basadas en modelos de lenguaje de gran tamaño, es importante comprender toda la latencia que hay detrás, ya que los modelos de lenguaje de gran tamaño tardan más en ejecutarse que los modelos de aprendizaje automático tradicionales. Entender dónde se produce la latencia puede ayudarte a ajustar la verbosidad de tus prompts, o a determinar cuándo llamar a API útiles, como el precalentamiento.
Y nuestra nueva plantilla de perfiles de app de Instruments se creó exactamente para eso. Puedes perfilar la latencia de una solicitud de modelo, observar las áreas de optimización y cuantificar las mejoras.
Ahora, mientras desarrollas tu app, puedes tener comentarios que nos ayuden a mejorar nuestros modelos y nuestras API.
Te animamos a que nos envíes tus comentarios a través de Feedback Assistant. Incluso proporcionamos una estructura de datos codificable para adjuntar comentarios que puedes adjuntar como archivo a tus comentarios.
Por último, si eres un profesional de aprendizaje automático con un caso de uso muy especializado y un conjunto de datos personalizado, también puedes entrenar tus adaptadores personalizados utilizando nuestro kit de herramientas de entrenamiento de adaptadores. Pero ten en cuenta que esto conlleva importantes responsabilidades, ya que tienes que volver a entrenarlo a medida que Apple mejora el modelo con el tiempo. Para más información, visita el sitio web para desarrolladores. Ahora que ya conoces muchas de las funcionalidades de la nueva estructura Foundation Models, no podemos esperar a ver todas las cosas increíbles que vas a construir con ella. Para descubrir aún más sobre cómo integrar la IA generativa en tu app, cómo funcionan tecnologías como la generación guiada y cómo crear los mejores prompts, tenemos toda una serie de videos y artículos maravillosos para ti. Muchas gracias por acompañarnos hoy. ¡Feliz generación!
-
-
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.