FM+RAG後日談:埋め込みベクトル化の精度改善

先日、Foundation Models で RAG を試みる内容を登壇したのだが、その時のスライドに添付したソースコードに誤りがあったので、以下ブログ記事に記載していたソースコードを修正した。

もともとはベクトル化対象のテキストを、トークン分割しつつ startIndex から endIndex まで手動で動かしながら畳み込みしていたものを、シンプルに enumerateTokenVectors(in:using:)  を使うようにしたら、↑記事で記載しているイマイチ精度が出ない問題を改善することができた。

以前の実装だと、何らかの条件で文字列最後までループが到達しないことが発生していたようだ。文頭の構文しかヒットしないという現象も、この原因を考えれば納得できる。


そもそも、ここで紹介している NLContextualEmbedding + mean pooling + L2 normalization で埋め込みベクトル化し、コサイン類似度を求める手法は、すでに以下のQiita記事で同じことが解説されていた。今後実装される方はこっちを参考にした方が幸せかもしれない。(もっと早く見つけたかった、、)

iOSに組み込まれたBERTでテキスト埋め込み・ベクトル検索をオンデバイス実行する #Mac – Qiita

MLTensor は行列計算の関数が充実している

SwiftでRAG実装 Part 2:クエリに類似するドキュメント検索の試み で実装していて気がついたのだが、MLTensor の API ドキュメントを眺めると行列計算の関数が充実しることを知って感動した。

MLTensor | Apple Developer Documentation

昔、SCNVector 同士の計算を実装しようとした時、ベクトルという名でありながらベクトル計算の API がまったくなかったので残念に思ったことがあったのでなおさら。

どんな関数があるかというと、行列とスカラの演算はもちろん、行列同士の内積、軸ごとの最大/平均/最小を求めたり、軸に沿って累積積を計算したり、1次元に再配列したり、とキリがない。どんなアウトプットになるのか試してみないとわからないものも多い。

ただ、Core ML のコンテクストで引き回すデータ表現としては MLTensor が相性良いものの、行列演算そのものの高速性を求めるなら、やはり Accelerate framework を使ったほうが良いらしい(ChatGPTによる)。

iPhone 17 Pro を購入した

iPhone 15 Pro から2年振り。今回はカメラ進化が大きく、写真撮影がメインの筆者にとっては買い替えは必須。色はディープブルー、容量は256GB。(iCloudの契約ストレージは5TB、、)

本当はおととい19日に手に入る予定だったが、帰省予定で実家宛に送っており、コロナ罹患が分かった時には配送先が変えられず、実家から転送してもらい受け取れたのが今日だった。

筐体はエッジが丸みを帯びていて、iPhone 15 Pro よりもアールが緩やかで手に馴染み、梨地仕上げのアルミ素材が背面まで回り込んでいるので手触りも優しいため、ケースをつけずに使っていたい気持ちになる。が、近い将来絶対に落とすし、いくら Ceramic Shield 2 とはいえ過度な信頼はできないので、ケースは必ず着ける。

ケースははじめ TechWoven のパープルを予約していたが、後から考え直してシリコンのオレンジを再注文した。商品ページではディープブルーの藍色とオレンジの明るさとの落差がおおきく一度は見送ったのだが、これまでも茶色(トープ)の FineWoven を使っていて、シックな色にも飽きたのが返品理由。あと、シンプルにウーブン系の素材に懲りたというのも、、TechWoven は改良されているに違いないが。

iPhone 17 Pro のディープブルーは、光の当たり方によっては意外と色味鮮やに映るので、オレンジのような彩度高い色との相性も問題ないと感じた。

筐体はディープブルーでありながら、新色コズミックオレンジ感も味わえてお得な組み合わせ。ジェネリック・コズミックオレンジ。

