FoundationModelsは2025/07現時点でリリース前でありベータ版です。そのため、LLMのレスポンスやスクリーンショットは載せていません。
FoundationModelsは英語だけでなく日本語にも対応しています。日本語のプロンプトには日本語でレスポンスを返し、韓国語のプロンプトには韓国語でレスポンスを返します。
オンデバイスLLM故の非力さからなのか、短文の日本語プロンプトに対して英語や韓国語、中国語でレスポンスを返すことがあります。
FoundationModelsにはレスポンスの言語を指定する直接的なAPIがありません。プロンプト等の入力に合わせて空気を読んでレスポンスの言語が決まるようです。
(※デバイス設定のロケールや言語設定は、FoudationModelsに影響を与えないようです。)
上記ポストのAppleデベロッパリレーションのShun Takeishiさんによると、「特定言語で回答を得たい場合は、InstructionやPrompt、Toolのname、ToolのdescriptionなどのLanguageModelSessionに入力として渡すものを対象言語で記述する」のが良いようですね。
前述のアプローチを採用する多言語対応アプリはLocalizedStringを活用するとスムーズに実装できるそうです。
構造化レスポンスの型宣言について
Takeishiさんは言及されていませんでしたが、構造化レスポンスの型名やプロパティ名もLanguageModelSessionに対する入力として渡されます。
@Generable
struct Novel {
var novelTitle: String
var novelText: String
var author: String
var dateOfPublication: String
}
この場合、「Novel」や「dateOfPublication」という文字列はLanguageModelSessionに対する入力になります。
let session = LanguageModelSession()
novel = try! await session.respond(to: "", generating: Novel.self).content
respondメソッドに渡すプロンプトを空Stringにし、構造化レスポンスにNovel型を指定すると、レスポンスの「novelTitle」や「novelText」は英語になります。
@Generable
struct 小説 {
var 小説の題名: String
var 小説の本文: String
var 作者: String
var 出版日: String
}
一方、型名やプロパティ名を日本語で書くと上記のようになります。
let session = LanguageModelSession()
shousetu = try! await session.respond(to: "", generating: 小説.self).content
respondメソッドに渡すプロンプトを空Stringにし、構造化レスポンスに小説型を指定すると、レスポンスの「小説の題名」や「小説の本文」は日本語になります。
動作確認用コード全体
import SwiftUI
import FoundationModels
struct ContentView: View {
@State var novel: Novel?
@State var shousetu: 小説?
var body: some View {
NavigationStack {
List {
if let novel {
Section {
LabeledContent("novelTitle", value: novel.novelTitle)
LabeledContent("novelText", value: novel.novelText)
LabeledContent("author", value: novel.author)
LabeledContent("dateOfPublication", value: novel.dateOfPublication)
} header: { Text("英語の場合") }
}
if let shousetu {
Section {
LabeledContent("小説の題名", value: shousetu.小説の題名)
LabeledContent("小説の本文", value: shousetu.小説の本文)
LabeledContent("作者", value: shousetu.作者)
LabeledContent("出版日", value: shousetu.出版日)
} header: { Text("日本語の場合") }
}
}
.lineLimit(4)
.navigationTitle("型名やプロパティ名が...")
}
.task {
var session = LanguageModelSession()
self.novel = try! await session.respond(to: "", generating: Novel.self).content
session = LanguageModelSession()
self.shousetu = try! await session.respond(to: "", generating: 小説.self).content
}
}
}
@Generable
struct Novel {
var novelTitle: String
var novelText: String
var author: String
var dateOfPublication: String
}
@Generable
struct 小説 {
var 小説の題名: String
var 小説の本文: String
var 作者: String
var 出版日: String
}
リンク