0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【iOS 26】FoundationModelsのレスポンスを日本語にする方法

Last updated at Posted at 2025-07-21

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
}

リンク

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?