カメラもいくつか撮影して試してみたが、特に8倍の光学(品質の)ズームに関しては、今まで寄れなかった遠くのものまで鮮明に写せるのが嬉しいし、遠景前景との圧縮効果を生み出すこともできるので、これまでの iPhone ではかなわなかった構図を楽しめることが分かった。(8倍は実質4倍の部分拡大なので、「圧縮効果」というと語弊があることは承知、、)

デジタルズーム 40 倍だと、3キロ離れたオフィスビルもここまで映し出せる。

コロナに罹ってしまった

連休明けから喉が痛くて警戒していたが、案の定午後から発熱。翌日病院に行き抗原検査を受けたらあっさりコロナ認定されて頭が真っ白になった。週末が誕生日というのもあり盆休みからずらして5連休にし、帰省の予定を立てたり、いくつか人と会う約束もしていたのだが、、しょうがないので今年の誕生日は悪あがきせず、おとなしく家で過ごすことになった。

さらに不幸なことに、iPhone 17 Pro を日程的に実家で受け取ろうと配送先指定していたのだが、コロナ感染が判明したタイミングで配送先を変更することができなかった。ちなみに同時注文したケースは東京の自宅に届いたのだが、注文翌日に配送先変更したのが間に合わなかったのだろう。もしかすると本体も自宅に届くのではと、一縷の望みを抱きつつ荷物追跡をチェックしていたが、指定通りの実家へと飛び去っていくのをただ見守ることしかできなかった。

そんな今朝、1ヶ月前に注文した、4-way の教則本がようやく届いた。これを誕生日プレゼント代わりにパラパラめくることにする。ちなみに感染後3日経ったが、熱はおさまって身体は多少楽になった一方で、逆にウイルスが気管支に回ったから咳や鼻が徐々にひどくなっているし、全身の痛みも出てきたので、練習はとてもできる状態ではない。

4-way Coordination by Marvin Dahlgren and Elliot Fine

Apple “Awe Dropping” イベント雑感

朝1:45起床。WWDC 25 と同様に、Vision Pro をかぶってリアルタイムに視聴した。

Apple Vision Pro で湖畔越しに

だいたいリーク通りだったので驚きはなかった。しょっぱな AirPods Pro 3 は、イントロビデオのラストを見て、一瞬ブラックモデルが出るのかと思ったが、なかった。でも同じようなことを思った人は他にもいた。

ライブ翻訳機能は Pro 3 に限らず以前の一部モデルでも使えるようになるようだ。近い未来、AirPods 越しに外国語話者と会話するのが当たり前となる時代が来るかもしれない。


iPhone については 17 Pro で今回大幅にカメラアップデートがあったので 15 Pro から買い換え予定。Air も魅力的だったが、カメラ性能を最重視する身としては背に腹が代えられなかった。

iPhone Air と iPhone Pro 17では、「カメラバンプ」内にカメラモジュールだけでなくチップなどあらゆるコンポーネントを詰め込む設計となっているが、これを Apple は “(camera) plateau”(プラトー)と名付けたようだ。この見慣れない単語は「高原・台地」を意味するらしい。iPhone に、Dynamic Island に次ぐ、あらたな地名が誕生した。(ちなみに日本語字幕では「凸部」と訳されていた)そしてこの設計をフォルダブルへの布石と見た。

The new “plateau” / A screenshot from the Apple event

ちなみに、イベント全体を通してもっともテンションが上がったのは、Apple Watch Hermès モデルへの文字盤追加(Faubourg Party)の発表だった。Apple Watch Hermès ユーザーとしては毎度期待するところ。3年前に発表された Luckey Horse 以来の大胆なデザインで、今回も楽しみ。

Hermès Faubourg Party watch face / A screenshot from the Apple event

最後に、今回の夜のお供。

明治マカダミアチョコとオーザック

あっという間に9月到来

ブログにアウトプットできるネタがないので3分の2が過ぎた2025年これまでのことを振り返り。

