-
Conheça o framework Foundation Models
Saiba como usar o LLM (grande modelo de linguagem) diretamente no dispositivo que viabiliza a Apple Intelligence. Esta visão geral aborda tudo, desde a geração guiada para criar estruturas de dados em Swift e streaming para experiências responsivas até a chamada de ferramentas para integração de fontes de dados e sessões para gerenciamento de contexto. Esta sessão não tem pré-requisitos.
Capítulos
- 0:00 - Introdução
- 2:05 - O modelo
- 5:20 - Geração guiada
- 7:45 - Streaming de snapshots
- 11:28 - Chamada de ferramentas
- 16:11 - Sessão stateful
- 21:02 - Experiência do desenvolvedor
Recursos
Vídeos relacionados
WWDC25
-
Buscar neste vídeo...
-
-
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 - Introdução
O framework Foundation Models oferece acesso a um LLM (grande modelo de linguagem) diretamente nos dispositivos macOS, iOS, iPadOS e visionOS. Ele permite criar recursos personalizados e inovadores, como sugestões de busca, roteiros e diálogos dentro de jogos, mantendo a privacidade do usuário, já que os dados permanecem no dispositivo e o modelo pode pode funcionar offline. O framework é otimizado para geração de conteúdo, resumo de textos e análise de entradas do usuário. Para auxiliar os desenvolvedores, a Apple preparou uma série de vídeos que abordam a visão geral do framework, geração guiada, APIs de streaming, chamada de ferramentas, suporte a múltiplas interações e integração perfeita com o ecossistema de desenvolvedores da Apple.
- 2:05 - O modelo
O novo recurso Playgrounds do Xcode é a forma ideal para experimentar prompts com o LLM (grande modelo de linguagem) diretamente no dispositivo. Com apenas algumas linhas de código, você pode testar prompts e ver as respostas do modelo em tempo real. O modelo no dispositivo, embora conte com 3 bilhões de parâmetros, é otimizado para tarefas específicas como resumo, extração e classificação, e não é adequado para conhecimento geral ou raciocínio avançado. Divida tarefas complexas em partes menores para maximizar sua eficácia. A Geração Guiada, um componente central do framework Foundation Models, aborda o desafio de integrar a saída do modelo nos apps. Ela permite criar recursos de maneira mais confiável, fornecendo uma abordagem estruturada para a geração do modelo, superando as limitações de depender do modelo para produzir formatos facilmente interpretáveis, como JSON ou CSV.
- 5:20 - Geração guiada
Com a importação dos Foundation Models, são introduzidas duas novas macros: @Generable e @Guide. '@Generable' permite descrever tipos para instâncias geradas pelo modelo, que podem ser construídas de tipos primitivos, matrizes ou tipos compostos ou recursivos. '@Guide' fornece descrições em linguagem natural das propriedades e controla os valores gerados, garantindo a correção estrutural por meio de decodificação restrita. Essa abordagem de Geração Guiada simplifica os prompts, melhora a precisão do modelo e acelera a inferência. Ela permite receber objetos Swift detalhados diretamente do modelo, que podem ser mapeados para visualizações atraentes, tudo sem necessidade de especificar o formato de saída no prompt.
- 7:45 - Streaming de snapshots
O framework Foundation Models difere do streaming delta tradicional baseado em tokens para LLMs (grandes modelos de linguagem). Em vez disso, ele transmite snapshots, respostas parcialmente geradas com propriedades opcionais, que são mais robustos e convenientes para lidar com saídas estruturadas. Essa abordagem utiliza a macro '@Generable', que gera um tipo 'PartiallyGenerated' espelhando a estrutura externa com propriedades opcionais. O método 'streamResponse' retorna uma sequência assíncrona desses tipos parcialmente gerados, permitindo integração com frameworks declarativos como o SwiftUI. Use animações e transições do SwiftUI para melhorar a experiência durante o streaming. Além disso, é fundamental considerar a identidade das visualizações e a ordem de declaração das propriedades para obter resultados ideais.
- 11:28 - Chamada de ferramentas
A chamada de ferramentas permite que um modelo de IA execute código personalizado dentro de um app. Esse recurso possibilita que o modelo decida autonomamente quando usar ferramentas externas para obter informações ou executar ações, como consultar restaurantes, hotéis ou dados meteorológicos, com base no contexto da solicitação do usuário. O modelo pode se integrar a diversas fontes confiáveis, como o MapKit, para fornecer informações precisas e atualizadas. Nesse processo, o modelo gera chamadas de ferramentas, que são executadas automaticamente pelo framework Foundation Models, e os resultados são inseridos de volta na transcrição da conversa, permitindo que o modelo os utilize na formulação da resposta final.
- 16:11 - Sessão stateful
O framework Foundation Models permite sessões stateful utilizando um modelo de propósito geral no dispositivo. É possível fornecer instruções personalizadas para guiar as respostas do modelo, especificando estilo e nível de detalhamento, embora isso seja opcional. Essas instruções funcionam de forma independente dos prompts do usuário, e o modelo é treinado para segui-las em vez dos prompts, garantindo maior segurança. Durante uma sessão, o modelo preserva o contexto ao longo de interações de múltiplas etapas, permitindo que compreenda e faça referência a prompts e respostas anteriores. A propriedade transcript pode ser usada para inspecionar essas interações. O framework também oferece casos de uso, como o adaptador de marcação de conteúdo, que oferece suporte à geração de tags, extração de entidades e detecção de tópicos. É possível personalizar esses adaptadores para atender a necessidades específicas. Antes de criar uma sessão, verifique a disponibilidade do modelo, pois ele só pode ser executado em dispositivos compatíveis com a Apple Intelligence e em regiões com suporte. É fundamental implementar tratamento de erros adequado para lidar com possíveis problemas como violações de proteções, idiomas sem suporte ou estouro do limite de contexto.
- 21:02 - Experiência do desenvolvedor
Os Playgrounds permitem a rápida iteração de prompts para LLMs (grandes modelos de linguagem) dentro de um projeto, permitindo o acesso a todos os tipos de projeto. O novo modelo de profiling do Instruments ajuda a otimizar a latência, identificando áreas de melhoria nas solicitações ao modelo e na verbosidade dos prompts. Recomenda-se enviar comentários por meio do Assistente de Feedback.