日記を振り返ると2025年の目標は、ここ数年で積み上げた習慣が結果に結びつくようにし、環境や仕事を言いわけにやり残してきたことをやる年と決めて、こんなことができたら良いなと考えていたようだ。

  • 2024年の転職を機に始めた勉強会参加継続(月5回ペース)
  • これまでしてこなかった勉強会への登壇(理想は年5本)
  • アプリリリース(理想は3つ)
  • ビッグバンドへの参加
  • 楽器毎日練習、毎週どこかしらでセッション参加

実態はこんな感じ、、

👍勉強会参加継続
継続中

👍勉強会登壇
すでに2本、10月に1本予定(理想まであと2本)
登壇メモ:集まれSwift好き!Swift愛好会スピンオフ WWDC25セッション要約会 @ DeNA
登壇メモ:potatotips #92 iOS/Android開発Tips共有会

😭アプリリリース
ひとつもできていない

👍ビッグバンド参加
できた:自分語り:ビッグバンドに入団した話

😑楽器毎日練習、毎週セッション
暑くなって色々さぼりがち

あと4ヶ月、まだ間に合うか、、!?


とはいえ、年始段階ではあまり想定していなかったことができているので、トントンといったところか。

今 Foundation Models で試行錯誤している結果が、冬が来るまでに出せれば良いかなと思っている。そして、せめて1本のアプリリリースに繋げられたら、、
(本当は Vision Pro 使った開発も構想ばかりしているが、手をつけられていない)

あと、せっかく業務での Android 開発にも慣れて来たので、年内何かしら Android で学んできたことを発信できれば。

音楽は、、練習頻度下がりがちだが演奏は褒められることが増えてきたので、効率的に身になる練習ができていると信じたい。先生に 4-way とかルーディメンツ練習しろと言われているので、教本は買い足した(4-Way Coordination)。この辺をルーチン化するようにしたい。

Foundation Models 最新情報(2025/08)

Apple 武石さんが、Foundation Models に関する情報を盛んに共有してくださり興味深々。まさにこれまでの試行錯誤の過程でも課題の中心にいる、トークンウィンドウの上限について tips を共有されていたのが目を引いた。

RAG実装における注意にも言及されており、筆者はありものでラクしようと Core Spotlight を活用しようとしているのだが、ここではトークンウィンドウの制限を正攻法的?にクリアしようというアプローチについて言及されている。

  1. データソースを分割
  2. NLContextualEmbeddingMLTensor
  3. 質問も同様に処理
  4. ベクトルの近いものをピックアップし、FMプロンプトに渡す

NLContextualEmbedding
A model that computes sequences of embedding vectors for natural language utterances.(自然言語の文に対して埋め込みベクトルのシーケンスを計算するモデル。)
NLContextualEmbedding | Apple Developer Documentation

MLTensor
A multi-dimensional array of numerical or Boolean scalars tailored to ML use cases, containing methods to perform transformations and mathematical operations efficiently using a ML compute device.(機械学習(ML)のユースケースに特化した数値またはブール型のスカラーからなる多次元配列で、ML計算デバイスを使用して変換や数学的演算を効率的に実行するためのメソッドを含む。)
MLTensor | Apple Developer Documentation

質問ベクトルと近い上位のチャンクに絞って Foundation Models に渡すということっぽい? RAG をきちんと理解する上でこの辺の知識は抑えてみたい。

このあたりの記事がおおいに参考になりそう。


ちなみに、これも武石さんのポストで知ったのだが、Apple Japan にて Foundation Models に関する対面式のセッションがあるらしい(2025/09/09-11)。これも申し込んでみたので、参加資格を得られたらこのあたりの相談をしてみたい。

OS 26 beta 5 の Foundation Models framework アップデート内容

Foundation Models の開発者からこんな投稿があったのでチェック。


  • ガードレイルに permissiveContentTransformations オプションが追加
    • 要約やスタイル調整といったユースケースにおいて原文にセンシティブなトピックを含む可能性があるケースを想定(政治記事など)
    • 含んでいてもテキスト応答にへ関することを許容し、LanguageModelSession.GenerationError.guardrailViolation エラーを投げないガードレイル設定
    • permissiveContentTransformations | Apple Developer Documentation
  • 新しい「拒否」エラーの追加
  • #Praiground 使用時にフィードバックボタンを追加
    • Xcode 上で直接、モデル動作に関するフィードバックを送信可能に
  • GeneratedContent を透明化(“no longer opaque”
    • GeneratedContent.Kind が追加され、任意の生成コンテンツを表示するビューの構築が可能
    • プリミティブ型、配列、構造化オブジェクトを含む、JSON互換のデータ種類を表す
      • .array([GeneratedContent]), .bool(Bool), .number(Double), .string(String), .structure(properties: [String.: GeneratedContent], orderedKeys: [String]), .null
    • ユーザーが設定可能な生成スキーマの取り扱いに有用
  • 推論スタックの最適化が含まれており、トークンの処理速度が向上

WordPress:テーマをアップデートしたらCSSカスタマイズが消えた

WordPress の 外観>カスタマイズ>追加CSS に書いていたつもりが、一部はサーバー上のCSSを直接上書きしていたっぽく、テーマをアップデートしたらカスタマイズしたはずのデザインが消失してしまった。

また何かあった時のために残しておく。CSS 詳しくないのと、動けばいい程度のノリなので適当。ちなみに今使っているテーマは WordPress が提供する Twenty Sixteen

div.entry-content, aside {
  font-family: Montserrat, "Helvetica Neue", sans-serif;
}

blockquote {
  font-size: 1rem;
}

code {
  background-color: #eeeeee;
  border-radius: 4px;
}

@media screen and (min-width: 61.5625em) {
  body:not(.search-results) article:not(.type-page) img.below-entry-meta,
  body:not(.search-results) article:not(.type-page) figure.below-entry-meta,
  body:not(.search-results) article:not(.type-page) .wp-block-image figcaption.below-entry-meta 
{
  margin-left: auto;
  max-width: 100%;
}

Liquid Glass(物理)を購入した

先日の Recap イベントで、temoki さんによって紹介され界隈をどよめかせた、Liquid Glass もどきのガラスペーパーウェイトをようやく手にすることができた。

Amazon にて購入。実は、このペーパーウェイトが紹介されたLTの間に楽天で注文したのだが、欠品連絡があり、しばらく後に再注文したのだった。

誌面の上にペーパーウェイトを乗せてみた

この写真のとおり、垂直に見下ろすと確かにレンズ効果で湾曲して見えるけれど、それだけだとイマイチ Liquid Glass 感がない。一体何が足りないのかと、ズラしてみたり、敷くもの(コンテンツレイヤー)を文字から写真に替えてみたり、試行錯誤の末ふと仰角を浅く覗いてみたところ、黒い印字が虹のようにスペクトラムに分解されて映ることを発見。これこそが Liquid Glass らしさだと気がついた。

ガラスの境界線付近で、黒文字が虹色に分解されている

このドーム状のペーパーウェイトのように、ガラスが設置面(コンテンツレイヤー)に対し垂直に切立つのでは、こうした視覚効果は生まれない。撥水面に垂らした液体のように断面が湾曲することで、色の分解が生み出されるのではないか、、実物(?)を観察したからこそ得られた発見だった。実際、Liquid Glass のイントロダクションビデオでデザインチームが扱っているガラスオブジェクトも、よく見るとそうした形状をしている。


余談だが、ペーパーウェイトの下敷き(コンテンツレイヤー)になっている雑誌は、Wallpaper 誌が Apple Design team を特集した2022年1月号。WWDC25 の基調講演で Liquid Glass を世に紹介した Alan Dye 氏も、もちろん文章と写真の両方で登場する。

Inside Apple Park: the design team shaping future tech | Wallpaper

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny